Skip to content

uart: fix wdt input overrun #4536

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Mar 21, 2018
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 20 additions & 1 deletion cores/esp8266/uart.c
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
#include "esp8266_peri.h"
#include "user_interface.h"

uint8_t uart_overrun = 0;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe it would be better to put this flag inside the uart struct. Given that the uart struct is opaque, also add an api to check/clear it.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

static int s_uart_debug_nr = UART0;

struct uart_rx_buffer_ {
Expand Down Expand Up @@ -102,13 +103,32 @@ inline size_t uart_rx_fifo_available(uart_t* uart) {
return (USS(uart->uart_nr) >> USRXC) & 0x7F;
}

char overrun_str [] ICACHE_RODATA_ATTR STORE_ATTR = "uart input full!\r\n";

// Copy all the rx fifo bytes that fit into the rx buffer
inline void uart_rx_copy_fifo_to_buffer(uart_t* uart) {
while(uart_rx_fifo_available(uart)){
size_t nextPos = (uart->rx_buffer->wpos + 1) % uart->rx_buffer->size;
if(nextPos == uart->rx_buffer->rpos) {

if (uart_overrun == 0)
{
uart_overrun = 1;
os_printf_plus(overrun_str);
}

// a choice has to be made here,
// do we discard newest or oldest data?
#if 0
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm ok with either option here.

// discard newest data
// Stop copying if rx buffer is full
USF(uart->uart_nr);
break;
#else
// discard oldest data
if (++uart->rx_buffer->rpos == uart->rx_buffer->size)
uart->rx_buffer->rpos = 0;
#endif
}
uint8_t data = USF(uart->uart_nr);
uart->rx_buffer->buffer[uart->rx_buffer->wpos] = data;
Expand Down Expand Up @@ -195,7 +215,6 @@ void uart_stop_isr(uart_t* uart)
ETS_UART_INTR_ATTACH(NULL, NULL);
}


void uart_write_char(uart_t* uart, char c)
{
if(uart == NULL || !uart->tx_enabled) {
Expand Down
1 change: 1 addition & 0 deletions cores/esp8266/uart.h
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,7 @@ extern "C" {

struct uart_;
typedef struct uart_ uart_t;
extern uint8_t uart_overrun; // 1=>detected, can be set to 2 once action taken, or 0 to redetect

uart_t* uart_init(int uart_nr, int baudrate, int config, int mode, int tx_pin, size_t rx_size);
void uart_uninit(uart_t* uart);
Expand Down