一、任务的通信方式
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芯片,如果