嵌入式操作系统7(uCOS-II的任务通信机制).ppt

嵌入式操作系统7(uCOS-II的任务通信机制).ppt

  1. 1、本文档共42页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
嵌入式操作系统7(uCOS-II的任务通信机制)

西安电子科技大学计算机学院 嵌入式操作系统 第七讲 ?C/OS-II的任务通信机制 信号量 信号量是用来解决进程同步与互斥问题的机制。 一个称为信号量的变量(sem) 对它进行的两个原语操作(p操作、v操作) 信号量大于等于零的时候代表可供并发进程使用的资源实体数。 信号量小于零的时候,表示正在等待使用临界区的进程的个数。 p操作和v操作是不可中断的程序段,称为原语。 信号量的P、V操作 P(S): ①将信号量S的值减1,即S=S-1; ②如果S=0,则该进程继续执行;否则该进程置为等待状态,排入等待队列。 V(S): ①将信号量S的值加1,即S=S+1; ②如果S0,则该进程继续执行;否则释放队列中第一个等待信号量的进程。 PV操作的意义: 我们用信号量及PV操作来实现进程的同步和互斥。PV操作属于进程的低级通信。 实现互斥 利用信号量和PV操作实现进程互斥的一般模型是: 进程P1 进P2 …… 进程Pn …… …… …… P(S); P(S); P(S); 临界区; 临界区; 临界区; V(S);V(S); V(S); …… ……?? ……? …… 其中信号量S用于互斥,初值为1。 使用PV操作实现进程互斥时应该注意的是: (1)每个程序中用户实现互斥的P、V操作必须成对出现,先做P操作,进临界区,后做V操作,出临界区。若有多个分支,要认真检查其成对性。 (2)P、V操作应分别紧靠临界区的头尾部,临界区的代码应尽可能短,不能有死循环。 (3)互斥信号量的初值一般为1。 实现同步 利用信号量和PV操作实现进程同步: 当信号量的值为0时,表示期望的消息尚未产生; 当信号量的值非0时,表示期望的消息已经存在。 调用P操作测试消息是否到达; 调用V操作发送消息。 使用PV操作实现进程同步时应该注意的是: (1)分析进程间的制约关系,确定信号量种类。在保持进程间有正确的同步关系情况下,哪个进程先执行,哪些进程后执行,彼此间通过什么资源(信号量)进行协调,从而明确要设置哪些信号量。 (2)信号量的初值与相应资源的数量有关,也与P、V操作在程序代码中出现的位置有关。 (3)同一信号量的P、V操作要成对出现,但它们分别在不同的进程代码中。 生产者-消费者问题 一个生产者,一个消费者,公用一个缓冲区。 定义两个同步信号量: empty——表示缓冲区是否为空,初值为1。 full——表示缓冲区中是否为满,初值为0。 一个生产者,一个消费者,公用n个环形缓冲区。 定义两个同步信号量: empty——表示缓冲区是否为空,初值为n。 full——表示缓冲区中是否为满,初值为0。 设缓冲区的编号为1~n,定义两个指针in和out,分别是生产者进程和消费者进程使用的指针,指向下一个可用的缓冲区。 一组生产者,一组消费者,公用n个环形缓冲区。 在这个问题中,不仅生产者与消费者之间要同步,而且各个生产者之间、各个消费者之间还必须互斥地访问缓冲区。 定义四个信号量: empty——表示缓冲区是否为空,初值为n。 full——表示缓冲区中是否为满,初值为0。 mutex1——生产者之间的互斥信号量,初值为1。 mutex2——消费者之间的互斥信号量,初值为1。 设缓冲区的编号为1~n,定义两个指针in和out,分别是生产者进程和消费者进程使用的指针,指向下一个可用的缓冲区。 ?C/OS-II中的任务间通信 ?C/OS-II是通过信号量、消息邮箱和消息队列来实现任务间通信的。 ?C/OS-II将信号量、邮箱和队列统称为事件。 事件控制块是各种事件控制函数实现的基本数据结构 。 事件控制块 对等待事件任务列表的操作 将任务置于等待事件任务列表 从等待事件任务列表中使任务脱离等待状态 在等待事件任务列表中查找优先级最高的任务 将任务置于等待事件任务列表 使任务脱离等待状态 查找优先级最高的任务 空余事件控制块 事件控制块的总数是由应用程序所需的信号量、互斥型信号量、消息队列和消息邮箱的总数所决定的。空余事件控制块链表由系统初始化函数建立。 对事件控制块的操作 初始化一个事件控制块 OS_EventWaitListInit(OS_EVENT *pevent) 只初始化等待事件任务列表 使一个任务进入等待某事件的状态 OS_EventTaskWait() 使一个任务就绪(脱离等待状态) OS_EventTaskRdy() 因为等待超时而使一个任务进入就绪态 OS_EventTO() 初始化事件控制块(部分代码) 使任务进入等待某事件的状态 使一个任务就绪 等待超时而进入就绪态 ?C/OS-II中的信号量 信号量是一种事件 组成 16位无符号整型计数值 等待该信号的等待任务列表 操作函数 OSSemCreate() OSSemDel() OSS

文档评论(0)

ligennv1314 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档