Skip to content

Commit ad1622a

Browse files
committed
Avoid hang in stdio_set_chars_available_callback
The function is setting the callback after enabing interrupts which can cause a hang if a receive character is already pending. Smilarly we also have to clear the callback pointer only after the interrupt is disabled. Fixes #2009
1 parent 5032223 commit ad1622a

File tree

1 file changed

+4
-2
lines changed

1 file changed

+4
-2
lines changed

src/rp2_common/pico_stdio_uart/stdio_uart.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -172,16 +172,18 @@ static void on_uart_rx(void) {
172172
static void stdio_uart_set_chars_available_callback(void (*fn)(void*), void *param) {
173173
uint irq_num = UART_IRQ_NUM(uart_instance);
174174
if (fn && !chars_available_callback) {
175+
chars_available_callback = fn;
176+
chars_available_param = param;
175177
irq_set_exclusive_handler(irq_num, on_uart_rx);
176178
irq_set_enabled(irq_num, true);
177179
uart_set_irqs_enabled(uart_instance, true, false);
178180
} else if (!fn && chars_available_callback) {
179181
uart_set_irqs_enabled(uart_instance, false, false);
180182
irq_set_enabled(irq_num, false);
181183
irq_remove_handler(irq_num, on_uart_rx);
184+
chars_available_callback = NULL;
185+
chars_available_param = NULL;
182186
}
183-
chars_available_callback = fn;
184-
chars_available_param = param;
185187
}
186188
#endif
187189

0 commit comments

Comments
 (0)