电子与信息技术专业.ppt
文本预览下载声明
电子与信息技术专业 ARM嵌入式技术课程 积件 12-9:μCOS-II信号量 制作教师:谢利民 全国职业教育电子与信息技术专业数字化资源共建共享 江苏无锡机电高等职业技术学校 WUXI MACHINERY AND ELECTRON HIGER PROFESSIONAL AND TECHNIAL SCHOOL 积件 12-9:μCOS-II信号量 简介 ISR与任务同步 信号量的工作方式 1 2 3 任务间同步 在中断中获得信号量 资源同步 4 5 6 积件 12-9:μCOS-II信号量 简介 信号量值大于0 调用OSSemPost() 信号量 信号量值加1 在实时多任务系统中,信号量被广泛用于:任务间对共享资源的互斥、任务和中断服务程序之间的同步、任务之间的同步。 信号量值减1 调用OSSemPend() 信号量 当任务调用OSSemPost()函数发送信号量时; 当信号量值大于0,任务调用OSSemPend()函数接收信号量时; 积件 12-9:μCOS-II信号量 信号量值等于0 延时等待信号量 注意:μC/OS-II不允许在中断服务程序中等待信号量。 信号量 信号量到来,正常返回 信号量值等于0 延时等待信号量 延时到,无信号量,返回超时错误 调用OSSemPend() 调用OSSemPend() 当信号量值等于0,任务调用OSSemPend()函数接收信号量时。 简介 积件 12-9:μCOS-II信号量 前面章节我们学习了互斥信号量,下面对计数信号量与互斥信号量做一个对比。 能 不能 能否实现任务间以及中断与任务间的同步 0~65535 0或1 取值 不能 能 能否解决优先级反转问题 能 能 能否用于资源同步以实现对共享资源的独占 不能 计数信号量 不能 互斥信号量 实现同步时能否传递数据 简介 积件 12-9:μCOS-II信号量 信号量的工作方式 在实际的应用中,常用信号量实现任务间的同步,OSSemPend()和OSSemPost()会出现在不同任务的不同函数中,但不一定成对出现。 1.任务间同步 注意:在实际的应用中,还有多对多、一对多信号量操作的情况,但很不常见,建议读者不要设计出这样的操作方式,因为这样会带来很多的麻烦。 任务3 中断1 任务2 任务1 任务2 任务1 信号量1 信号量 信号量 信号量 信号量 信号量1 信号量 信号量 一对一同步 多对一同步 积件 12-9:μCOS-II信号量 在嵌入式系统中,经常使用信号量访问共享资源来实现资源同步。在使用时,注意发送信号量函数OSSemPost()与等待信号量函数OSSemPend()必须成对出现在同一个任务调用的函数中,才能实现资源同步。 2.资源同步 信号量的工作方式 积件 12-9:μCOS-II信号量 ISR与任务同步 下面以示例来说明如何现实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(省略) */ /* 初始化定时器1(省略) */ /* 目标板初始化TargeInit() (省略) */ OS_EXIT_CRITICAL(); while (1) { OSSemPend(sem, 0, err); IO0CLR = BEEP; OSTimeDly(60); IO0SET = BEEP; OSTimeDly(60); } } 创建信号量 初始化工作 蜂鸣器响 延时60个节拍 蜂鸣器灭 延时60个节拍 进入临界段 退出临界段 等待信号量 读者补出相应的代码 蜂鸣器报警任务示例代码如下。 ISR与任务同步 积件
显示全部