@@ -85,7 +85,10 @@ static void IRAM_ATTR _uart_isr(void *arg)
85
85
uart -> dev -> int_clr .rxfifo_tout = 1 ;
86
86
while (uart -> dev -> status .rxfifo_cnt || (uart -> dev -> mem_rx_status .wr_addr != uart -> dev -> mem_rx_status .rd_addr )) {
87
87
c = uart -> dev -> fifo .rw_byte ;
88
- if (uart -> queue != NULL ) {
88
+ if (arg != NULL ){ // Check if an interrupt handler function has been specified
89
+ // Fully optimized code would not create the queue anymore if an function has been specified as an argument.
90
+ (* ((void (* * )())arg ))(c ); // There is, call it with c as an parameter. Don't pass it to the queue anymore
91
+ }else if (uart -> queue != NULL ) {
89
92
xQueueSendFromISR (uart -> queue , & c , & xHigherPriorityTaskWoken );
90
93
}
91
94
}
@@ -96,7 +99,7 @@ static void IRAM_ATTR _uart_isr(void *arg)
96
99
}
97
100
}
98
101
99
- void uartEnableInterrupt (uart_t * uart )
102
+ void uartEnableInterrupt (uart_t * uart , void * func )
100
103
{
101
104
UART_MUTEX_LOCK ();
102
105
uart -> dev -> conf1 .rxfifo_full_thrhd = 112 ;
@@ -107,7 +110,7 @@ void uartEnableInterrupt(uart_t* uart)
107
110
uart -> dev -> int_ena .rxfifo_tout = 1 ;
108
111
uart -> dev -> int_clr .val = 0xffffffff ;
109
112
110
- esp_intr_alloc (UART_INTR_SOURCE (uart -> num ), (int )ESP_INTR_FLAG_IRAM , _uart_isr , NULL , & uart -> intr_handle );
113
+ esp_intr_alloc (UART_INTR_SOURCE (uart -> num ), (int )ESP_INTR_FLAG_IRAM , _uart_isr , func , & uart -> intr_handle );
111
114
UART_MUTEX_UNLOCK ();
112
115
}
113
116
@@ -148,7 +151,7 @@ void uartAttachRx(uart_t* uart, uint8_t rxPin, bool inverted)
148
151
}
149
152
pinMode (rxPin , INPUT );
150
153
pinMatrixInAttach (rxPin , UART_RXD_IDX (uart -> num ), inverted );
151
- uartEnableInterrupt (uart );
154
+ uartEnableInterrupt (uart , NULL ); // No interrupt handler function by default
152
155
}
153
156
154
157
void uartAttachTx (uart_t * uart , uint8_t txPin , bool inverted )
0 commit comments