我想通过消息队列传递该结构体,curbuf 是通过pvMalloc
typedef struct
{
uint16_t maxLen; //当前数组 数据的最大长度
uint16_t len; //当前数组已接收数据的长度
uint8_t *curbuf; //当前数组
} UART_Data_t;
但是传递指针一直是同一个地址,也就是说我Send多次结构体 curbuf的值一直是同一个,就会导致数据被覆盖
void USART2_IRQHandler(void)
{
static uint16_t RevLen = 0;
static BaseType_t xHigherPriorityTaskWoken = pdFALSE;
uint8_t res;
if (USART_GetIntStatus(USART2, USART_INT_IDLEF) != RESET)
{
/* Read data len from the receive data register */
RevLen = BT_UART_RECV_BUF_LMT - DMA_GetCurrDataCounter(USART_BLE_Rx_DMA_Channel);
if ((RevLen > 0) && (BLE_UART_Rx.curbuf[0] == BLE_ACK_HEAD_FIRST) && (BLE_UART_Rx.curbuf[2] != sendData))
{
BLE_UART_Rx.len = RevLen;
if(pdPASS == xQueueSendToBackFromISR(xQueue_BLERecv, (void *)&BLE_UART_Rx, &xHigherPriorityTaskWoken)) //把数据放到队列当中
{
}else{
YJ_LOG_WARNING("Ble uart Queue is full \r\n");
}
}
DMA_EnableChannel(USART_BLE_Rx_DMA_Channel, DISABLE);
DMA_SetCurrDataCounter(USART_BLE_Rx_DMA_Channel, BLE_UART_Rx.maxLen);
DMA_EnableChannel(USART_BLE_Rx_DMA_Channel, ENABLE);
res = USART_BLE->STS;
res = USART_BLE->DAT;
}
}
我是在中断里面存数据,另外的地方读取 如何保证该指针相互独立
在 FreeRTOS 中传递结构体指针的正确方法是,先使用 pvPortMalloc 分配内存空间,然后复制该结构体的数据到这块内存中,最后将该内存地址作为消息队列的内容发送。如果每次发送的都是同一个地址的话,就会导致数据被覆盖。
如果您希望通过FreeRTOS的队列传递结构体指针,并且确保在队列中的数据不会被覆盖,您需要进行一些改变。
建议您在传递结构体指针时,每次传递一个独立的结构体副本,而不是同一个结构体。
您可以这样改变:
UART_Data_t *pData = (UART_Data_t *)pvMalloc(sizeof(UART_Data_t));
pData->maxLen = n;
pData->len = m;
pData->curbuf = (uint8_t *)pvMalloc(n);
memcpy(pData->curbuf, curbuf, m);
xQueueSend(uartDataQueue, &pData, portMAX_DELAY);
这样每次发送的结构体指针都是独立的副本,不会受到上一次数据的影响