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

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 怎样解决power bi 中设置管理聚合,详细信息表和详细信息列显示灰色,而不能选择相应的内容呢?
  • ¥15 QTOF MSE数据分析
  • ¥15 平板录音机录音问题解决
  • ¥15 请问维特智能的安卓APP在手机上存储传感器数据后,如何找到它的存储路径?
  • ¥15 (SQL语句|查询结果翻了4倍)
  • ¥15 Odoo17操作下面代码的模块时出现没有'读取'来访问
  • ¥50 .net core 并发调用接口问题
  • ¥15 网上各种方法试过了,pip还是无法使用
  • ¥15 用verilog实现tanh函数和softplus函数
  • ¥15 Hadoop集群部署启动Hadoop时碰到问题