一、任务的通信方式
1.1 共享内存
进程间的通信方式有两种,一种是使用共享内存,这种方式基本不依赖OS,也没有相应的系统开销。另一种则需要OS支持,通过建立链接器实现任务间的通信。
| Message Passing | Share Memory |
|---|---|
| 依赖内核,需要预先建立Link,内核负担开销 | 无需预先建立Link,用户进程负责开销 |
| 只有建立链接的双方才可以通信 | 所有进程都可以访问 |
| 需提供Link Creation、Link Capacity、 Message Lost等机制 | 需要提供互斥存取 |
两种通信方式的区别
在UCOSii中,多个任务使用同一块内存区域需要提供一种互斥存取的方法。否则该段共享数据很有可能在被访问前就被其他任务重置了。
利用关中断宏OS_ENTER_CRITICAL()、OS_EXIT_CRITICAL()以及开调度锁是利用函数 OSSchedLock()、 OSSchekUnlock()可以实现单任务对某一资源的暂时性独享。
用这种方法实现数据共享存在很大的局限性,一个简单的例子,当一个共享资源允许被多个任务同时占用,这种方式就很低效。
RTOS会提供信号量、邮箱和消息队列来支持任务间的通信与同步,即使是非实时性操作系统也同样有这样的接口,这已经类似于一种规范。
1.2 信号量
信号量的概念最初由Edsger Dijkstra提出。
假定有多个任务需要读写一块板卡上的flash芯片,如果他们之间没有协商,而是各自单独对flash进行读写,就会使flas

本文详细介绍了UCOSii中任务的通信方式,包括共享内存、信号量、邮箱和消息队列,以及事件控制块(Ecb)的结构和相关函数。通过信号量实现资源的互斥访问,邮箱传递信息,消息队列处理并发事件,Ecb统一维护事件信息,减少了代码重复。
最低0.47元/天 解锁文章
2209

被折叠的 条评论
为什么被折叠?



