Skip to content

Commit

Permalink
CLI - prevent serial overflow (betaflight#14251)
Browse files Browse the repository at this point in the history
use serialWriteBufBlocking for cli, busy-waiting if TX buffer is full
  • Loading branch information
ledvinap authored Feb 11, 2025
1 parent d63726f commit b96c0b6
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 1 deletion.
2 changes: 1 addition & 1 deletion src/main/cli/cli.c
Original file line number Diff line number Diff line change
Expand Up @@ -6896,7 +6896,7 @@ void cliEnter(serialPort_t *serialPort, bool interactive)
setPrintfSerialPort(cliPort);
}

bufWriterInit(&cliWriterDesc, cliWriteBuffer, sizeof(cliWriteBuffer), (bufWrite_t)serialWriteBufShim, serialPort);
bufWriterInit(&cliWriterDesc, cliWriteBuffer, sizeof(cliWriteBuffer), (bufWrite_t)serialWriteBufBlockingShim, serialPort);
cliErrorWriter = cliWriter = &cliWriterDesc;

if (interactive) {
Expand Down
12 changes: 12 additions & 0 deletions src/main/drivers/serial.c
Original file line number Diff line number Diff line change
Expand Up @@ -129,8 +129,20 @@ void serialWriteBuf(serialPort_t *instance, const uint8_t *data, int count)
serialEndWrite(instance);
}

void serialWriteBufBlocking(serialPort_t *instance, const uint8_t *data, int count)
{
while (serialTxBytesFree(instance) < (uint32_t)count) /* NOP */;
serialWriteBuf(instance, data, count);
}

void serialWriteBufShim(void *instance, const uint8_t *data, int count)
{
serialWriteBuf((serialPort_t *)instance, data, count);
}

void serialWriteBufBlockingShim(void *instance, const uint8_t *data, int count)
{
serialWriteBufBlocking(instance, data, count);
}


1 change: 1 addition & 0 deletions src/main/drivers/serial.h
Original file line number Diff line number Diff line change
Expand Up @@ -150,5 +150,6 @@ uint32_t serialGetBaudRate(serialPort_t *instance);

// A shim that adapts the bufWriter API to the serialWriteBuf() API.
void serialWriteBufShim(void *instance, const uint8_t *data, int count);
void serialWriteBufBlockingShim(void *instance, const uint8_t *data, int count);
void serialBeginWrite(serialPort_t *instance);
void serialEndWrite(serialPort_t *instance);

0 comments on commit b96c0b6

Please sign in to comment.