队列主要有两个优点:
1、数据处理过程中有保护机制(开关中断)
2、允许未获取到数据(一般是标志位)的任务进入休眠状态,节约了cpu资源。
FreeRTOS的队列机制的核心为这三个部分:开关中断,环形缓冲区和链表。
开关中断保护了队列数据的处理过程;环形缓冲区本质上是一个长度固定的数组,用于队列的读写,环形结构是指读写的下标会做取模处理,不会发生越界;链表指的是队列数据结构中用于保存任务信息的两个列表,一个链表包含WaitingToReceive的任务,一个链表包含WaitingToSend的任务。当某个任务未读取到队列数据时,它可以先进入休眠状态,等到队列中出现数据后再被唤醒。
这样的任务进入休眠状态需要2个步骤:
1.将自己挂在WaitingToReceive列表当中
2.将自己从ready列表中移到delayed列表中,进入休眠状态。
写队列的过程与读队列类似,不再赘述。