背景介绍:
在昨天的推文里,我实现了训练二的一小部分功能,用到了RT-Thread的消息队列。
今天我来说说RT-Thread中的消息队列。
引(lan)用(de)著(ma)作(zi)
引自[野火®]《RT-Thread 内核实现与应用开发实战—基于STM32》
为小白铺路
先来讲个段子,读者就当乐子看:
小白:大神,啥叫“异步通信方式”?
大神:异步通信方式就是异步的通信方式啊。
小白:那什么叫“异步”呢?
大神:异步就是不同步啊。
小白:那是谁和谁不同步呢?
大神:(满腔怒火,一脸严肃)
小白:(一脸蒙圈,不敢再问)
Sugar 惯例,用图说话。
(图是根据昨天的代码做的)
图左侧要点:
1、线程的图标为啥长成那个样儿,请看我从前的推文:
《RT-Thread 内核线程组成及调度》
2、思想:每一个线程就是一个循环。
3、主要线程与消息队列的结合点(同一文件里的全局变量key_val,注意两个 key_val 不是一个变量,所以颜色不一样)。
图右侧要点:
1、任务整体的“执行逻辑”。
2、理解:图中“按键线程”与“LED线程”之间的通信是异步的。
3、理解:为啥只用消息队列会造成通信“异步”。
活跃思维
1、Sugar 在设计这个图时,右侧本想放“文件结构”。但因图幅限制,没有画这个。
希望读者通过看昨天的示例代码,把这部分补到脑子里。
2、Sugar绞尽脑汁设计了“正在运行的线程”的图标,在“图标好看”和“图标信息量”的头脑角逐中后者胜出。
希望读者能从图标中读出信息,看图标反推 Sugar 的思路,这样就能牢记这些信息。
我的理解
说“消息队列是一种异步的通信方式”不是很严谨。
从功能上讲,消息队列是为了通信,而非线程同步(以后讲啥叫“线程同步”)。
想让通信同步,用“信号量+消息队列”的方式就可以,消息队列本身不应冠以“同步”、“异步”这样的属性。
严谨一点的说法是:“若线程间只用消息队列通信,则会造成线程不同步”。
PS
昨晚,Sugar 在《软件架构训练计划》训练二(train2)的 github 上已经更新了使用信号量同步按键线程与 LED 线程的代码,并调试过。
推文还没写,想先吃螃蟹的同志门可以 clone 在 github 上的 train2 项目,自己研究研究。
关注作者
欢迎扫码关注我的公众号MultiMCU EDU
。
提示:在公众号“关于我”页面可加作者微信好友。
喜欢本文求点赞,有打赏我会更有动力。
请我喝杯咖啡如何?
微信 支付宝