欢迎来到天天文库
浏览记录
ID:56987810
大小:190.50 KB
页数:17页
时间:2020-07-25
《嵌入式实时操作系统(第7课时)课件.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、嵌入式实时操作系统第三章µc/os-II的中断和时钟3.3时间管理3.3.1任务的延时µc/os-II规定:除了空闲任务之外的所有任务必须在任务中合适的位置调用系统提供的函数OSTimeDly(),使当前任务的运行延时(暂停)一段时间并进行一次任务调度,以让出CPU的使用权。OSTimeDly()函数的代码如下:voidOSTimeDly(INT16Uticks){#ifOS_CRITICAL_METHOD==3OS_CPU_SRcpu_sr;#endifif(ticks>0){OS_ENTER_C
2、RITICAL();if((OSRdyTbl[OSTCBCur->OSTCBY]&=~OSTCBCur->OSTCBBitX)==0){OSRdyGrp&=~OSTCBCur->OSTCBBitY;//取消当前任务的就绪状态}OSTCBCur->OSTCBDly=ticks;//延时节拍数存入任务控制块OS_EXIT_CRITICAL();OS_Sched();}}函数的参数ticks是以时钟节拍数为单位的延时时间的。为了能使用更为习惯的方法来使任务延时,µc/os-II还提供了一个可以用时、分、秒
3、为参数的任务的延时函数OSTimeDlyHMSM()。该函数的原型如下:INT8UOSTimeDlyHMSM(INT8Uhours,//时INT8Uminutes,//分INT8Useconds,//秒INT16Umilli,//毫秒);这个函数与函数OSTimeDly()一样也要引发一次调度。调用了函数OSTimeDly()或OSTimeDlyHMSM()的任务,当规定的延时时间期满,或有其他任务通过调用函数OSTimeDlyResume()取消了延时时,它会立即进入就绪状态。3.3.2取消任务的
4、延时延时的任务可通过在其他任务中调用函数OSTimeDlyResume()取消延时而进入就绪状态。如果任务比正在运行的任务优先级别高,则立即引发一次任务调度。OSTimeDlyResume()函数的原型如下:INT8UOSTimeDlyResume(INT8Uprio){#ifOS_CRITICAL_METHOD==3OS_CPU_SRcpu_sr;#endifOS_TCB*ptcb;if(prio>=OS_LOWEST_PRIO){return(OS_PRIO_INVALID);}OS_ENTER
5、_CRITICAL();ptcb=(OS_TCB*)OSTCBPrioTbl[prio];if(ptcb!=(OS_TCB*)0){if(ptcb->OSTCBDly!=0){ptcb->OSTCBDly=0;if((ptcb->OSTCBStat&OS_STAT_SUSPEND)==OS_STAT_RDY){OSRdyGrp
6、=ptcb->OSTCBBitY;OSRdyTbl[ptcb->OSTCBY]
7、=ptcb->OSTCBBitX;OS_EXIT_CRITICAL();OS_Sched();
8、}else{OS_EXIT_CRITICAL();}return(OS_NO_ERR);}else{OS_EXIT_CRITICAL();return(OS_TIME_NOT_DLY);}}OS_EXIT_CRITICAL();return(OS_TASK_NOT_EXIST);}例3-3本例应用程序的任务使用了延时函数OSTimeDly()进行延时。在任务MyTask中还调用了函数OSTimeDlyResume(prio)取消了任务YouTask的延时。为了观察任务YouTask的延时时间的变化,
9、在钩子函数OSTimeTickHook()输入了任务YouTask在延时时间到时的时钟节拍数。答:应用程序代码如下:/******************************************TEST****************************************/#include“includes.h”#defineTASK_STK_SIZE512//任务堆栈长度OS_STKMyTaskStk[TASK_STK_SIZE];//定义任务堆栈区OS_STKYouTaskSt
10、k[TASK_STK_SIZE];//定义任务堆栈区INT16Skey;//用于退出µc/os-II的键INT8Ux=0,y=0;//字符显示位置voidMyTask(void*data);//声明任务voidYouTask(void*data);//声明任务/*************************************主函数***********************************/voidmain(void){char*s_M=“M”;/
此文档下载收益归作者所有