c - FreeRTOS 中队列数组的问题

标签 c embedded queue rtos freertos

我正在构建一个 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/

相关文章:

c++ - 什么是从C共享库传回错误字符串的线程安全的好方法

linux - 文件存储小工具与大容量存储小工具

java - Java中Stack和Queue实现不同的原因?

c - 如何在堆栈中进行 RPN 计算?

c++ - 用于计算色差 (delta E) 和色彩空间转换的 C/C++ 库

c - 如何从头开始重复 c 程序并清理屏幕和第一个输入值?

ISR 和多线程程序中的 C 'Volatile' 关键字?

c++ - 刷新排队的 GPIB 响应

javascript - 如何在 JavaScript 中实现堆栈和队列?

sql - 强制 Oracle 使用 SKIP LOCKED 返回前 N 行