Add concurrency control

This commit is contained in:
jflyper 2019-02-11 04:49:00 +09:00
parent 620a3c3be4
commit 1e49419a8a
1 changed files with 20 additions and 9 deletions

View File

@ -56,6 +56,9 @@
#include "usbd_cdc_interface.h" #include "usbd_cdc_interface.h"
#include "stdbool.h" #include "stdbool.h"
#include "drivers/nvic.h"
#include "build/atomic.h"
/* Private typedef -----------------------------------------------------------*/ /* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/
#define APP_RX_DATA_SIZE 2048 #define APP_RX_DATA_SIZE 2048
@ -73,12 +76,12 @@ USBD_CDC_LineCodingTypeDef LineCoding =
0x08 /* nb. of bits 8*/ 0x08 /* nb. of bits 8*/
}; };
uint8_t UserRxBuffer[APP_RX_DATA_SIZE];/* Received Data over USB are stored in this buffer */ volatile uint8_t UserRxBuffer[APP_RX_DATA_SIZE];/* Received Data over USB are stored in this buffer */
uint8_t UserTxBuffer[APP_TX_DATA_SIZE];/* Received Data over UART (CDC interface) are stored in this buffer */ volatile uint8_t UserTxBuffer[APP_TX_DATA_SIZE];/* Received Data over UART (CDC interface) are stored in this buffer */
uint32_t BuffLength; uint32_t BuffLength;
uint32_t UserTxBufPtrIn = 0;/* Increment this pointer or roll it back to volatile uint32_t UserTxBufPtrIn = 0;/* Increment this pointer or roll it back to
start address when data are received over USART */ start address when data are received over USART */
uint32_t UserTxBufPtrOut = 0; /* Increment this pointer or roll it back to volatile uint32_t UserTxBufPtrOut = 0; /* Increment this pointer or roll it back to
start address when data are sent over USB */ start address when data are sent over USB */
uint32_t rxAvailable = 0; uint32_t rxAvailable = 0;
@ -137,8 +140,8 @@ static int8_t CDC_Itf_Init(void)
} }
/*##-5- Set Application Buffers ############################################*/ /*##-5- Set Application Buffers ############################################*/
USBD_CDC_SetTxBuffer(&USBD_Device, UserTxBuffer, 0); USBD_CDC_SetTxBuffer(&USBD_Device, (uint8_t *)UserTxBuffer, 0);
USBD_CDC_SetRxBuffer(&USBD_Device, UserRxBuffer); USBD_CDC_SetRxBuffer(&USBD_Device, (uint8_t *)UserRxBuffer);
ctrlLineStateCb = NULL; ctrlLineStateCb = NULL;
baudRateCb = NULL; baudRateCb = NULL;
@ -375,7 +378,13 @@ uint32_t CDC_Send_FreeBytes(void)
(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) (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. but without the impact of the condition check.
*/ */
return ((UserTxBufPtrOut - UserTxBufPtrIn) + (-((int)(UserTxBufPtrOut <= UserTxBufPtrIn)) & APP_TX_DATA_SIZE)) - 1; uint32_t freeBytes;
ATOMIC_BLOCK(NVIC_BUILD_PRIORITY(6, 0)) {
freeBytes = ((UserTxBufPtrOut - UserTxBufPtrIn) + (-((int)(UserTxBufPtrOut <= UserTxBufPtrIn)) & APP_TX_DATA_SIZE)) - 1;
}
return freeBytes;
} }
/** /**
@ -393,9 +402,11 @@ uint32_t CDC_Send_DATA(const uint8_t *ptrBuffer, uint32_t sendLength)
// block until there is free space in the ring buffer // block until there is free space in the ring buffer
delay(1); delay(1);
} }
ATOMIC_BLOCK(NVIC_BUILD_PRIORITY(6, 0)) { // Paranoia
UserTxBuffer[UserTxBufPtrIn] = ptrBuffer[i]; UserTxBuffer[UserTxBufPtrIn] = ptrBuffer[i];
UserTxBufPtrIn = (UserTxBufPtrIn + 1) % APP_TX_DATA_SIZE; UserTxBufPtrIn = (UserTxBufPtrIn + 1) % APP_TX_DATA_SIZE;
} }
}
return sendLength; return sendLength;
} }