avoid task queue overrun for serial input (#1540)

Thank you.
This commit is contained in:
Arnim Läuger 2016-10-18 03:56:38 +02:00 committed by Philip Gladstone
parent f9533ed85a
commit 020afdcf33
3 changed files with 18 additions and 7 deletions

View File

@ -30,6 +30,8 @@
// For event signalling // For event signalling
static task_handle_t sig = 0; static task_handle_t sig = 0;
static uint8 *sig_flag;
static uint8 isr_flag = 0;
// UartDev is defined and initialized in rom code. // UartDev is defined and initialized in rom code.
extern UartDevice UartDev; extern UartDevice UartDev;
@ -277,8 +279,12 @@ uart0_rx_intr_handler(void *para)
got_input = true; got_input = true;
} }
if (got_input && sig) if (got_input && sig) {
task_post_low (sig, false); if (isr_flag == *sig_flag) {
isr_flag ^= 0x01;
task_post_low (sig, 0x8000 | isr_flag << 14 | false);
}
}
} }
static void static void
@ -316,14 +322,15 @@ uart_stop_autobaud()
* Description : user interface for init uart * Description : user interface for init uart
* Parameters : UartBautRate uart0_br - uart0 bautrate * Parameters : UartBautRate uart0_br - uart0 bautrate
* UartBautRate uart1_br - uart1 bautrate * UartBautRate uart1_br - uart1 bautrate
* uint8 task_prio - task priority to signal on input
* os_signal_t sig_input - signal to post * os_signal_t sig_input - signal to post
* uint8 *flag_input - flag of consumer task
* Returns : NONE * Returns : NONE
*******************************************************************************/ *******************************************************************************/
void ICACHE_FLASH_ATTR void ICACHE_FLASH_ATTR
uart_init(UartBautRate uart0_br, UartBautRate uart1_br, os_signal_t sig_input) uart_init(UartBautRate uart0_br, UartBautRate uart1_br, os_signal_t sig_input, uint8 *flag_input)
{ {
sig = sig_input; sig = sig_input;
sig_flag = flag_input;
// rom use 74880 baut_rate, here reinitialize // rom use 74880 baut_rate, here reinitialize
UartDev.baut_rate = uart0_br; UartDev.baut_rate = uart0_br;

View File

@ -101,7 +101,7 @@ typedef struct {
int buff_uart_no; //indicate which uart use tx/rx buffer int buff_uart_no; //indicate which uart use tx/rx buffer
} UartDevice; } UartDevice;
void uart_init(UartBautRate uart0_br, UartBautRate uart1_br, os_signal_t sig_input); void uart_init(UartBautRate uart0_br, UartBautRate uart1_br, os_signal_t sig_input, uint8 *flag_input);
void uart0_alt(uint8 on); void uart0_alt(uint8 on);
void uart0_sendStr(const char *str); void uart0_sendStr(const char *str);
void uart0_putc(const char c); void uart0_putc(const char c);

View File

@ -30,6 +30,7 @@
#endif #endif
static task_handle_t input_sig; static task_handle_t input_sig;
static uint8 input_sig_flag = 0;
/* Contents of esp_init_data_default.bin */ /* Contents of esp_init_data_default.bin */
extern const uint32_t init_data[]; extern const uint32_t init_data[];
@ -100,7 +101,10 @@ static void start_lua(task_param_t param, uint8 priority) {
static void handle_input(task_param_t flag, uint8 priority) { static void handle_input(task_param_t flag, uint8 priority) {
(void)priority; (void)priority;
lua_handle_input (flag); if (flag & 0x8000) {
input_sig_flag = flag & 0x4000 ? 1 : 0;
}
lua_handle_input (flag & 0x01);
} }
bool user_process_input(bool force) { bool user_process_input(bool force) {
@ -231,7 +235,7 @@ void user_init(void)
UartBautRate br = BIT_RATE_DEFAULT; UartBautRate br = BIT_RATE_DEFAULT;
input_sig = task_get_id(handle_input); input_sig = task_get_id(handle_input);
uart_init (br, br, input_sig); uart_init (br, br, input_sig, &input_sig_flag);
#ifndef NODE_DEBUG #ifndef NODE_DEBUG
system_set_os_print(0); system_set_os_print(0);