mirror of
https://github.com/betaflight/betaflight.git
synced 2025-07-15 04:15:44 +03:00
Refactor USB serial ring buffer code
This commit is contained in:
parent
8b258bc2ad
commit
a3a3b74fd5
4 changed files with 97 additions and 139 deletions
|
@ -183,7 +183,7 @@ static serialPort_t *cliPort = NULL;
|
|||
|
||||
static bufWriter_t *cliWriter = NULL;
|
||||
static bufWriter_t *cliErrorWriter = NULL;
|
||||
static uint8_t cliWriteBuffer[sizeof(*cliWriter) + CLI_OUT_BUFFER_SIZE];
|
||||
static uint8_t cliWriteBuffer[sizeof(bufWriter_t) + CLI_OUT_BUFFER_SIZE];
|
||||
|
||||
static char cliBuffer[CLI_IN_BUFFER_SIZE];
|
||||
static uint32_t bufferIndex = 0;
|
||||
|
|
|
@ -409,17 +409,11 @@ uint32_t CDC_Receive_BytesAvailable(void)
|
|||
|
||||
uint32_t CDC_Send_FreeBytes(void)
|
||||
{
|
||||
/*
|
||||
return the bytes free in the circular buffer
|
||||
|
||||
functionally equivalent to:
|
||||
(APP_Rx_ptr_out > APP_Rx_ptr_in ? APP_Rx_ptr_out - APP_Rx_ptr_in : APP_RX_DATA_SIZE - APP_Rx_ptr_in + APP_Rx_ptr_in)
|
||||
but without the impact of the condition check.
|
||||
*/
|
||||
// return the bytes free in the circular buffer
|
||||
uint32_t freeBytes;
|
||||
|
||||
ATOMIC_BLOCK(NVIC_BUILD_PRIORITY(6, 0)) {
|
||||
freeBytes = ((UserTxBufPtrOut - UserTxBufPtrIn) + (-((int)(UserTxBufPtrOut <= UserTxBufPtrIn)) & APP_TX_DATA_SIZE)) - 1;
|
||||
freeBytes = APP_RX_DATA_SIZE - rxAvailable;
|
||||
}
|
||||
|
||||
return freeBytes;
|
||||
|
|
|
@ -25,8 +25,11 @@
|
|||
|
||||
#include "platform.h"
|
||||
|
||||
#include "build/atomic.h"
|
||||
|
||||
#include "usbd_cdc_vcp.h"
|
||||
#include "stm32f4xx_conf.h"
|
||||
#include "drivers/nvic.h"
|
||||
#include "drivers/time.h"
|
||||
|
||||
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
|
||||
|
@ -44,11 +47,11 @@ __IO uint32_t bDeviceState = UNCONNECTED; /* USB device status */
|
|||
|
||||
/* This is the buffer for data received from the MCU to APP (i.e. MCU TX, APP RX) */
|
||||
extern uint8_t APP_Rx_Buffer[];
|
||||
extern uint32_t APP_Rx_ptr_out;
|
||||
extern volatile uint32_t APP_Rx_ptr_out;
|
||||
/* Increment this buffer position or roll it back to
|
||||
start address when writing received data
|
||||
in the buffer APP_Rx_Buffer. */
|
||||
extern uint32_t APP_Rx_ptr_in;
|
||||
extern volatile uint32_t APP_Rx_ptr_in;
|
||||
|
||||
/*
|
||||
APP TX is the circular buffer for data that is transmitted from the APP (host)
|
||||
|
@ -188,14 +191,7 @@ uint32_t CDC_Send_DATA(const uint8_t *ptrBuffer, uint32_t sendLength)
|
|||
|
||||
uint32_t CDC_Send_FreeBytes(void)
|
||||
{
|
||||
/*
|
||||
return the bytes free in the circular buffer
|
||||
|
||||
functionally equivalent to:
|
||||
(APP_Rx_ptr_out > APP_Rx_ptr_in ? APP_Rx_ptr_out - APP_Rx_ptr_in : APP_RX_DATA_SIZE - APP_Rx_ptr_in + APP_Rx_ptr_in)
|
||||
but without the impact of the condition check.
|
||||
*/
|
||||
return ((APP_Rx_ptr_out - APP_Rx_ptr_in) + (-((int)(APP_Rx_ptr_out <= APP_Rx_ptr_in)) & APP_RX_DATA_SIZE)) - 1;
|
||||
return APP_RX_DATA_SIZE - CDC_Receive_BytesAvailable();;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -215,12 +211,13 @@ static uint16_t VCP_DataTx(const uint8_t* Buf, uint32_t Len)
|
|||
while (USB_Tx_State != 0);
|
||||
|
||||
for (uint32_t i = 0; i < Len; i++) {
|
||||
APP_Rx_Buffer[APP_Rx_ptr_in] = Buf[i];
|
||||
APP_Rx_ptr_in = (APP_Rx_ptr_in + 1) % APP_RX_DATA_SIZE;
|
||||
|
||||
while (CDC_Send_FreeBytes() == 0) {
|
||||
// Stall if the ring buffer is full
|
||||
while (((APP_Rx_ptr_in + 1) % APP_RX_DATA_SIZE) == APP_Rx_ptr_out) {
|
||||
delay(1);
|
||||
}
|
||||
|
||||
APP_Rx_Buffer[APP_Rx_ptr_in] = Buf[i];
|
||||
APP_Rx_ptr_in = (APP_Rx_ptr_in + 1) % APP_RX_DATA_SIZE;
|
||||
}
|
||||
|
||||
return USBD_OK;
|
||||
|
@ -237,7 +234,7 @@ uint32_t CDC_Receive_DATA(uint8_t* recvBuf, uint32_t len)
|
|||
{
|
||||
uint32_t count = 0;
|
||||
|
||||
while (APP_Tx_ptr_out != APP_Tx_ptr_in && count < len) {
|
||||
while (APP_Tx_ptr_out != APP_Tx_ptr_in && (count < len)) {
|
||||
recvBuf[count] = APP_Tx_Buffer[APP_Tx_ptr_out];
|
||||
APP_Tx_ptr_out = (APP_Tx_ptr_out + 1) % APP_TX_DATA_SIZE;
|
||||
count++;
|
||||
|
@ -248,7 +245,7 @@ uint32_t CDC_Receive_DATA(uint8_t* recvBuf, uint32_t len)
|
|||
uint32_t CDC_Receive_BytesAvailable(void)
|
||||
{
|
||||
/* return the bytes available in the receive circular buffer */
|
||||
return APP_Tx_ptr_out > APP_Tx_ptr_in ? APP_TX_DATA_SIZE - APP_Tx_ptr_out + APP_Tx_ptr_in : APP_Tx_ptr_in - APP_Tx_ptr_out;
|
||||
return (APP_Tx_ptr_in + APP_TX_DATA_SIZE - APP_Tx_ptr_out) % APP_TX_DATA_SIZE;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue