版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
嵌入式系统设计与实例开发——实时操作系统C/OS-Ⅱ本节提要132546C/OS-Ⅱ简介C/OS-Ⅱ内核结构C/OS-Ⅱ任务通信与同步C/OS-Ⅱ任务管理C/OS-Ⅱ时间管理C/OS-Ⅱ移植RTOS是32位的嵌入式CPU的软件基础RTOS内核提供CPU的管理硬件初时化,MMU,定时器,中断RTOS内核提供任务,内存管理RTOS提供设备管理,文件和网络的支持RTOS提供C/C++,JAVA,图形模块等编程接口C/OS简介
1、C/OS——MicroControllerOS,微控制器操作系统2、C/OS简介美国人JeanLabrosse1992年完成应用面覆盖了诸多领域,如照相机、医疗器械、音响设备、发动机控制、高速公路电话系统、自动提款机等1998年C/OS-II,目前的版本C/OS-IIV2.612000年,得到美国航空管理局(FAA)的认证,可以用于飞行器中网站www.ucos-II.com()公开源代码可移植性(Portable)
绝大部分
C/OS-II的源码是用移植性很强的ANSIC写的。和微处理器硬件相关的那部分是用汇编语言写的。汇编语言写的部分已经压到最低限度,使得
C/OS-II便于移植到其他微处理器上。
C/OS-II可以在绝大多数8位、16位、32位以至64位微处理器、微控制器、数字信号处理器(DSP)上运行。可固化(ROMable)
C/OS-II是为嵌入式应用而设计的,这就意味着,只要读者有固化手段(C编译、连接、下载和固化),
C/OS-II可以嵌入到读者的产品中成为产品的一部分。可裁剪(Scalable)
可以只使用
C/OS-II中应用程序需要的那些系统服务。也就是说某产品可以只使用很少几个
C/OS-II调用,而另一个产品则使用了几乎所有
C/OS-II的功能,这样可以减少产品中的
C/OS-II所需的存储器空间(RAM和ROM)。这种可剪裁性是靠条件编译实现的。C/OS的性能特点(一)占先式(Preemptive)多任务
C/OS-II可以管理64个任务,然而,目前这一版本保留8个给系统。应用程序最多可以有56个任务可确定性
全部
C/OS-II的函数调用与服务的执行时间具有可确定性。任务栈
每个任务有自己单独的栈,
C/OS-II允许每个任务有不同的栈空间,以便压低应用程序对RAM的需求。系统服务
C/OS-II提供很多系统服务,例如邮箱、消息队列、信号量、块大小固定的内存的申请与释放、时间相关函数等。中断管理
中断可以使正在执行的任务暂时挂起,如果优先级更高的任务被该中断唤醒,则高优先级的任务在中断嵌套全部退出后立即执行,中断嵌套层数可达255层。稳定性与可靠性C/OS的性能特点(二)µC/OS-II图书描述了µC/OS-II内部的工作原理随书的CD中包含了源代码工业界最清晰的源代码除英文版外,有中文和韩文版ChineseKoreanEnglishISBN1-57820-103-9美国CMPBOOKISBN7-81077-290-2北京航空航天大学出版社ISBN89-951540-5-5µC/OS-II的各种商业应用全世界有数百种产品在应用:AvionicsMedicalCellphonesRoutersandswitchesHigh-endaudioequipmentWashingmachinesanddryersUPS(UninterruptiblePowerSupplies)IndustrialcontrollersGPSNavigationSystemsMicrowaveRadiosInstrumentationPoint-of-saleterminals更多µC/OS-II提供的系统服务信号量带互斥机制的信号量减少优先级倒置的问题事件标志消息信箱消息队列内存管理时钟管理任务管理µC/GUIandµC/FSµC/GUI嵌入式的用户界面用ANSIC书写支持任何8,16,32-bitsCPU彩色,灰、度,等级或黑白显示代码尺寸小µC/FS嵌入式的文件系统WritteninANSIC用ANSIC书写支持任何8,16,32-bitsCPU支持SMC,MMC,SD,CF,IDE,Flash,RAM其他介质本节提要132546C/OS-Ⅱ简介C/OS-Ⅱ内核结构C/OS-Ⅱ任务通信与同步C/OS-Ⅱ任务管理C/OS-Ⅱ时间管理C/OS-Ⅱ移植C/OS-II的文件结构内核结构任务管理时间管理任务之间通信与同步C/OS的移植C/OS-II的内核结构任务task典型的任务一个无限循环。voidmytask(void*pdata){for(;;){dosomething;waiting;dosomething;}}C/OS
–II2.5版本支持64个任务,每个任务一个特定的优先级。优先级越高,数字越小。系统占用了8个任务,保留优先级为0、1、2、3、OS_LOWEST_PRIO-3、OS_LOWEST_PRIO-2、OS_LOWEST_PRIO-1、OS_LOWEST_PRIO-0。任务状态任务控制块(TCB)任务控制块OS_TCB是一个数据结构,保存该任务的相关参数,包括任务堆栈指针,状态,优先级,任务表位置,任务链表指针等。所有的任务控制块分为两条链表,空闲链表和使用链表。
µC/OS-II任务控制块.typedefstructos_tcb{OS_STK*OSTCBStkPtr;#ifOS_TASK_CREATE_EXT_EN>0void*OSTCBExtPtr;OS_STK*OSTCBStkBottom;INT32UOSTCBStkSize;INT16UOSTCBOpt;INT16UOSTCBId;#endifstructos_tcb*OSTCBNext;structos_tcb*OSTCBPrev;#if(OS_Q_EN&&(OS_MAX_QS>=2))||OS_MBOX_EN||OS_SEM_ENOS_EVENT*OSTCBEventPtr;#endif#if(OS_Q_EN&&(OS_MAX_QS>=2))||OS_MBOX_ENvoid*OSTCBMsg;#endifINT16UOSTCBDly;INT8UOSTCBStat;INT8UOSTCBPrio;INT8UOSTCBX;INT8UOSTCBY;INT8UOSTCBBitX;INT8UOSTCBBitY;#ifOS_TASK_DEL_ENBOOLEANOSTCBDelReq;#endif}OS_TCB;
任务控制块OS_TCB中几个成员的算法OSTCBY=priority>>3;OSTCBBitY=OSMapTbl[priority>>3];OSTCBX=priority&0x07;OSTCBBitX=OSMapTbl[priority&0x07];空任务列表所有的任务控制块都被放置在任务控制块列表数组OSTCBTbl[]中,系统初始化时,所有任务控制块被链接成空任务控制块的单向链表,任务建立后,空任务控制块指针OSTCBFreeList指向的任务控制块就赋给了该任务,然后OSTCBFreeList的值调整为指向链表中的下一个空任务控制块。任务控制块初始化函数INT8UOS_TCBInit(INT8Uprio,OS_STK*ptos,OS_STK*pbos,INT16Uid,INT32Ustk_size,void*pext,INT16Uopt){……}任务级的任务调度--OSSchedC/OS是占先式实时多任务内核,优先级最高的任务一旦准备就绪,则拥有CPU的所有权开始投入运行。C/OS中不支持时间片轮转法,每个任务的优先级要求不一样且是唯一的,所以任务调度的工作就是:查找准备就绪的最高优先级的任务并进行上下文切换。C/OS任务调度所花的时间为常数,与应用程序中建立的任务数无关。根据就绪表确定最高优先级两个关键:优先级数分解为高三位和低三位分别确定;高优先级有着小的优先级号;根据优先级找到任务在就绪任务表中的位置每个就绪的任务都放入就绪表中(readylist)中,就绪表有两个变量:OSRdyGrp、OSRdyTbl[]OSRdyGrp1207654300XXXYYY任务优先级2017654310891514131211181617232221201926242531302928273432333938373635424041474645444350484955545352515856576362616059[0][1][2][3][4][5][6][7]OSRdyTbl[7]XY优先级最低任务(空闲任务)优先级最高任务任务优先级号根据优先级确定就绪表(1)假设优先级为12的任务进入就绪状态,12=1100b,则OSRdyTbl[1]的第4位置1,且OSRdyGrp的第1位置1,相应的数学表达式为:
OSRdyGrp|=0x02;
OSRdyTbl[1]|=0x10;而优先级为21的任务就绪21=10101b,则OSRdyTbl[2]的第5位置1,且OSRdyGrp的第2位置1,相应的数学表达式为:
OSRdyGrp|=0x04;
OSRdyTbl[2]|=0x20;根据优先级确定就绪表(2)从上面的计算我们可以得到:若OSRdyGrp及OSRdyBbl[]的第n位置1,则应该把OSRdyGrp及OSRdyBbl[]的值与2n相或。uC/OS中,把2n的n=0-7的8个值先计算好存在数组OSMapTbl[7]中,也就是:
OSMapTbl[0]=20=0x01(00000001)
OSMapTbl[1]=21=0x02(00000010)
……OSMapTbl[7]=27=0x80(10000000)使任务进入就绪态如果prio是任务是优先级,也是任务的识别号,则将任务放入就绪表,即使任务进入就绪态的方法是:OSRdyGrp|=OSMapTbl[prio>>3];OSRdyTbl[prio>>3]|=OSMapTbl[prio&0x07];假设优先级为12——1100bOSRdyGrp|=0x02;OSRdyTbl[1]|=0x10;使任务脱离就绪态将任务就绪表OSRdyTbl[prio>>3]相应元素的相应位清零,而且当OSRdyTbl[prio>>3]中的所有位都为零时,即全组任务中没有一个进入就绪态时,OSRdyGrp的相应位才为零。If((OSRdyTbl[prio>>3]&=OSMapTbl[prio&0x07])==0)OSRdyGrp&=OSMapTbl[prio>>3];根据就绪表确定最高优先级通过OSRdyGrp值确定高3位,假设为0x24=100100b,---〉对应OSRdyTbl[2]和OSRdyTbl[5],高优先级为2通过OSRdyTbl[2]的值来确定低3位,假设为0x12=010010b,---〉第2个和第5个任务,取高优先级为2,则最高优先级的任务号为17OSRdyGrp0100010000010001任务优先级20176543108915141312110010001026242531302928273432333938373635424041474645444350484955545352515856576362616059[0][1][2][3][4][5][6][7]OSRdyTbl[7]XY源代码中使用了查表法
查表法具有确定的时间,增加了系统的可预测性,uC/OS中所有的系统调用时间都是确定的High3=OSUnMapTbl[OSRdyGrp];Low3=OSUnMapTbl[OSRdyTbl[High3]];Prio=(Hign3<<3)+Low3;OSRdyGrp1207654300XXXYYY任务优先级2017654310891514131211181617232221201926242531302928273432333938373635424041474645444350484955545352515856576362616059[0][1][2][3][4][5][6][7]OSRdyTbl[7]XYINT8UconstOSUnMapTbl[]={0,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0};优先级判定表OSUnMapTbl[256]举例:
如OSRdyGrp的值为01101000B,即0X68,则查得OSUnMapTbl[OSRdyGrp]的值是3,它相应于OSRdyGrp中的第3位置1;如OSRdyTbl[3]的值是11100100B,即0XE4,则查OSUnMapTbl[OSRdyTbl[3]]的值是2,则进入就绪态的最高任务优先级
Prio=3*8+2=26
TaskschedulervoidOSSched(void){INT8Uy;OS_ENTER_CRITICAL();if((OSLockNesting=0)&&(OSIntNesting=0)){ y=OSUnMapTbl[OSRdyGrp]; OSPrioHighRdy=(INT8U)((y<<3)+OSUnMapTbl[OSRdyTbl[y]])if(OSPrioHighRdy!=OSPrioCur){ OSTCBHighRdy=OSTCBPrioTbl[OSPrioHighRdy]; OSCtxSwCtr++; OS_TASK_SW(); }}OS_EXIT_CRITICAL();}voidOSSchedLock(void){if(OSRunning==TRUE){OS_ENTER_CRITICAL();if(OSLockNesting<255){OSLockNesting++;}OS_EXIT_CRITICAL();}}给调度器上锁给调度器开锁voidOSSchedUnlock(void){if(OSRunning==TRUE){OS_ENTER_CRITICAL();if(OSLockNesting>0){OSLockNesting--;if((OSLockNesting==0)&&(OSIntNesting==0)){OS_EXIT_CRITICAL();OSSched(); }else{OS_EXIT_CRITICAL();}}else{OS_EXIT_CRITICAL();}}}任务切换将被挂起的任务寄存器入栈将较高优先级任务的寄存器出栈任务级的任务切换OS_TASK_SW()OS_TASK_SW()是宏调用,含有微处理器的软中断指令OS_TASK_SW()将处理器相关的软件中断机制封装起来,便于操作系统移植调用OS_TASK_SW()前的数据结构低优先级任务
OS_TCBOSTCBCur(1)存贮器低地址存贮器高地址堆栈方向SPR1R2R3R4PCPSW存贮器低地址存贮器高地址高优先级任务
OS_TCBOSTCBHighRdy(3)(2)CPU(4)(5)PSWPCR1R2R3R4保存当前CPU寄存器的值低优先级任务
OS_TCBOSTCBCurPSWPCR1R2R3R4存贮器低地址存贮器高地址堆栈方向SPR1R2R3R4PCPSWPSWPCR1R2R3R4存贮器低地址存贮器高地址高优先级任务
OS_TCBOSTCBHighRdy(3)(2)CPU(4)(5)(1)(3)重新装入要运行的任务低优先级任务
OS_TCBOSTCBCurPSWPCR1R2R3R4存贮器低地址存贮器高地址堆栈方向SPR1R2R3R4PCPSWPSWPCR1R2R3R4存贮器低地址存贮器高地址高优先级任务
OS_TCBOSTCBHighRdyOSTCBCur(1)(2)CPU(4)(4)(1)(3)(3)(4)任务切换OS_TASK_SW()的代码VoidOSCtxSw(void){
将R1,R2,R3及R4推入当前堆栈;
OSTCBCurOSTCBStkPtr=SP;OSTCBCur=OSTCBHighRdy;SP=OSTCBHighRdyOSTCBSTKPtr;
将R4,R3,R2及R1从新堆栈中弹出;执行中断返回指令;}C/OS-II中的中断中断:由于某种事件的发生,而导致程序流程的改变。产生中断的事件称为中断源。CPU响应中断的条件:至少有一个中断源向CPU发出中断信号;系统允许中断,且对此中断信号未予屏蔽中断类型:硬件中断外部中断陷阱中断现场控制量的中断C/OS-II中的中断服务子程序用户中断服务子程序:保存全部CPU寄存器;调用OSIntEnter()或OSIntNesting直接加1;
if(OSIntNesting==1){OSTCBCur->OSTCBStkPtr=SP;}
清中断源;重新开中断;执行用户代码做中断服务;调用OSIntExit();
恢复所有CPU寄存器;执行中断返回指令;uC/OS-IIaboutbeginninganISRvoidOSIntEnter(void){OS_ENTER_CRITICAL();OSIntNesting++;OS_EXIT_CRITICAL();}Searchforhighestpriority–similartoschedulerHalfcontextswitchisdonebyinterruptresponse–i.e.registerssaved中断与时钟节拍时钟节拍(时钟滴答)Tick,是一种定时器中断,可通过编程方式实现时钟节拍是一种特殊的中断,操作系统的心脏。首先32位的整数OSTime加一。对任务列表进行扫描,判断是否有延时任务应该处于准备就绪状态,最后进行上下文切换。时钟节拍中断服务子程序VoidOSTickISR(void){
保存处理器寄存器的值;调用OSIntEnter(),或是将OSIntNesting加1if(OSIntNesting==1){OSTCBCur->OSTCBStkPtr=SP;}
调用OSTimeTick();
清发出中断设备的中断;重新允许中断(可选用)调用OSIntExit();
恢复处理器寄存器的值;执行中断返回指令;}voidOSTimeTick(void){OS_TCB*ptcb;OSTimeTickHook(); (1)ptcb=OSTCBList; (2)while(ptcb->OSTCBPrio!=OS_IDLE_PRIO){ (3)OS_ENTER_CRITICAL();if(ptcb->OSTCBDly!=0){if(--ptcb->OSTCBDly==0){if(!(ptcb->OSTCBStat&OS_STAT_SUSPEND)){ (4)OSRdyGrp|=ptcb->OSTCBBitY; (5)OSRdyTbl[ptcb->OSTCBY]|=ptcb->OSTCBBitX;}else{ptcb->OSTCBDly=1;}}}ptcb=ptcb->OSTCBNext;OS_EXIT_CRITICAL();}OS_ENTER_CRITICAL(); (6)OSTime++; (7)OS_EXIT_CRITICAL();}时钟节拍函数OSTimTick()voidOSTaskIdle(void*pdata){pdata=pdata;for(;;){OS_ENTER_CRITICAL();OSIdleCtr++;OS_EXIT_CRITICAL();}}空闲任务OSTaskIdle()初始化统计任务voidmain(void){OSInit();/*初始化uC/OS-II (1)*//*安装uC/OS-II的任务切换向量 *//*创建用户起始任务(以TaskStart()作为起始任务)(2)*/OSStart();/*开始多任务调度
(3)*/}voidTaskStart(void*pdata){/*安装并启动uC/OS-II的时钟节拍
(4)*/OSStatInit();/*初始化统计任务
(5)*//*创建用户应用程序任务 */for(;;){/*这里是TaskStart()的代码! */}}C/OS-II初始化首先调用系统初始化函数OSIint()。OSIint()初始化μC/OS-Ⅱ所有的变量和数据结构(见OS_CORE.C)。OSInit()建立空闲任务idletask,这个任务总是处于就绪态的。空闲任务OSTaskIdle()的优先级总是设成最低,即OS_LOWEST_PRIO。如果统计任务允许OS_TASK_STAT_EN和任务建立扩展允许都设为1,则OSInit()还得建立统计任务OSTaskStat()并且让其进入就绪态。OSTaskStat的优先级总是设为OS_LOWEST_PRIO-1空闲和统计任务的任务控制块(OS_TCBs)是用双向链表链接在一起的。OSTCBList指向这个链表的起始处。当建立一个任务时,这个任务总是被放在这个链表的起始处。调用OSInit()之后的数据结构空闲缓冲区μC/OS-Ⅱ的启动voidmain(void){OSInit();/*初始化uC/OS-II*/..
通过调用OSTaskCreate()或OSTaskCreateExt()创建至少一个任务;..OSStart();/*开始多任务调度!OSStart()永远不会返回*/}启动多任务voidOSStart(void){INT8Uy;INT8Ux;if(OSRunning==FALSE){y=OSUnMapTbl[OSRdyGrp];x=OSUnMapTbl[OSRdyTbl[y]];OSPrioHighRdy=(INT8U)((y<<3)+x);OSPrioCur=OSPrioHighRdy;OSTCBHighRdy=OSTCBPrioTbl[OSPrioHighRdy]; OSTCBCur=OSTCBHighRdy;OSStartHighRdy(); }}关于OSStartHighRdy
OSStartHighRdy LDR r4,addr_OSTCBCur ;GetcurrenttaskTCBaddress LDR r5,addr_OSTCBHighRdy ;GethighestprioritytaskTCBaddress LDR r5,[r5] ;getstackpointer LDR sp,[r5] ;switchtothenewstack STR r5,[r4] ;setnewcurrenttaskTCBaddress LDMFD sp!,{r4} ;YYY MSR SPSR_cxsf,r4 LDMFD sp!,{r4} ;getnewstatefromtopofthestack MSR CPSR_cxsf,r4 ;CPSRshouldbeSVC32Mode LDMFD sp!,{r0-r12,lr,pc} ;startthenewtask调用OSStart()之后的数据结构
本节提要132546C/OS-Ⅱ简介C/OS-Ⅱ内核结构C/OS-Ⅱ任务通信与同步C/OS-Ⅱ任务管理C/OS-Ⅱ时间管理C/OS-Ⅱ移植建立任务UseoneoftwoservicesOSTaskCreate()OSTaskCreateExt()建立任务,OSTaskCreate()INT8UOSTaskCreate(void(*task)(void*pd),void*pdata,OS_STK*ptos,INT8Uprio){void*psp;INT8Uerr;if(prio>OS_LOWEST_PRIO){(1)return(OS_PRIO_INVALID);}OS_ENTER_CRITICAL();if(OSTCBPrioTbl[prio]==(OS_TCB*)0){ (2)OSTCBPrioTbl[prio]=(OS_TCB*)1;(3)OS_EXIT_CRITICAL();(4)psp=(void*)OSTaskStkInit(task,pdata,ptos,0);err=OSTCBInit(prio,psp,(void*)0,0,0,(void*)0,0);if(err==OS_NO_ERR){ OS_ENTER_CRITICAL();OSTaskCtr++; OSTaskCreateHook(OSTCBPrioTbl[prio]); OS_EXIT_CRITICAL();if(OSRunning){ OSSched(); }}else{OS_ENTER_CRITICAL();OSTCBPrioTbl[prio]=(OS_TCB*)0; OS_EXIT_CRITICAL();}return(err);}else{OS_EXIT_CRITICAL();return(OS_PRIO_EXIST);}}堆栈检验,OSTaskStkChk()删除任务,OSTaskDel()请求删除任务,OSTaskDelReq()改变任务的优先级,OSTaskChangePrio()挂起任务,OSTaskSuspend()恢复任务,OSTaskResume()其它相关函数本节提要132546C/OS-Ⅱ简介C/OS-Ⅱ内核结构C/OS-Ⅱ任务通信与同步C/OS-Ⅱ任务管理C/OS-Ⅱ时间管理C/OS-Ⅱ移植时间管理Fiveservices:OSTimeDLY()OSTimeDLYHMSM()OSTimeDlyResmue()OStimeGet()OSTimeSet()OSTimeDly()voidOSTimeDly(INT16Uticks){if(ticks>0){OS_ENTER_CRITICAL();if((OSRdyTbl[OSTCBCur->OSTCBY]&=~OSTCBCur->OSTCBBitX)==0){OSRdyGrp&=~OSTCBCur->OSTCBBitY;}OSTCBCur->OSTCBDly=ticks;OS_EXIT_CRITICAL();OSSched();}}延时详解OSTimeDlyHMSM()本节提要132546C/OS-Ⅱ简介C/OS-Ⅱ内核结构C/OS-Ⅱ任务通信与同步C/OS-Ⅱ任务管理C/OS-Ⅱ时间管理C/OS-Ⅱ移植任务间通信手段C/OS中,采用多种方法保护任务之间的共享数据和提供任务之间的通信。提供OS_ENTER_CRITICAL和OS_EXIT_CRITICAL来对临界资源进行保护OSSchedLock()禁止调度保护任务级的共享资源。提供了经典操作系统任务间通信方法:信号量、邮箱、消息队列,事件标志。事件控制块ECB
程序4.5ECB的结构如下
---------------------------------------------------------------------typedefstruct{void*OSEventPtr;/*指向消息或消息队列的指针*/INT8UOSEventTbl[OS_EVENT_TBL_SIZE];/*等待任务列表*/INT16UOSEventCnt;/*计数器(当事件是信号量时)*/INT8UOSEventType;/*事件类型:信号量、邮箱等*/INT8UOSEventGrp;/*等待任务组*/}OS_EVENT;
与TCB类似的结构,使用两个链表,空闲链表与使用链表所有的通信信号都被看成是事件(event),一个称为事件控制块(ECB,EventControlBlock)的数据结构来表征每一个具体事件,ECB的结构如下事件的等待任务列表空闲事件控制块链表事件控制块TCB的操作对事件控制块进行的操作包括初始化一个事件控制块OS_EventWaitListInit();使一个任务进入就绪态OS_EventTaskRdy();使一个任务进入等待某事件的状态OS_EventTaskWait();因为等待超时而使一个任务进入就绪态OS_EventTO()。信号量semaphore信号量在多任务系统中用于:控制共享资源的使用权、标志事件的发生、使两个任务的行为同步。uC/OS中信号量由两部分组成:信号量的计数值和等待该信号任务的等待任务表。信号量的计数值可以为二进制,也可以是其他整数。系统通过OSSemPend()和OSSemPost()来支持信号量的两种原子操作P()和V()。P()操作减少信号量的值,如果新的信号量的值不大于0,则操作阻塞;V()操作增加信号量的值。任务、中断服务子程序和信号量之间的关系信号量操作µC/OS-II提供了5个对信号量进行操作的函数。它们是:OSSemCreate()OSSemPend()OSSemPost()OSSemAccept()OSSemQuery()函数。邮箱邮箱是µC/OS-II中另一种通讯机制,它可以使一个任务或者中断服务子程序向另一个任务发送一个指针型的变量。该指针指向一个包含了特定“消息”的数据结构。为了在µC/OS-II中使用邮箱,必须将OS_CFG.H中的OS_MBOX_EN常数置为1。使用邮箱之前,必须先建立该邮箱。该操作可以通过调用OSMboxCreate()函数来完成,并且要指定指针的初始值。µC/OS-II提供了5种对邮箱的操作:OSMboxCreate(),OSMboxPend(),OSMboxPost(),OSMboxAccept()和OSMboxQuery()函数任务、中断服务子程序和邮箱之间的关系消息队列消息队列是µC/OS-II中另一种通讯机制,它可以使一个任务或者中断服务子程序向另一个任务发送以指针方式定义的变量。因具体的应用有所不同,每个指针指向的数据结构变量也有所不同。为了使用µC/OS-II的消息队列功能,需要在OS_CFG.H文件中,将OS_Q_EN常数设置为1,并且通过常数OS_MAX_QS来决定µC/OS-II支持的最多消息队列数。在使用一个消息队列之前,必须先建立该消息队列。这可以通过调用OSQCreate()函数,并定义消息队列中的单元数(消息数)来完成。µC/OS-II提供了7个对消息队列进行操作的函数:OSQCreate(),OSQPend(),OSQPost(),OSQPostFront(),OSQAccept(),OSQFlush()和OSQQuery()函数任务、中断服务子程序和消息队列之间的关系操作系统的启动和运行过程嵌入式控制器硬件初始化操作系统初始化LCD初始化装载字库调用系统配置文件创建任务初始化用户界面、时钟启动多任务调度主
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《墨分五色》教学课件-2025-2026学年辽海版(新教材)小学美术三年级下册
- 2025-2026学年鲁画版心理健康三年级上册全册教案(教学设计)
- 农贸市场疫情防控常态化
- 3.2.2 实体关系标注-汽修文本实体关系标注
- 2025-2026学年广西壮族自治区贵港市高三3月份模拟考试化学试题(含答案解析)
- 非遗蜀绣工艺技法与作品赏析
- 某麻纺厂生产环境规范
- AI在柬埔寨语中的应用
- 2026年数字疗法在慢性病管理中的创新应用与发展展望
- 网络综合布线模拟试题及答案
- 面部注射软组织填充剂的安全性专家共识(2024)解读
- 西溪里花园勘察报告
- 医院院长季度汇报
- 供货保证措施和储运服务方案
- (高清版)DB64∕T 2146-2025 《工矿企业全员安全生产责任制建设指南》
- 【答案】《影像技术学》(东南大学)章节作业慕课答案
- 采棉机培训课件
- 新概念第一册家长会课件
- 2025年湖北省中考物理+化学合卷试题(含答案及解析)
- QGDW11970.4-2023输变电工程水土保持技术规程第4部分水土保持监理
- hr性格测试题目及答案
评论
0/150
提交评论