RTOS - 传递分配结构并将其传递给队列

时间:2012-04-26 21:28:50

标签: malloc task messaging rtos

我一直在处理一些我正在运行的任务的问题。我有三个任务,一个是LCD更新任务,另外两个是电机驱动任务。我还有两个ISR,它们向电机驱动程序任务发送消息。至于安全地传递指针,我正在考虑创建一个结构:

  typedef struct message{
  enum BUTTON_1 = 0, BUTTON_2 = 1, NO_BUTTON = 3; //button ISR to increase motor drive  
  int timestamp; //A timestamp for the RPM of the motors
  }

现在有共享内存的问题,所以我在想:

  struct message* update_msg = (struct message*)malloc(sizeof(struct message)); //from here I dont know how to creat an object that fills the space allocated.

然后我会通过队列发送指向结构的指针:

  OSTASKQPOST((void *)(st_size)
  ....
  )

在最后一个任务获取消息并使用成员变量完成所需的操作之后,我将不得不释放内存。

  free(st_size)

这样的事情是否合情合理?

1 个答案:

答案 0 :(得分:2)

这是' Inter-Thread Comms 101'线程之间传递数据的方法。它会工作正常。假设32位宽的队列,随着消息大小的增加,发布结构地址或对象实例开始赢得很快(通过直接按值发布数据)。

还有其他机制。在我的ARM嵌入式项目中,RAM受限且内存空间比速度更重要,我倾向于使用255个全局消息实例的数组作为池,(保留一个值有用,255表示,对于& #39;索引无效')。这意味着每条消息只能由一个字节引用,每条消息中的两个字节允许它们链接到列表中和从列表中链接。链表头字节,互斥锁和信号量为线程间通信构成阻塞队列 - 无需额外的存储空间。所有邮件都链接到一个'池中。在启动时排队并弹出,在线程之间排队并由应用程序线程释放回池中。

从硬件接收数据的ISR无法调用malloc,获取互斥锁或等待信号量以获取消息索引。我使用另一个没有锁的队列类,只是一个循环的字节索引队列。我在启动时输入了一些消息。中断处理程序可以从这个ISRpool'出列消息,从硬件填充它们,设置int,(bitfield!),识别ISR,将消息索引推送到ISRout' ;循环队列,发出信号量信号并通过操作系统退出。等待信号量的线程唤醒并知道ISRout上有数据,弹出它并将其排队到任何线程处理来自该ISR的消息。那个' ISRhandler'线程还负责补足'带有消息的ISRpool,以便ISR在数据到达时始终准备好消息。这个简单,共享的ISRpool'系统仅在中断不重新启用更高优先级的中断时才有效!

以类似的方式,将tx ISR的消息推送到循环队列以供ISR接收(短暂禁用中断以查看硬件是否空闲且硬件FIFO是否需要'启动'再次启动teh tx中断)。 '使用' tx消息被转储到rx ISRpool上 - 它们也可以重新用于输入。

汇集方案有一些优势并不是很明显。一个是没有malloc,没有免费的'。消息肯定会被泄露,但我很快就会注意到 - 我的监视器/调试器'从UART运行终端提示。是' 223>'该数字是池级别。如果这个数字下降并且没有再次恢复,我知道我已经泄露了。当您无法在Valgrind下运行应用程序时,这非常重要:)