《电子与信息技术专业.ppt》由会员分享,可在线阅读,更多相关《电子与信息技术专业.ppt(20页珍藏版)》请在三一文库上搜索。
1、电子与信息技术专业,ARM嵌入式技术课程,积件 12-9:COS-II信号量,制作教师:谢利民,全国职业教育电子与信息技术专业数字化资源共建共享,江苏无锡机电高等职业技术学校,WUXI MACHINERY AND ELECTRON HIGER PROFESSIONAL AND TECHNIAL SCHOOL,积件 12-9:COS-II信号量,简介,ISR与任务同步,信号量的工作方式,任务间同步,在中断中获得信号量,资源同步,积件 12-9:COS-II信号量,简介,信号量值大于0,信号量值加1,在实时多任务系统中,信号量被广泛用于:任务间对共享资源的互斥、任务和中断服务程序之间的同步、任务之
2、间的同步。,信号量值减1,当任务调用OSSemPost()函数发送信号量时;,当信号量值大于0,任务调用OSSemPend()函数接收信号量时;,积件 12-9:COS-II信号量,信号量值等于0,注意:C/OS-II不允许在中断服务程序中等待信号量。,信号量到来,正常返回,信号量值等于0,延时到,无信号量,返回超时错误,当信号量值等于0,任务调用OSSemPend()函数接收信号量时。,简介,积件 12-9:COS-II信号量,前面章节我们学习了互斥信号量,下面对计数信号量与互斥信号量做一个对比。,简介,积件 12-9:COS-II信号量,信号量的工作方式,在实际的应用中,常用信号量实现任务
3、间的同步,OSSemPend()和OSSemPost()会出现在不同任务的不同函数中,但不一定成对出现。,1.任务间同步,注意:在实际的应用中,还有多对多、一对多信号量操作的情况,但很不常见,建议读者不要设计出这样的操作方式,因为这样会带来很多的麻烦。,一对一同步,多对一同步,积件 12-9:COS-II信号量,在嵌入式系统中,经常使用信号量访问共享资源来实现资源同步。在使用时,注意发送信号量函数OSSemPost()与等待信号量函数OSSemPend()必须成对出现在同一个任务调用的函数中,才能实现资源同步。,2.资源同步,信号量的工作方式,积件 12-9:COS-II信号量,ISR与任务同
4、步,下面以示例来说明如何现实ISR与任务间同步。假设定时器1中断服务程序发送信号量,任务完成了信号量的创建并在接收到信号量后让蜂鸣器响一声。处理流程如下。,积件 12-9:COS-II信号量,void Timer1_Exception (void) T1IR = 0x01; VICVectAddr = 0; OSSemPost (sem); ,中断服务程序ISR示例代码如下。,ISR与任务同步,积件 12-9:COS-II信号量,void TaskBeep (void *pdata) sem = OSSemCreate(0); OS_ENTER_CRITICAL(); /* 初始化VIC(省略
5、) */ /* 初始化定时器1(省略) */ /* 目标板初始化TargeInit() (省略) */ OS_EXIT_CRITICAL(); while (1) OSSemPend(sem, 0, ,读者补出相应的代码,蜂鸣器报警任务示例代码如下。,ISR与任务同步,积件 12-9:COS-II信号量,任务间同步,任务1,任务2,任务优先级足够高,任务同步,在嵌入式系统中,经常使用信号量来实现多个任务之间的同步。而用来实现任务间同步的信号量在创建时初始值可以为0或者1,这是由OSSemCreate()函数来实现的。,积件 12-9:COS-II信号量,让一个LED以0.5Hz的频率闪耀,每按
6、键一次,LED闪耀一次。我们通过此例来说明如何使用信号量实现任务间同步,假设TaskLED为高优先级的任务。两个任务处理流程如下。,任务间同步,积件 12-9:COS-II信号量,TaskKEY任务主要代码如下。,void TaskKEY (void *pdata) while (1) while (IO0PIN ,任务间同步,积件 12-9:COS-II信号量,void TaskLED (void *pdata) sem = OSSemCreate(0); while (1) OSSemPend(sem, 0, ,TaskLED任务主要代码如下。,任务间同步,积件 12-9:COS-II信号
7、量,资源同步,为了说明使用信号量访问共享资源实现资源同步,设计两个任务,它们以不同的频率让LED点亮30个时钟节拍,然后熄灭60个时钟节拍,要求这两个任务不会互相干扰。假设TaskLED0为高优先级任务,下面是两个任务的处理流程。,积件 12-9:COS-II信号量,void LED (void) INT8U err; OSSemPend(sem, 0, ,为了实现资源同步,我们需要保证OSSemPost()与OSSemPend()成对在同一个任务函数中调用,所以我们编写一个库函数LED()供两个任务调用,代码如下。,资源同步,积件 12-9:COS-II信号量,void TaskLED0 (
8、void *pdata) sem = OSSemCreate(1); while (1) LED(); OSTimeDly(1000); ,void TaskLED1 (void *pdata) pdata = pdata; while (1) LED(); OSTimeDly(2000); ,下面给出两个LED任务的主要处理代码。,用来实现资源同步的信号量在创建时初始值为相同资源的数目,不过嵌入式系统中极少出现完全等同的资源,所以一般初始化为1。,LED()函数已包含互斥,资源同步,积件 12-9:COS-II信号量,在中断中获得信号量,建立一个任务,它每53 秒发送一次信号量。定时器1每1
9、秒钟产生一次中断,在中断服务程序中获得信号量,如果有,则翻转LED。以此示例来说明如何在中断中获得信号量,使用函数OSSemAccept()实现。两个任务处理流程如下。,积件 12-9:COS-II信号量,void TaskPost (void *pdata) sem = OSSemCreate(0); OS_ENTER_CRITICAL(); /* 初始化VIC(省略) */ /* 初始化定时器1(省略) */ /* 目标板初始化TargeInit() (省略) */ OS_EXIT_CRITICAL(); while (1) OSTimeDly(OS_TICKS_PER_SEC * 5/3); OSSemPost (sem); ,读者补出相应的代码,发送信号量任务主要代码如下。,在中断中获得信号量,积件 12-9:COS-II信号量,void Timer1_Exception (void) T1IR = 0x01; VICVectAddr = 0; if (OSSemAccept (sem) 0) if (IO0PIN ,中断服务程序ISR代码如下。,在中断中获得信号量,
链接地址:https://www.31doc.com/p-2493268.html