西安电子科技大学嵌入式实时操作系统课件 第7章.ppt

西安电子科技大学嵌入式实时操作系统课件 第7章.ppt

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

第7章 信号量与互斥信号量 7.1 信 号 量 7.1.1 概述   1. 信号量的类型和组成   信号量有两种类型:一种是只有0和1两种值的信号量,称为二值信号量;另一种是可以有多种值的信号量,称为计数式信号量。计数式信号量的值的大小取决于信号量的数据类型,如若是8位整型变量,则其值可以是0~255;若是16位整型变量,则其值可以是0~65 535。   μC/OS-Ⅱ的信号量由两个部分组成:一个是信号量的计数值,范围是0~65 535;另一个是由等待该信号量的任务组成的等待任务列表。   2. 信号量的功能   信号量可以使用在如下场合:   (1) 允许一个任务与其它任务或中断同步;   (2) 取得共享资源的使用权;   (3) 标志事件的发生。   3. 对信号量初始计数值的赋值方法   对μC/OS-Ⅱ信号量初始值的赋值方法如下:   (1) 信号量的初始值为0~65 535。   (2) 如果表示一个或者多个事件的发生,那么初始值应设为0。   (3) 如果是用于对共享资源的访问,那么该初始值应设为1。例如,把它当作二值信号量使用。   (4) 如果是用来表示允许任务访问n个相同的资源,那么该初始值应该是n,并把该信号量作为可计数的信号量使用。   4. 信号量管理函数   如表7.1所示,μC/OS-Ⅱ提供了6种对信号量进行管理的函数,所属文件是OS_SEM.C。   5. 信号量管理函数的配置常量   在使用信号量管理函数之前,必须将OS_CFG.H文件中相应的配置常量设置为0或1,以确定是编译还是裁剪该函数。信号量管理函数的配置常量如表7.2所示。     6. 任务、中断服务子程序与信号量之间的关系   任务、中断服务子程序与信号量之间的关系如图7.1所示,其中用钥匙或者旗帜符号来表示信号量,具体说明如下:   (1) 如果信号量用于对共享资源的访问,那么信号量就用钥匙符号。符号旁边的数字N代表可用资源数,对于二值信号量,该值就是1。 图7.1 任务、中断服务子程序与信号量之间的关系   (2) 如果信号量用于表示某事件的发生,那么就用旗帜符号表示。数字N代表事件已经发生的次数。   (3) 小沙漏表示OSSemPend()函数定义的超时时间。   7. 注意事项   原则上,中断服务子程序和任务可以共享信号量,但并不推荐这样使用,因为信号量一般用于任务级。如果非这样做不可,则中断服务子程序只能用来发送信号量。 7.1.2 建立信号量——OSSemCreate()   1. 函数原型   函数原型如下:   OS_EVENT * OSSemCreate(INT16U value)   OSSemCreate()函数用于建立一个信号量,并对信号量赋予初始计数值。这个初始值就是函数的参数value,它可以为0~65 535中的任何值。初始值的设置规则如下:   (1) 如果信号量用来表示一个或多个事件的发生,那么该信号量的初值通常赋为0。   (2) 如果信号量用于对共享资源的访问,那么该信号量的初值应赋为1。   (3) 如果信号量用来表示允许访问n个相同的资源,那么该信号量的初值应赋为n,并把信号量作为一个可计数的信号量使用。   OSSemCreate()函数返回的是分配给所建立的信号量的事件控制块的指针。如果没有可用的事件控制块,则OSSemCreate()函数返回空指针。   调用者是任务或者启动代码,开关量是OS_SEM_EN。使用任何信号量函数的前提都是需要用此函数建立信号量。   2. 源代码   OSSemCreate()函数的源代码如程序清单7.1所示。    OSSemCreate()函数返回之前的ECB数据结构如图7.2所示。 程序清单7.1 OSSemCreate()函数的源代码 OS_EVENT *OSSemCreate (INT16U cnt) { #if OS_CRITICAL_METHOD ==3 OS_CPU_SR cpu_sr; #endif OS_EVENT *pevent; /*定义一个事件控制块指针 */ if(OSIntNesting 0){ /*确保中断服务子程序不能调用该函数 */ return((OS_EVENT*)0); /*若是,则返回空指针 */ } OS_ENTER_CRITICAL(); /*关中断 */ pevent = OSEventFreeList; /*从空余ECB链表中获得一个事件控制块 */ if (OSEventFreeList !

文档评论(0)

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

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

1亿VIP精品文档

相关文档