概述
操作系统提供的“多任务调度”能力可以说是最吸引程序员的一点,不管是单片机用的RTOS还是高级MCP用的完整操作系统无一列外都支持。借助多任务并发能力程序员可以将复杂的业务进行解耦,实现软件的模块化设计,提高软件的稳定性和可维护性。尤其是像linux、windows等,甚至提供进程内存虚拟化技术,更是将进程安全性做到极致。但任何事情都有两面性,分离成多个任务后必然涉及到沟通不便,而为了沟通,操作系统不得不提供解决方案。下边是FreeRTOS提供的经典方案:
队列(Queue)


如图所示,队列是一个完全独立于任务的一个外部对象, 任务间通信不管是一堆多还是多对一。基本流程是建立一个队列后,发送方向队列推送信息,接收方从中出队信息。优势:
1.可传递多个数据;
2.数据类型任意;
3.可双向传输;
4.支持多个任务读取;
5.可缓存数据;
信号量(Semaphore)


如图所示,信号量也是一个完全独立于任务的一个外部对象,像一个变量一样同步各个任务的运作,当然他支持阻塞的功能。优势:
1.资源不够可阻塞任务;
2.只是一个变量操作效率高;
事件组(Event Group)

如图所示,事件组依然是一个完全独立于任务的一个外部对象,由内核维护,同故宫多个bit控制任务的运作,当然它不支持缓存和多值。优势:
1.可协调多个任务;
2.Bit位内存占用少;
任务通知(Task Notification)

如图所示任务通知比其他通信都更加轻量化,直接在进程控制块PCB中存在, 不用内核专门维护数据。但的确也有些劣势,比如无法缓存,不能多任务共享等。
总结
如果你需要“多对多”广播,或者需要缓存多个数据,只能选队列/事件组。
如果你只是“甲通知乙” 做同步,或者传递一个简单的状态值,坚决用任务通知,它会让你省下大量RAM并显著提升响应速度。
扫码申领本地嵌入式教学实录全套视频及配套源码