freeRTOS中所有任务的通信和同步机制都是基于队列来实现。
图 队列的读写操作
(1)队列可以保存有限个具有确定长度的数据单元,队列可以保存的最大单元数目称为队列的深度;
(2)队列创建时需要设定队列深度和每个单元的大小;
(3)队列先进先出
队列是内核中具有独立权限的对象,不属于任何任务,可以有多个任务进行读写
(1)任务读取队列数据时可以指定一个阻塞超时时间;
(2)未超过阻塞超时时间,队列为空,任务将保持阻塞状态;
(3)队列中写入数据,任务将由阻塞态转为就绪态;或者阻塞时间超过了阻塞超时时间,任务也将由阻塞态转为就绪态;
(4)可能会有多个任务处于阻塞态等待读取队列中的数据;
(5)队列数据有效,优先级最高的任务会解除阻塞,相同优先级则等待时间最长的任务会解除阻塞
(1)任务写入队列数据时可以指定一个阻塞超时时间;
(2)未超过阻塞超时时间,队列满,任务将保持阻塞状态;
(3)队列有空闲,任务将由阻塞态转为就绪态;或者阻塞时间超过了阻塞超时时间,任务也将由阻塞态转为就绪态;
(4)可能会有多个任务处于阻塞态等待向队列中的写入数据;
(5)队列有空闲,优先级最高的任务会解除阻塞,相同优先级则等待时间最长的任务会解除阻塞
图 结构体用于队列传递举例
一般是通过传递复合数据类型的指针来实现
(1)指针指向的内存空间的所有权必须明确
不会有任意两个任务同时修改共享内存中的数据 .原则上,共享内存在其指针发送到队列之前,其内容只允许被发送任务访问;
共享内存指针从队列中被读出之后,其内容亦只允许被接收任务访问
(2)指针指向的内存空间必须有效
如果指针指向的内存空间是动态分配的,只应该有一个任务负责对其进行内存释放。当这段内存空间被释放之后,就不应该有任何一个任务再访问这段空间
注:切忌用指针访问任务栈上分配的空间。因为当栈帧发生改变后,栈上的数据将不再有效
| API原型 | 函数说明 | 参数说明 | 返回值 |
| xQueueCreate( uxQueueLength, uxItemSize ) | 用于创建一个队列,并返回一个 xQueueHandle 句柄以便于对其创建的队列进行引用 。当创建队列时, FreeRTOS 从堆空间中分配内存空间。分配的空间用于存储队列数据结构本身以及队列中包含的数据单元。如果内存堆中没有足够的空间来创建队列,xQueueCreate()将返回 NULL |
队列能够存储的最大单元数目,即队列深度。
队列中数据单元的长度,以字节为单位 |
NULL 表示没有足够的堆空间分配给队列而导致创建失败。 非 NULL 值表示队列创建成功。此返回值应当保存下来,以作为 操作此队列的句柄 |
| xQueueSendToBack( xQueue, pvItemToQueue, xTicksToWait ) | xQueueSendToBack()用于将数据发送到队列尾 |
目标队列的句柄
发送数据的指针
阻塞超时时间。如果在发送时队列已满,这个时间即是任务处于阻塞态等待队列空间有效的最长等待时间 |
|
| xQueueSendToFront( xQueue, pvItemToQueue, xTicksToWait ) | 用于将数据发送到队列首 |
pdPASS errQUEUE_FULL |
|
| xQueueSendToFrontFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) | 用于在中断服务中实现相同的功能 |
||
| xQueueSendToBackFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) | 用于在中断服务中实现相同的功能 | ||
| xQueueReceive xQueuePeek |
用于从队列中接收(读取)数据单元。接收到的单元同时会从队列中删除 也是从从队列中接收数据单元,不同的是并不从队列中删出接收到的单元 注:切记不要在中断服务例程中调用 xQueueRceive()和 xQueuePeek() |
||
| xQueueReceiveFromISR |
|||
| uxQueueMessagesWaiting |
用于查询队列中当前有效数据单元个数 切记不要在中断服务例程中调用 uxQueueMessagesWaiting() |
||
| uxQueueMessagesWaitingFromISR |
send1和sender2负责写队列,receiver负责读队列:
乐高42177奔驰G500套装共有2891个零件,套装分为20个步骤,拼装时间大约需要6个小时。
Emo 是一款个人伴侣机器人,集时尚与创新于一身。他的诞生离不开最新的树莓派 4 技术和先进的设计。他不仅仅是一款机器人,更是一个活生生的存在。
青少年等级考试,英文名称(Youth Level Test)以下简称等级考试。等级考试是中国电子学会服务于国家教育改革和全民科学素质提升的需要, 以提升我国 青少年整体信息素养和创新能力为目标,于2011年起面向全国青少年开展的信息技术能力素质 的评价项目。
这是积木悬浮术??乐高现在已经不归地球管了吗? NO!这是物理,是【张力】! 果然,学好数理化,走遍天下都不怕~
ESP-BOX 是乐鑫科技推出的面向 AIoT、边缘 AI 和 IIoT 应用的开发平台。
使用servo库控制舵机与通过9,10引脚对直流电机PWM调速时冲突问题的解决办法。
新课标在秋季即将开始执行,其中信息科技课程与STEM教育是紧密相关的,如何更好的展开STEM学习,以培养孩子们的STEM思维呢?本文总结了一个STEM课程的学习路径,供家长参考。
用于Arduino的Adafruit_GFX库为我们所有的LCD和OLED显示器提供了通用语法和图形功能集。这使Arduino程序可以轻松地在显示类型之间进行调整,而不必花太多精力……
本文讲解如何在Micropython环境下使用ESP32的ESPNow功能进行数据传输。