From dfc161ed95675f75d1666aae71bd91a3c7435300 Mon Sep 17 00:00:00 2001 From: devsaurus Date: Fri, 14 Oct 2016 22:40:15 +0200 Subject: [PATCH] avoid task queue overrun for serial input --- app/driver/uart.c | 15 +++++++++++---- app/include/driver/uart.h | 2 +- app/user/user_main.c | 8 ++++++-- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/app/driver/uart.c b/app/driver/uart.c index 56676499ff..39969b45e5 100755 --- a/app/driver/uart.c +++ b/app/driver/uart.c @@ -30,6 +30,8 @@ // For event signalling static task_handle_t sig = 0; +static uint8 *sig_flag; +static uint8 isr_flag = 0; // UartDev is defined and initialized in rom code. extern UartDevice UartDev; @@ -277,8 +279,12 @@ uart0_rx_intr_handler(void *para) got_input = true; } - if (got_input && sig) - task_post_low (sig, false); + if (got_input && sig) { + if (isr_flag == *sig_flag) { + isr_flag ^= 0x01; + task_post_low (sig, 0x8000 | isr_flag << 14 | false); + } + } } static void @@ -316,14 +322,15 @@ uart_stop_autobaud() * Description : user interface for init uart * Parameters : UartBautRate uart0_br - uart0 bautrate * UartBautRate uart1_br - uart1 bautrate - * uint8 task_prio - task priority to signal on input * os_signal_t sig_input - signal to post + * uint8 *flag_input - flag of consumer task * Returns : NONE *******************************************************************************/ 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_flag = flag_input; // rom use 74880 baut_rate, here reinitialize UartDev.baut_rate = uart0_br; diff --git a/app/include/driver/uart.h b/app/include/driver/uart.h index f9eada983f..e4007e1c30 100755 --- a/app/include/driver/uart.h +++ b/app/include/driver/uart.h @@ -101,7 +101,7 @@ typedef struct { int buff_uart_no; //indicate which uart use tx/rx buffer } 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_sendStr(const char *str); void uart0_putc(const char c); diff --git a/app/user/user_main.c b/app/user/user_main.c index 55259b2c47..73637871df 100644 --- a/app/user/user_main.c +++ b/app/user/user_main.c @@ -30,6 +30,7 @@ #endif static task_handle_t input_sig; +static uint8 input_sig_flag = 0; /* Contents of esp_init_data_default.bin */ 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) { (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) { @@ -231,7 +235,7 @@ void user_init(void) UartBautRate br = BIT_RATE_DEFAULT; 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 system_set_os_print(0);