w117 2023-01-30 10:45 采纳率: 100%
浏览 58
已结题

Freertos队列传递结构体指针变量

问题遇到的现象和发生背景

我想通过消息队列传递该结构体,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;
    }
}

我是在中断里面存数据,另外的地方读取 如何保证该指针相互独立

  • 写回答

2条回答 默认 最新

  • CodeBytes 2023-01-30 17:08
    关注

    在 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);
    

    这样每次发送的结构体指针都是独立的副本,不会受到上一次数据的影响

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 2月8日
  • 已采纳回答 1月31日
  • 修改了问题 1月30日
  • 创建了问题 1月30日

悬赏问题

  • ¥15 求高通平台Softsim调试经验
  • ¥15 canal如何实现将mysql多张表(月表)采集入库到目标表中(一张表)?
  • ¥15 wpf ScrollViewer实现冻结左侧宽度w范围内的视图
  • ¥15 栅极驱动低侧烧毁MOSFET
  • ¥30 写segy数据时出错3
  • ¥100 linux下qt运行QCefView demo报错
  • ¥50 F1C100S下的红外解码IR_RX驱动问题
  • ¥20 基于matlab的航迹融合 航迹关联 航迹插补
  • ¥15 用Matlab实现图中的光线追迹
  • ¥15 联想笔记本开机出现系统更新界面