]> git.friedersdorff.com Git - max/tmk_keyboard.git/commitdiff
core: Avoid deadlock when uart.c is used in ISR
authortmk <hasu@tmk-kbd.com>
Thu, 2 May 2019 11:57:48 +0000 (20:57 +0900)
committertmk <hasu@tmk-kbd.com>
Mon, 6 May 2019 15:07:19 +0000 (00:07 +0900)
tmk_core/common/avr/uart.c

index d9d42390230be79192e175511c6fb98fc664b7ef..0fec705f9e3b230b5992c4eeb1e11618ef4140c9 100644 (file)
@@ -66,7 +66,7 @@
 
 // These buffers may be any size from 2 to 256 bytes.
 #define RX_BUFFER_SIZE 64
-#define TX_BUFFER_SIZE 40
+#define TX_BUFFER_SIZE 256
 
 static volatile uint8_t tx_buffer[TX_BUFFER_SIZE];
 static volatile uint8_t tx_buffer_head;
@@ -95,6 +95,8 @@ void uart_putchar(uint8_t c)
 
        i = tx_buffer_head + 1;
        if (i >= TX_BUFFER_SIZE) i = 0;
+       // return immediately to avoid deadlock when interrupt is disabled(called from ISR)
+       if (tx_buffer_tail == i && (SREG & (1<<SREG_I)) == 0) return;
        while (tx_buffer_tail == i) ; // wait until space in buffer
        //cli();
        tx_buffer[i] = c;