mirror of
https://github.com/raspberrypi/pico-sdk.git
synced 2025-12-10 07:14:36 +01:00
Avoid hang in stdio_set_chars_available_callback (#2020)
The function is setting the callback after enabing the interrupt which can cause a hang if a receive character is already pending. Similarly we also have to clear the callback pointer only after the interrupt is disabled. Fixes #2009
This commit is contained in:
parent
1aa049f14b
commit
4196f2c17e
1 changed files with 4 additions and 2 deletions
|
|
@ -172,6 +172,8 @@ static void on_uart_rx(void) {
|
|||
static void stdio_uart_set_chars_available_callback(void (*fn)(void*), void *param) {
|
||||
uint irq_num = UART_IRQ_NUM(uart_instance);
|
||||
if (fn && !chars_available_callback) {
|
||||
chars_available_callback = fn;
|
||||
chars_available_param = param;
|
||||
irq_set_exclusive_handler(irq_num, on_uart_rx);
|
||||
irq_set_enabled(irq_num, true);
|
||||
uart_set_irqs_enabled(uart_instance, true, false);
|
||||
|
|
@ -179,9 +181,9 @@ static void stdio_uart_set_chars_available_callback(void (*fn)(void*), void *par
|
|||
uart_set_irqs_enabled(uart_instance, false, false);
|
||||
irq_set_enabled(irq_num, false);
|
||||
irq_remove_handler(irq_num, on_uart_rx);
|
||||
chars_available_callback = NULL;
|
||||
chars_available_param = NULL;
|
||||
}
|
||||
chars_available_callback = fn;
|
||||
chars_available_param = param;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue