ARM Cortex-M3嵌入式开发及应用教与学 课件 第12章 信号量与互斥信号量_第1页
ARM Cortex-M3嵌入式开发及应用教与学 课件 第12章 信号量与互斥信号量_第2页
ARM Cortex-M3嵌入式开发及应用教与学 课件 第12章 信号量与互斥信号量_第3页
ARM Cortex-M3嵌入式开发及应用教与学 课件 第12章 信号量与互斥信号量_第4页
ARM Cortex-M3嵌入式开发及应用教与学 课件 第12章 信号量与互斥信号量_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第十二章

信号量与互斥信号量目录μC/OS-II信号量μC/OS-II互斥信号量信号量与互斥信号量实例本章小结1信号量和互斥信号量是µC/OS-II中最重要的两个组件,信号量用于实现任务间的同步以及任务同步中断服务函数的运行,互斥信号量用于保护共享资源。本章将介绍信号量与互斥信号量的概念和程序设计方法。10.1μC/OS-II信号量23信号量本质上是一个全局计数器的实现机制,释放信号量的任务使得该计数器的值加1,请求到信号量的任务使该计数器的值减1,如果计数器的值为0,则请求该信号量的任务将挂起等待,直到别的任务释放该信号量。通过这种方式,使得释放信号量的任务可以控制请求信号量的任务的运行。信号量相关的函数列于右表中,这些函数的定义位于µC/OS-II内核文件os_sem.c中。μC/OS-II信号量4信号量的工作原理如下图所示。μC/OS-II信号量5信号量相关的主要操作有:创建信号量OSSemCreate、请求信号量OSSemPend和释放信号量OSSemPost。使用信号量的步骤为:(1)定义事件,如:“OS_EVENT*sem01;”。(2)创建信号量,如“sem01=OSSemCreate(0);”,此时,创建了信号量sem01,信号量的初始值为0。(3)在任务A中周期性地释放该信号量,调用“OSSemPost(sem01);”实现。(4)在任务X中始终请求该信号量,用“OSSemPend(sem01,0,&err);”实现,该函数的第二个参数表示等待超时,如果为0,表示请求不到信号量时永久等待;如果为大于0的整数,则任务X等待该整数值的时钟节拍后,仍然没有请求到信号量时,则不再等待而继续执行。μC/OS-II信号量10.2μC/OS-II互斥信号量67互斥信号量只有0和1两个值,与信号量的操作类似,常用的互斥信号量管理函数列于下表中,这些函数位于µC/OS-II内核文件os_mutex.c中。μC/OS-II互斥信号量8互斥信号量的工作情况如下图所示。μC/OS-II互斥信号量互斥信号量只有0和1两个值,表示两种状态,即互斥信号量被占用和未被占用。如上图所示,某一任务X需要使用共享资源时,首先需要请求互斥信号量M,如果没有请求到,说明共享资源被其他任务正在使用;如果请求到M,则优先级反转到比其他要请求该共享资源的所有任务的优先级略高的优先级继承优先级,任务X使用完共享资源后,释放互斥信号量M。可见,互斥信号量的请求和释放是在同一个任务中实现的。9μC/OS-II互斥信号量使用互斥信号量的步骤如下:(1)定义事件,如“OS_EVENT*mtx01;”。(2)定义优先级继承优先级(PIP)的值PIP_Prio,PIP的数值应比所有请求同一共享资源的任务的优先级数值要小。(3)创建互斥信号量,如“mtx01=OSMutexCreate(PIP_Prio,&err);”。(4)如果某一任务X要使用共享资源,应先调用OSMutexPend函数请求互斥信号量,如“OSMutexPend(mtx01,0,&err);”;请求到互斥信号量之后,开始使用共享资源,使用完后再调用OSMutexPost函数释放互斥信号量,如“OSMutexPost(mtx01);”。函数OSMutexPend的第2个参数为等待超时参数,如果为0,表示请求不到互斥信号量时,一直等待;如果为大于0的整数,表示等待该整数值的时钟节拍后,仍然请求不到互斥信号量时,则放弃等待。10.3信号量与互斥信号量实例1011信号量与互斥信号量实例工程PRJ31的具体建设步骤如下所示:(1)在工程PRJ30的基础上,新建工程“PRJ31”,保存在目录“D:\STM32F103RCT6PRJ\PRJ31”下,此时的工程PRJ31与工程PRJ30完全相同。(2)修改task01.c文件,如下面的程序段所示。12信号量与互斥信号量实例13信号量与互斥信号量实例14信号量与互斥信号量实例15信号量与互斥信号量实例16信号量与互斥信号量实例17信号量与互斥信号量实例(3)新建文件task07.c、task07.h、task08.c和task08.h,保存在目录“D:\STM32F103RCT6PRJ\PRJ31\USER”下,其代码如下面的程序段所示。18信号量与互斥信号量实例20信号量与互斥信号量实例(4)修改uctmr.c和uctmr.h文件,如程序段所示。20信号量与互斥信号量实例(5)新建文件task09.c和task09.h,保存在目录“D:\STM32F103RCT6PRJ\PRJ31\USER”下,其代码如下面的程序段所示。21信号量与互斥信号量实例(6)修改文件exti.c,其代码如下面的程序段所示。22信号量与互斥信号量实例23信号量与互斥信号量实例(7)新建文件task10.c和task10.h,保存在“D:\STM32F103RCT6PRJ\PRJ31\USER”目录下,其代码如下面的程序段所示。24信号量与互斥信号量实例(8)修改文件task02.c,其代码如下面的程序段所示。25信号量与互斥信号量实例(9)新建文件task11.c和task11.h,保存在“D:\STM32F103RCT6PRJ\PRJ31\USER”目录下,其代码如下面的程序段所示。26信号量与互斥信号量实例(10)修改文件includes.h,其代码如下面的程序段所示。27信号量与互斥信号量实例(11)将文件task07.c~task11.c添加到工程管理器的“USER”分组下,建设好的工程PRJ31如下图所示。28信号量与互斥信号量实例工程PRJ31的执行流程如下图所示。10.4本章小结2930本章小结本章详细介绍了信号量和互斥信号量的用法,信号量的主要作用在于实现两个用户任务间的同步执行,或用户任务同步中断服务程序的执行。“信号量+全局变量”的方式还可以实现在任务间传递信息,或由中断服务程序向任务传递信息。互斥信号量的作用在于保护共享资源,避免出现死锁或者全局变量访问出错。信号量和互斥信号量均属于事件,在os

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论