消息队列Queue是FreeRTOS 一个重要的通信机制。
1、概念及作用
消息队列是通过RTOS内核提供服务,任务或中断服务子程序可以将一个消息(注意,FreeRTOS消息队列传递的是实际数据,并不是数据地址,RTX,uCOS-II 和uCOS-III是传
递的地址)放入到队列。同样,一个或者多个任务可以通过RTOS内核服务从队列中得到消息。通常,先进入消息队列的消息先传给任务,也就是说,任务先得到的是最先进入到消息队列的消息,即先进先出的原则(FIFO),FreeRTOS的消息队列支持FIFO和LIFO两种数据存取方式。
也许有不理解的初学者会问采用消息队列多麻烦,搞个全局数组不是更简单,其实不然。在
裸机编程时,使用全局数组的确比较方便,但是在加上RTOS 后就是另一种情况了。相比消息队列,使用全局数组主要有如下四个问题:
1)使用消息队列可以让RTOS内核有效地管理任务,而全局数组是无法做到的,任务的超时等机制需要用户自己去实现。
2)使用了全局数组就要防止多任务的访问冲突,而使用消息队列则处理好了这个问题,用户无需担心。
3)使用消息队列可以有效地解决中断服务程序与任务之间消息传递的问题。
4)FIFO 机制更有利于数据的处理。
2、任务间消息队列的实现
任务间消息队列的实现是指各个任务之间使用消息队列实现任务间的通信。
运行条件:
1)创建消息队列;
2)创建2个任务Task1和Task2,任务Task1向消息队列放数据,任务Task2从消息队列取数据;
3)FreeRTOS的消息存取采用FIFO方式;任务Task1向消息队列放数据,任务Task2从消息队列取数据,运行过程主要有以下两种情况:
- 如果放数据的速度快于取数据的速度,那么会出现消息队列存放满的情况,FreeRTOS的消息存放函数xQueueSend