Browse Source

avoid task queue overrun for serial input (#1540)

Thank you.
Arnim Läuger 7 years ago
parent
commit
020afdcf33
3 changed files with 18 additions and 7 deletions
  1. 11 4
      app/driver/uart.c
  2. 1 1
      app/include/driver/uart.h
  3. 6 2
      app/user/user_main.c

+ 11 - 4
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;

+ 1 - 1
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);

+ 6 - 2
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);