gpt4 book ai didi

c - FreeRTOS 中队列数组的问题

转载 作者:行者123 更新时间:2023-12-02 03:34:11 25 4
gpt4 key购买 nike

我正在构建一个 FreeRTOS 应用程序。我创建了一个模块,它从另一个模块注册 freeRTOS 队列句柄,当该模块中发生中断时,它会向所有注册的队列发送一条消息。但似乎我能够从队列发送消息,但无法在其他模块接收它。

这是我的代码。

远程模块:-

  CanRxMsg RxMessage;
can_rx0_queue = xQueueCreate( 10, sizeof(CanRxMsg) ); // can_rx0_queue is globally defined
// Register my queue with can module
if (registerRxQueueWithCAN(can_rx0_queue) == -1)
{
TurnLedRed();
}

while(1)
{
if(can_rx0_queue){
while( xQueueReceive( can_rx0_queue, ( void * ) &RxMessage, portMAX_DELAY))
{
}
.....

这是注册模块

#define MAX_NUMBER_OF_RX_QUEUES 2

//xQueueHandle rxQueueStore[MAX_NUMBER_OF_RX_QUEUES];

typedef struct QUEUE_REGISTRY_ITEM
{
// signed char *pcQueueName;
xQueueHandle xHandle;
} xQueueRegistryItem;

xQueueRegistryItem rxQueueStore[MAX_NUMBER_OF_RX_QUEUES];

int numberOfQueuesRegistered;

#define cError -1

#define cSuccess 0

void processInterrupt()
{
for(int i=0; i < numberOfQueuesRegistered; i++)
{
if(xQueueSendFromISR(rxQueueStore[i].xHandle,(void *) &RxMessage,&tmp) != pdTRUE)
TurnLedRed();
if(tmp)resched_needed = pdTRUE;
}

portEND_SWITCHING_ISR(resched_needed);
}

int registerRxQueueWithCAN(xQueueHandle myQueue)
{
if(numberOfQueuesRegistered == MAX_NUMBER_OF_RX_QUEUES)
{
// Over Flow of registerations
TurnLedRed();
return cError;
}else
{
rxQueueStore[numberOfQueuesRegistered].xHandle = myQueue;
numberOfQueuesRegistered++;
}
return cSuccess;
}

几点:-

  1. xQuehandle 的类型定义为“void *”
  2. 如果删除注册内容,并且如果我通过 extern 获取指针,则代码可以直接使用 xQueueSendFromISR 中的队列指针。

需要任何建议或信息吗?

最佳答案

乍一看,我看不出有什么明显的错误。问题可能出在您所显示的代码之外,例如如何声明 can_rx0_queue、如何进入中断、您使用哪个端口等。

有一个 FreeRTOS 支持论坛,可从 FreeRTOS 主页 http://www.FreeRTOS.org 链接到

问候。

关于c - FreeRTOS 中队列数组的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5512957/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com