chap07-信号量管理_第1页
chap07-信号量管理_第2页
chap07-信号量管理_第3页
chap07-信号量管理_第4页
chap07-信号量管理_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

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

文档简介

1 2020 4 6 嵌入式实时操作系统 C OS II 2020 4 6 2 第7章信号量管理 C OS II中的信号量由两部分组成 一个是信号量的计数值 它是一个16位的无符号整数 0到65 535之间 另一个是由等待该信号量的任务组成的等待任务表 用户要在OS CFG H中将OS SEM EN开关量常数置成1 这样 C OS II才能支持信号量 3 表OS CFG H中的信号量配置常数 4 信号量用于对共享资源的访问 符号旁边的数字N代表可用资源数 信号量用于表示某事件的发生 这时的数字N代表事件已经发生的次数 任务 中断服务子程序和信号量之间的关系 5 当ECB成员OSEventType设置为OS EVENT TYPE SEM时 这个ECB描述的就是一个信号量 信号量由信号量计数器和任务等待表两部分组成 有任务申请信号量 若EventCnt 0 则OSEventCnt减1 若OSEventCnt 0 将任务列入OSEventTbl 而使任务处于等待状态 有任务释放信号量 则在OSEventTbl 表中找出优先级最高的等待任务 并在使它就绪后引发一次调度 若任务等待表中没有等待任务 则信号量计数器就只简单地加1 一个信号量的事件控制块 任务等待表 OSEventTbl pevent 使用事件控制块成员OSEventCnt作为计数器 有4个等待任务的信号量 信号量不使用事件控制块成员OSEventPtr 6 7 00建立一个信号量 OSSemCreate 信号量操作系统函数定义在OS SEM C文件 在使用信号量之前 必须创建信号量 创建信号量系统函数的原型 OS EVENT OSSemCreate INT16Ucnt 信号量计数初值 功能 从OSEventFreeList中申请一个ECB 并进行初始化 用cnt初始化ECB Sem OSEventCnt 返回一个已初始化的ECB的指针 7 OS EVENT OSSemCreate INT16Ucnt ifOS CRITICAL METHOD 3 AllocatestorageforCPUstatusregister OS CPU SRcpu sr endifOS EVENT pevent if OSIntNesting 0 SeeifcalledfromISR return OS EVENT 0 can tCREATEfromanISR OS ENTER CRITICAL pevent OSEventFreeList Getnextfreeeventcontrolblock if OSEventFreeList OS EVENT 0 SeeifpooloffreeECBpoolwasempty OSEventFreeList OS EVENT OSEventFreeList OSEventPtr OS EXIT CRITICAL 8 if pevent OS EVENT 0 Getaneventcontrolblock pevent OSEventType OS EVENT TYPE SEM pevent OSEventCnt cnt Setsemaphorevalue pevent OSEventPtr void 0 UnlinkfromECBfreelist OS EventWaitListInit pevent Initializeto nobodywaiting onsem return pevent 9 OS EVENT UART Flag 声明事件指针变量INT8Uerr 声明全局状态变量 voidmain void OSInit UART Flag OSSemCreate 1 创建信号量OSTaskCreate Task A 创建任务AOSTaskCreate Task B 创建任务BOSStart 信号量的应用举例1 主函数部分 10 7 01删除一个信号量 OSSemDel 删除信号量系统函数的原型 OS EVENT OSSemDel OS EVENT pevent 信号量指针指示删除目标INT8Uopt 删除条件 方式INT8U err 函数执行情况 备注 信号量不能在ISR中删除 1 删除系统不再使用的信号量 归还事件资源 2 参数opt用于约定删除信号量的条件 其可有两个取值 OS DEL NO PEND 若事件无等待任务时 删除该事件且 err OS NO ERR 否则直接返回 且 err OS ERR TASK WAITING OS DEL ALLWAYS 直接删除 且 err OS NO ERR 错误的opt参数时 err OS ERR INVALID OPT 11 OS EVENT OSSemDel OS EVENT pevent INT8Uopt INT8U err ifOS CRITICAL METHOD 3 AllocatestorageforCPUstatusregister OS CPU SRcpu sr endifBOOLEANtasks waiting if OSIntNesting 0 SeeifcalledfromISR err OS ERR DEL ISR can tDELETEfromanISR return pevent 12 ifOS ARG CHK EN 0if pevent OS EVENT 0 Validate pevent err OS ERR PEVENT NULL return pevent if pevent OSEventType OS EVENT TYPE SEM Validateeventblocktype err OS ERR EVENT TYPE return pevent endifOS ENTER CRITICAL if pevent OSEventGrp 0 x00 Seeifanytaskswaitingonsemaphore tasks waiting TRUE Yes else tasks waiting FALSE No 13 switch opt caseOS DEL NO PEND Deletesemaphoreonlyifnotaskwaiting if tasks waiting FALSE pevent OSEventType OS EVENT TYPE UNUSED pevent OSEventPtr OSEventFreeList ReturnEventControlBlocktofreelist OSEventFreeList pevent Getnextfreeeventcontrolblock OS EXIT CRITICAL err OS NO ERR return OS EVENT 0 Semaphorehasbeendeleted else OS EXIT CRITICAL err OS ERR TASK WAITING return pevent 14 caseOS DEL ALWAYS Alwaysdeletethesemaphore while pevent OSEventGrp 0 x00 ReadyALLtaskswaitingforsemaphore OS EventTaskRdy pevent void 0 OS STAT SEM pevent OSEventType OS EVENT TYPE UNUSED pevent OSEventPtr OSEventFreeList ReturnEventControlBlocktofreelist OSEventFreeList pevent Getnextfreeeventcontrolblock OS EXIT CRITICAL if tasks waiting TRUE Rescheduleonlyiftask s werewaiting OS Sched Findhighestprioritytaskreadytorun err OS NO ERR return OS EVENT 0 Semaphorehasbeendeleted 15 default OS EXIT CRITICAL err OS ERR INVALID OPT return pevent 16 7 02等待一个信号量 OSSemPend 等待信号量系统函数的原型 voidOSSemPend OS EVENT pevent 信号量指针指示申请目标INT16Utimeout 等待限时 OSTick数INT8U err 函数执行情况 备注 参数timeout用于约定本任务等待申请信号量的时限 单位是Tick 当等待超时时 本任务被uC OS II直接转入就续状态 当该参数为0时 含义为无限时等待 通过查阅 err参数可知函数的执行情况 操作 如果信号量有效 ECB Sem OSEventCnt 0 则OSEventCnt 本任务goon 否则 将申请的事件的ECB OSEventGrp及OSEventTbl 相应位置1 本Task转入Wait状态并执行OS Sched 17 信号量的操作 等待信号量 等待信号量系统函数的原型 voidOSSemPend OS EVENT pevent 信号量指针指示申请目标INT16Utimeout 等待限时INT8U err 函数执行情况 函数返回值解释 OS NO ERR信号量申请成功 OS ERR EVENT TYPE申请的不是信号量事件 OS ERR EVENT NULL申请的信号量不存在 OS ERR PEND ISR不能在ISR中申请信号量 OS TIMEOUT申请信号量超时退出 18 voidOSSemPend OS EVENT pevent INT16Utimeout INT8U err ifOS CRITICAL METHOD 3 AllocatestorageforCPUstatusregister OS CPU SRcpu sr endifif OSIntNesting 0 SeeifcalledfromISR err OS ERR PEND ISR can tPENDfromanISR return ifOS ARG CHK EN 0if pevent OS EVENT 0 Validate pevent err OS ERR PEVENT NULL return if pevent OSEventType OS EVENT TYPE SEM Validateeventblocktype err OS ERR EVENT TYPE return endif OS ENTER CRITICAL if pevent OSEventCnt 0 Ifsem ispositive resourceavailable pevent OSEventCnt decrementsemaphoreonlyifpositive OS EXIT CRITICAL err OS NO ERR return Otherwise mustwaituntileventoccurs OSTCBCur OSTCBStat OS STAT SEM Resourcenotavailable pendonsemaphore OSTCBCur OSTCBDly timeout StorependtimeoutinTCB OS EventTaskWait pevent Suspendtaskuntileventortimeoutoccurs OS EXIT CRITICAL OS Sched Findnexthighestprioritytaskready OS ENTER CRITICAL if OSTCBCur OSTCBStat voidTask A void pdata for 任务体A OSSemPend UART Flag 0 Task A延时nnnn个时钟节拍 信号量的应用举例1 任务部分 voidTask B void pdata for 任务体B OSSemPend UART Flag 0 Task B延时mmm个时钟节拍 22 7 03发送一个信号量 OSSemPost 信号量的操作 发送信号量 发送信号量也称为释放信号量 释放信号量系统函数的原型 INT8UOSSemPost OS EVENT pevent 信号量指针指示释放目标 操作 检查是否还有等待该信号量的任务 若有则OS Sched 调度优先级最高的任务运行 否则OSEventCnt 函数返回值解释 OS NO ERR释放成功 OS ERR EVENT TYPE释放的不是信号量事件 OS SEM OVF信号量 个数 65535 溢出 23 INT8UOSSemPost OS EVENT pevent ifOS CRITICAL METHOD 3 AllocatestorageforCPUstatusregister OS CPU SRcpu sr endif ifOS ARG CHK EN 0if pevent OS EVENT 0 Validate pevent return OS ERR PEVENT NULL if pevent OSEventType OS EVENT TYPE SEM Validateeventblocktype return OS ERR EVENT TYPE endif OS ENTER CRITICAL if pevent OSEventGrp 0 x00 Seeifanytaskwaitingforsemaphore OS EventTaskRdy pevent void 0 OS STAT SEM Readyhighestpriotaskwaitingonevent OS EXIT CRITICAL OS Sched Findhighestprioritytaskreadytorun return OS NO ERR if pevent OSEventCntOSEventCnt Incrementsemaphorecounttoregisterevent OS EXIT CRITICAL return OS NO ERR OS EXIT CRITICAL Semaphorevaluehasreacheditsmaximum return OS SEM OVF voidTask A void pdata for 任务体A OSSemPend UART Flag 0 Task A延时nnnn个时钟节拍 信号量的应用举例1 任务部分 voidTask B void pdata for 任务体B OSSemPend UART Flag 0 Task B延时mmm个时钟节拍 26 7 04无等待地请求一个信号量 OSSemAccept 无等待请求信号量系统函数的原型 INT16UOSSemAccept OS EVENT pevent 信号量指针指示申请目标 该函数无等待地申请指定的信号量 函数返回值解释 0信号量申请成功 0信号量申请不成功 27 INT16UOSSemAccept OS EVENT pevent ifOS CRITICAL METHOD 3 AllocatestorageforCPUstatusregister OS CPU SRcpu sr endifINT16Ucnt ifOS ARG CHK EN 0if pevent OS EVENT 0 Validate pevent return 0 if pevent OSEventType OS EVENT TYPE SEM Validateeventblocktype return 0 endif 28 OS ENTER CRITICAL cnt pevent OSEventCnt if cnt 0 Seeifresourceisavailable pevent OSEventCnt Yes decrementsemaphoreandnotifycaller OS EXIT CRITICAL return cnt Returnsemaphorecount 29 7 05查询一个信号量的当前状态 OSSemQuery 查询信号量系统函数的原型 INT8UOSSemQuery OS EVENT pevent 信号量指针指示申请目标OS SEM DATA pdata 信号量查询结果数据结构指针 Typedefstruct INT16UOSCnt INT8UOSEventTbl OS EVENT TBL SIZE INT8UOSEventGrp OS SEM DATA 备注 该数据类型在uCOS II H文件中定义 OS NO ERR信号量查询成功 在使用该函数前要先定义一个OS SEM DATA类型的变量 30 INT8UOSSemQuery OS EVENT pevent OS SEM DATA pdata ifOS CRITICAL METHOD 3 AllocatestorageforCPUstatusregister OS CPU SRcpu sr endifINT8U psrc INT8U pdest ifOS ARG CHK EN 0if pevent OS EVENT 0 Validate pevent return OS ERR PEVENT NULL if pevent OSEventType OS EVENT TYPE SEM Validateeventblocktype return OS ERR EVENT TYPE endif OS ENTER CRITICAL pdata OSEventGrp pevent OSEventGrp Copymessagemailboxwaitlist psrc endif ifOS EVENT TBL SIZE 4 pdest psrc endif ifOS EVENT TBL SIZE 5 pdest psrc endif ifOS EVENT TBL SIZE 6 pdest psrc endif ifOS EVENT TBL SIZE 7 pdest psrc endifpdata OSCnt pevent OSEventCnt Getsemaphorecount OS EXIT CRITICAL return OS NO ERR 信号量应用举例 信号量的应用举例1 某系统中有Task A Task B两个任务都要使用公共资源 例如UART 他们可以分别使用 但不能同时使用 可用信号量的方法解决此问题 34 OS EVENT UART Flag 声明事件指针变量INT8Uerr 声明全局状态变量 voidmain void OSInit UART Flag OSSemCreate 1 创建信号量OSTaskCreate Task A 创建任务AOSTaskCreate

温馨提示

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

评论

0/150

提交评论