在数据结构中有一种很重要的数据结构叫做队列,其特点是数据先进先出。在freertos中也有一类队列,我们利用这类队列在freertos中实现任务与任务间的消息传递,所以也可以称之为消息队列。
队列是任务间通信的主要形式。它们可以用于在任务之间以及中断和任务之间发送消息。在大多数情况下,它们作为线程安全的 fifo(先进先出)缓冲区使用,新数据被发送到队列的后面, 尽管数据也可以发送到前面。(拷贝自freertos开发者文档)
队列通过这样子的结构在任务间单方向传递消息。
在freertos的api引用文档中我们可以看到队列的控制函数。
我们在文档中找到队列创建函数(动态)
首先我们需要在程序中包含入queue.h文件才能使用队列。
其次和之前几期的操作一样,我们需要在freertosconfig.h文件中需要配置相对应的宏以激活该创建队列的构造函数。
xqueuecreate的参数有两个,首先是uxqueuelength队列可同时容纳的最大项目数简而言之也就是:这个队列有多长。
其次是uxitemsize,顾名思义是每一个项目(每个小块块)能存储多少数据(字节)
最后要强调的是,这个函数的返回值是queuehandle_t,即以句柄的形式返回,因此我们创建任务的时候也需要以句柄变量接收其返回值。
我们在启动函数中加入我们创建队列的函数,其长度为1,每个项目的大小为一个字节。
我们接着在api引用文档中找到关于队列发送的函数(如上)。
发送的函数平平无奇,但是有几点需要注意;
首先是发布项目按副本排队而不是引用指针,指的是我们传入的数据是先拷贝的临时变量传入,而并非我们传入数据的地址,我想这样子是为了避免在接收端时对数据进行修改导致错误。
其次是该函数不能在中断函数中调用(有专门的函数是在中断中发布项目的)
函数参数中的第三项xtickswait简单的理解就是可等待的最大时间,我们如果我们的队列已满则尝试等待,超过一定周期认为超时则项目发布失败。
我们在按钮检测任务中编写:按下按钮2时向队列中放入字符p(p初始值为‘a’),每按下这个按钮,p的值递增。
还有一个按钮3,按下按钮3则在队列中读取一则消息,并打印出来。
void get_info(void * pvparameters){ unsigned char p = 'a'; unsigned char r; while(1) { unsigned char key = key_scan(0); basetype_t err; if(key==1) { memset(informationbuff,0,400); vtaskgetruntimestats(informationbuff); printf(%srn,informationbuff); } if(key==2) { printf(key_2 pressrn); if(keynumberhandler!=null)//队列句柄有效 { err = xqueuesend(keynumberhandler,&p,10); p++; if(err!=pdtrue) { printf(send fail rn); } else { printf(send %c successrn,p); } } } if(key==3) { printf(key 3 pressrn); if(keynumberhandler!=null)//队列句柄有效 { xqueuereceive(keynumberhandler,&r,10); printf(queue receive:%c rn,r); r = '�';//清空 } } vtaskdelay(10); }}我们在按钮检测任务中加入按钮2和按钮3的情况,并且定义了一个变量err来检测我们的队列是否添加成功,我们观察串口并看看打印情况。
可以看到,我们按下按钮2,成功将 ‘b’ 消息送入队列(我们是先p++再送入队列的)
我们再继续按下按钮2,由于队列的长度为1,且队列的项目并没有出队列,因此串口会提示送入队列失败。
此时p等于 ' c ',我们按下按钮3,让数据出队列,并且再按下一次按钮3读取是否有数据。
可以看到,读取队列之后队列的内容将被释放,后续的内容将前进。之后我们再按下按钮2 ,此时就可以向队列中送入数据(我多按了一下)。
除此之外,freertos中还有一个函数为xqueueoverwrite,传入参数除了没有阻塞时间之外和xqueuesend一样,它的作用为将消息送入队列,如果没有空间则覆盖最后一个空间,我们将按钮2中的函数换为该函数再试试。
我们每次送入队列都成功,因为它会把队列的最后一个项目覆盖掉。
关于队列的介绍就到此啦,具体的api可以上freertos的官网查看参考文档。
高通公司将投资73亿卢比,购买Reliance Jio公司0.15%的股份
photonicSENS已与Qualcomm(高通)达成合作
IBM公司介绍新款多功能处理器Wire-Speed Powe
宝马加快了全新3系国产化的进程 预计明年在铁西工厂正式投产
【自适应计算在机器人领域的应用】连载七:用ROS 2在机器人内部集成自适应计算的新架构
基于STM32F407的FreeRTOS学习笔记(5)
有哪些睡觉可以使用的降噪耳机?睡眠降噪蓝牙耳机推荐
数字式时间继电器抗干扰的方法
晶圆级CSP的装配工艺流程
腾讯全球数字生态大会:NVIDIA 智驾方案驱动软件定义汽车的持续创新
我国传感器产业发展仍面临诸多挑战
经济寒冬将至?科技创投陷“钱荒”意味着什么?
土壤测定仪的功能特点
三元锂与氢燃料电池对比 哪个更安全
LED巨头Lumileds换帅,Jonathan Rich博士担任新CEO
惠及消费类产品的智能线性执行器
利用PLC及特殊模块实现电子束焊接机专用控制电路的设计
IT领袖Cognizant让人工智能超越爬山
爆苹果将大规模推荐迄今最便宜的MacBook
北京移动将在年底前在北京五环内实现5G信号全覆盖