堆是向上生长,栈是向下生长。
队列简介
队列介绍
队列是一种任务到任务、任务到中断、中断到任务数据交流的一种机制,简单来说就是用来传递消息的。
在裸机中虽然我们用全局变量也可以进行传递消息,但是由于FreeRTOS我们创建多个任务时,全局变量会出现在其他任务中修改的问题,也就是数据是无保护,易受损的。
通过读写队列进行消息传递的话,FreeRTOS对读写队列已经做好了保护,可以防止多任务同时访问的冲突(其实就是加入了临界区)。
基于队列, FreeRTOS 实现了多种功能,其中包括队列集、互斥信号量、计数型信号量、二值信号量、 递归互斥信号量。
队列示意图如下,
创建队列时,需要规定队列的长度和每个队列项目的大小。
队列特点
- 数据入队出队:队列通常采用 FIFO(先进先出)的存储缓冲机制,,先入队的先读出(First Input First Output),当然也可以配置成LIFO方式。
- 数据传递:FreeRTOS采用实际值传递,也就是拷贝数据传递,当然,也可以传递指针(传递大数据)。
- 多任务访问:队列不属于某个特定的任务,可以在任何的任务或中断中往队列中写入消息,或者从队列中读取消息。
- 出入队阻塞:在任务从队列读取消息时,可以指定一个阻塞超时时间,出入队阻塞相似
- 阻塞时间为0:直接返回不等待
- 阻塞时间0-port_MAX_DELAY:等待设定的阻塞时间,超时直接返回
- 阻塞时间port_MAX_DELAY:死等,一直等到入队为止
备注:当多个任务给一个满队列写数据,优先级高的先进入就绪态,优先级相同的话,等待时间最久的任务进入就绪态。(出队时也一样)
队列操作过程
队列操作过程分为四步,如下,