资源描述:
《嵌入式系统设计-ucos原理》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、uCOS原理及移植u:MicroC:controluCOS:适合于小的、控制器的操作系统小巧公开源代码,详细的注解可剥夺实时内核可移植性强多任务确定性1概要内核结构-任务以及调度机制任务间通信uC/OS的移植在PC机上运行uC/OS2任务task典型的一个无限循环。voidmytask(void*pdata){for(;;){dosomething;waiting;dosomething;}}支持64个任务,每个任务一个特定的优先级。优先级越高,数字越小系统占用了两个任务,空闲任务和统计任务。3任务的数据结构—任务控制块任务控制块OS_tcb,包括任务堆栈指针,状态,优
2、先级,任务表位置,任务链表指针等。所有的任务控制块分为两条链表,空闲链表和使用链表。OSTCBFreeListTCB0TCB1TCBn新任务TCB(1)空(2)(3)prenext图4.3TCB的双向链表结构4任务控制块结构Structos_tcb{OS_STK*OSTCBStkPtr;structos_tcb*OSTCBNext;structos_tcb*OSTCBprev;OS_EVENT*OSTCBEventPtr;void*OSTCBMsg;INT16UOSTCBDly;INT8UOSTCBStat;INT8UOSTCBPrio;INT8UOSTCBX,OSTC
3、BY,OSTCBBitX,OSTCBBitY;}OS_TCB5任务的状态6任务的状态OSTCBStat运行,就绪,等待,挂起…可以有多个准备就绪的任务,但一个时刻只有一个任务可以运行,OSHighRdy挂起队列邮箱信号量低四位OSTCBStat7任务的调度--OSScheduC/OS是占先式实时多任务内核,优先级最高的任务一旦准备就绪,则拥有CPU的所有权开始投入运行。就绪任务表:用于存贮每个任务的就绪状态标志。由两个变量组成:OSRedyGrp:8位,每位表示一组(8个)任务中是否有就绪的任务。OSRdyTbl[]:位图方式表示某个任务是否就绪。8任务队列对于就绪任务
4、,如果采用上述队列方式进行管理,在基于优先级的调度处理中,要获得当前具有最高优先级的就绪任务:方式一:任务就绪时,把就绪任务的任务控制块放在就绪队列的末尾。调度程序需要从就绪队列的头部到尾部进行一次遍历,才能获得就绪队列中具有最高优先级的任务;方式二:就绪队列按照优先级从高到低的顺序排列。新的就绪任务到达时,需要插入到就绪队列的合适位置,确保就绪队列保持优先级从高到低排列的顺序性。9任务队列在这两种处理方式中,所花费的时间与任务数量有密切的关系,具有不确定性。为提高实时内核的确定性,可采用一种被称为优先级位图的就绪任务处理算法。10FreeTCBsafterOS_TCB
5、Init()inuCOS11优先级位图算法OSRdyGrp:优先级就绪组OSRdyTbl:优先级就绪表35:00100011charOSRdyGrp;charOSRdyTbl[8];12优先级映射表OSMapTblcharOSMapTbl[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};OSMapTbl的数组元素的下标与任务优先级的低三位相对应。OSMapTbl的数组元素对应的二进制值中,位为1的位表示OSRdyGrp或是OSRdyTbl[]的对应位也为1。35:0010001113INT8UconstOSUnMapTbl[]=
6、{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
7、,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,/*0x00to0x0F*//*0x00to0x1F*//*0x00to0x6F*//*0x0