Add hidden Serial overflow debug options
This commit is contained in:
		| @@ -72,6 +72,14 @@ | ||||
|     uint8_t rx_dropped_bytes = 0; | ||||
|   #endif | ||||
|  | ||||
|   #if ENABLED(SERIAL_STATS_RX_BUFFER_OVERRUNS) | ||||
|     uint8_t rx_buffer_overruns = 0; | ||||
|   #endif | ||||
|  | ||||
|   #if ENABLED(SERIAL_STATS_RX_FRAMING_ERRORS) | ||||
|     uint8_t rx_framing_errors = 0; | ||||
|   #endif | ||||
|  | ||||
|   #if ENABLED(SERIAL_STATS_MAX_RX_QUEUED) | ||||
|     ring_buffer_pos_t rx_max_enqueued = 0; | ||||
|   #endif | ||||
| @@ -99,6 +107,19 @@ | ||||
|     // Get the next element | ||||
|     ring_buffer_pos_t i = (ring_buffer_pos_t)(h + 1) & (ring_buffer_pos_t)(RX_BUFFER_SIZE - 1); | ||||
|  | ||||
|     // This must read the M_UCSRxA register before reading the received byte to detect error causes | ||||
|     #if ENABLED(SERIAL_STATS_DROPPED_RX) | ||||
|       if (TEST(M_UCSRxA, M_DORx) && !++rx_dropped_bytes) --rx_dropped_bytes; | ||||
|     #endif | ||||
|  | ||||
|     #if ENABLED(SERIAL_STATS_RX_BUFFER_OVERRUNS) | ||||
|       if (TEST(M_UCSRxA, M_DORx) && !++rx_buffer_overruns) --rx_buffer_overruns; | ||||
|     #endif | ||||
|  | ||||
|     #if ENABLED(SERIAL_STATS_RX_FRAMING_ERRORS) | ||||
|       if (TEST(M_UCSRxA, M_FEx) && !++rx_framing_errors) --rx_framing_errors; | ||||
|     #endif | ||||
|  | ||||
|     // Read the character from the USART | ||||
|     uint8_t c = M_UDRx; | ||||
|  | ||||
|   | ||||
| @@ -62,6 +62,9 @@ | ||||
| #define M_TXCx             SERIAL_REGNAME(TXC,SERIAL_PORT,) | ||||
| #define M_RXCIEx           SERIAL_REGNAME(RXCIE,SERIAL_PORT,) | ||||
| #define M_UDREx            SERIAL_REGNAME(UDRE,SERIAL_PORT,) | ||||
| #define M_FEx              SERIAL_REGNAME(FE,SERIAL_PORT,) | ||||
| #define M_DORx             SERIAL_REGNAME(DOR,SERIAL_PORT,) | ||||
| #define M_UPEx             SERIAL_REGNAME(UPE,SERIAL_PORT,) | ||||
| #define M_UDRIEx           SERIAL_REGNAME(UDRIE,SERIAL_PORT,) | ||||
| #define M_UDRx             SERIAL_REGNAME(UDR,SERIAL_PORT,) | ||||
| #define M_UBRRxH           SERIAL_REGNAME(UBRR,SERIAL_PORT,H) | ||||
| @@ -91,6 +94,14 @@ | ||||
|     extern uint8_t rx_dropped_bytes; | ||||
|   #endif | ||||
|  | ||||
|   #if ENABLED(SERIAL_STATS_RX_BUFFER_OVERRUNS) | ||||
|     extern uint8_t rx_buffer_overruns; | ||||
|   #endif | ||||
|  | ||||
|   #if ENABLED(SERIAL_STATS_RX_FRAMING_ERRORS) | ||||
|     extern uint8_t rx_framing_errors; | ||||
|   #endif | ||||
|  | ||||
|   #if ENABLED(SERIAL_STATS_MAX_RX_QUEUED) | ||||
|     extern ring_buffer_pos_t rx_max_enqueued; | ||||
|   #endif | ||||
| @@ -112,6 +123,14 @@ | ||||
|         FORCE_INLINE static uint32_t dropped() { return rx_dropped_bytes; } | ||||
|       #endif | ||||
|  | ||||
|       #if ENABLED(SERIAL_STATS_RX_BUFFER_OVERRUNS) | ||||
|         FORCE_INLINE static uint32_t buffer_overruns() { return rx_buffer_overruns; } | ||||
|       #endif | ||||
|  | ||||
|       #if ENABLED(SERIAL_STATS_RX_FRAMING_ERRORS) | ||||
|         FORCE_INLINE static uint32_t framing_errors() { return rx_framing_errors; } | ||||
|       #endif | ||||
|  | ||||
|       #if ENABLED(SERIAL_STATS_MAX_RX_QUEUED) | ||||
|         FORCE_INLINE static ring_buffer_pos_t rxMaxEnqueued() { return rx_max_enqueued; } | ||||
|       #endif | ||||
|   | ||||
| @@ -98,6 +98,14 @@ | ||||
|     uint8_t rx_dropped_bytes = 0; | ||||
|   #endif | ||||
|  | ||||
|   #if ENABLED(SERIAL_STATS_RX_BUFFER_OVERRUNS) | ||||
|     uint8_t rx_buffer_overruns = 0; | ||||
|   #endif | ||||
|  | ||||
|   #if ENABLED(SERIAL_STATS_RX_FRAMING_ERRORS) | ||||
|     uint8_t rx_framing_errors = 0; | ||||
|   #endif | ||||
|  | ||||
|   #if ENABLED(SERIAL_STATS_MAX_RX_QUEUED) | ||||
|     ring_buffer_pos_t rx_max_enqueued = 0; | ||||
|   #endif | ||||
| @@ -308,6 +316,19 @@ | ||||
|  | ||||
|     // Acknowledge errors | ||||
|     if ((status & UART_SR_OVRE) || (status & UART_SR_FRAME)) { | ||||
|  | ||||
|       #if ENABLED(SERIAL_STATS_DROPPED_RX) | ||||
|         if (status & UART_SR_OVRE && !++rx_dropped_bytes) --rx_dropped_bytes; | ||||
|       #endif | ||||
|  | ||||
|       #if ENABLED(SERIAL_STATS_RX_BUFFER_OVERRUNS) | ||||
|         if (status & UART_SR_OVRE && !++rx_buffer_overruns) --rx_buffer_overruns; | ||||
|       #endif | ||||
|  | ||||
|       #if ENABLED(SERIAL_STATS_RX_FRAMING_ERRORS) | ||||
|         if (status & UART_SR_FRAME && !++rx_framing_errors) --rx_framing_errors; | ||||
|       #endif | ||||
|  | ||||
|       // TODO: error reporting outside ISR | ||||
|       HWUART->UART_CR = UART_CR_RSTSTA; | ||||
|     } | ||||
|   | ||||
| @@ -70,6 +70,14 @@ | ||||
|   extern uint8_t rx_dropped_bytes; | ||||
| #endif | ||||
|  | ||||
| #if ENABLED(SERIAL_STATS_RX_BUFFER_OVERRUNS) | ||||
|   extern uint8_t rx_buffer_overruns; | ||||
| #endif | ||||
|  | ||||
| #if ENABLED(SERIAL_STATS_RX_FRAMING_ERRORS) | ||||
|   extern uint8_t rx_framing_errors; | ||||
| #endif | ||||
|  | ||||
| #if ENABLED(SERIAL_STATS_MAX_RX_QUEUED) | ||||
|   extern ring_buffer_pos_t rx_max_enqueued; | ||||
| #endif | ||||
| @@ -91,6 +99,14 @@ public: | ||||
|     FORCE_INLINE static uint32_t dropped() { return rx_dropped_bytes; } | ||||
|   #endif | ||||
|  | ||||
|   #if ENABLED(SERIAL_STATS_RX_BUFFER_OVERRUNS) | ||||
|     FORCE_INLINE static uint32_t buffer_overruns() { return rx_buffer_overruns; } | ||||
|   #endif | ||||
|  | ||||
|   #if ENABLED(SERIAL_STATS_RX_FRAMING_ERRORS) | ||||
|     FORCE_INLINE static uint32_t framing_errors() { return rx_framing_errors; } | ||||
|   #endif | ||||
|  | ||||
|   #if ENABLED(SERIAL_STATS_MAX_RX_QUEUED) | ||||
|     FORCE_INLINE static ring_buffer_pos_t rxMaxEnqueued() { return rx_max_enqueued; } | ||||
|   #endif | ||||
|   | ||||
		Reference in New Issue
	
	Block a user