嵌入式实时操作系统uCOS-II:第7章 信号量与互斥信号量.pptVIP

嵌入式实时操作系统uCOS-II:第7章 信号量与互斥信号量.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第7章 信号量与互斥信号量 7.1 信号量管理 7.1.1 概述 7.1.1.1 信号量的类型和组成 信号量有两种类型:一种是只有0和1两种值的信号量,称为二值信号量;另一种是可以有多种值的信号量,称为计数式信号量,其值的大小取决于信号量的数据类型,如计数式信号量是8位整型变量,则其值可以是0~255,若是16位整型变量,则其值可以是0~65,535。 μC/OS-II的信号量由两个部分组成: 一个是信号量的计数值,范围是0~65,535; 另一个是由等待该信号量的任务组成的任务等待列表。 7.1.1.2 信号量的功能 信号量可以使用在如下场合: 允许一个任务与其它任务或中断同步; 取得共享资源的使用权; 标志事件的发生。 7.1.1.3 对信号量的初始计数值赋值方法 对μC/OS-II信号量初始值的赋值方法如下: 信号量的初始值=0~65,535。 如果表示一个或者多个事件的发生,那么初始值应设为0。 如果是用于对共享资源的访问,那么该初始值应设为1(例如,把它当作二值信号量使用)。 如果是用来表示允许任务访问n个相同的资源,那么该初始值应该是n,并把该信号量作为一个可计数的信号量使用。 7.1.1.4 信号量管理函数 如表7.1所示,μC/OS-II提供了6种对信号量进行操作的函数,所属文件是OS_SEM.C。 7.1.1.5 信号量的配置常量 在使用信号量函数之前,必须将 OS_CFG.H文件中相应的配置常量设置为0或1,以确定是编译还是裁剪该函数,其配置常量如表7.2所示。 7.1.1.6 中断、任务与信号量之间的关系 任务、中断服务子程序与信号量之间的关系如图7.1所示,其中:用钥匙或者旗帜的符号来表示信号量。 如果信号量用于对共享资源的访问,那么信号量就用钥匙符号。符号旁边的数字N代表可用资源数。对于二值信号量,该值就是1; 如果信号量用于表示某事件的发生,那么就用旗帜符号。这时的数字N代表事件已经发生的次数。 7.1.1.7 注意事项 原则上中断和任务可以共享信号量,但并不推荐这样使用,因为信号量一般用于任务级。如果非这样做不可,则中断服务子程序只能用来发送信号量。 7.1.2 建立一个信号量,OSSemCreate() 7.1.2.1 函数原型 OS_EVENT * OSSemCreate( INT16U value) OSSemCreate()函数用于建立一个信号量,并对信号量赋予初始计数值。这个初始值就是函数的参数value,可以为0~65,535中的任何值,初始值的设置规则如下: 如果信号量用来表示一个或多个事件的发生,那么该信号量的初值通常赋为0; 如果信号量用于对共享资源的访问,那么该信号量的初值应赋为1(例如,把它当成二值信号量使用) 如果信号量用来表示允许访问n个相同的资源,那么该信号量的初值应赋为n,并把信号量作为一个可计数的信号量使用。 OSSemCreate()函数返回指向分配给所建立的信号量的事件控制块的指针。如果没有可用的事件控制块,OSSemCreate()函数返回空指针。 调用者是任务或者启动代码,开关量是OS_SEM_EN。使用任何信号量函数的前提都是需要用此函数建立信号量。 7.1.2.2 源代码 图7.2 OSSemCreate()函数返回之前的ECB数据结构 7.1.2.3 范例 7.1.3 删除一个信号量,OSSemDel() 7.1.3.1 函数原型 OS_EVENT *OSSemDel(OS_EVENT *pevent,INT8U opt,INT8U *err) OSSemDel()函数用于删除一个信号量,调用者只能是任务,开关量是OS_SEM_EN和OS_SEM_DEL_EN。函数有如下3个参数: pevent 指向信号量的指针,该指针的值可以在建立信号量时得到; opt 定义信号量删除条件的选项,它有两个选择: OS_DEL_NO_PEND,规定只能在已经没有任何任务等待信号量时,才能删除该信号量; OS_DEL_ALWAYS, 规定不管有没有任务在等待,立即删除这个信号量。删除后,所有等待该信号量的任务立即进入就绪状态。 err 指向包含错误代码的变量的指针,返回的错误码可能为下列几种之一; OS_NO_ERR 调用成功,信号量被删除; OS_ERR_DEL_ISR 试图在中断服务子程序中删除信号量; OS_ERR_INVALID_OPT 参数opt不是2种合法参数之一; OS_ERR_TASK_WAITING 有任务在等待信号量; OS_ERR_PEVENT_TYPE pevent不是指向信号量的指针; OS_ERR_PEVENT_NULL 没有可用的OS_EVENT数据结构。

文档评论(0)

学习让人进步 + 关注
实名认证
文档贡献者

活到老,学到老!知识无价!

1亿VIP精品文档

相关文档