• / 11

东软操作系统三级项目.doc

资源描述:
《东软操作系统三级项目.doc》由本站会员分享,支持在线阅读,更多《东软操作系统三级项目定稿.doc》相关的内容可在三九文库网上搜索。

项目报告书项目名称C/OSII操作系统的进程调度模块源码分析项目组组长项目组成员及分工制定日期一、目的辅助理解课堂上讲授的进程的定义、进程控制块、进程的创建以及处理及调度算法等知识点。二、任务分析C/OSII操作系统中的进程调度模块的源码实现。进而理解进程控制块的结构,理解进程运行的并发性,掌握进程调度的方法在C/OSII操作系统中的具体实现。三、小组内任务完成情况撰写说明:小组各成员按照任务分工对任务完成情况进行说明,形式可以是文字描述、代码描述、流程图描述或屏幕截图等。1、uC/OS的任务控制块0.8完成人:任务完成情况说明:任务控制块:任务控制块是一个结构体数据结构。

用于记录各个任务的信息。当任务的CPU的使用权被剥夺时,uCOSII用它来保存任务的当前状态。当任务重新获得CPU的使用权时,任务控制块能确保任务从当时被中断的那一点丝毫不差的继续执行。任务控制块全部存放在RAM中。typedefstructostcb{OSSTK*OSTCBStkPtr;/*指向当前任务使用的堆栈的栈顶。uCOSII允许每个任务堆栈的大小可以不同,这样用户可以根据实际需要定义任务堆栈的大小,可以节省RAM的空间。另外,由于OSTCBStkPtr是该结构体中的第一个变量,所以可以使用汇编语言方便的访问,因为其偏移量是0。当切换任务时,用户可以容易的知道就绪任务中优先级最高任务的栈顶。

*/#ifOSTASKCREATEEXTEN>0uvoid*OSTCBExtPtr;/*指向用户定义的扩展任务控制块*/OSSTK*OSTCBStkBottom;/*指向任务堆栈的栈底。需要考虑一下你使用的MCU的栈指针是按照从高到低还是从低到高变化的。这个变量在测试任务需要的栈空间的时候需要使用。*/INT32UOSTCBStkSize;/*同样,该变量也是测试任务需要的栈空间需要。需要注意的是,该变量存储的是指针元的数目,而不是字节数目。*/INT16UOSTCBOpt;/*传给函数OSTaskCreateExt()的选择项。目前有OSTASKOPTSTKCHK。

OSTASKOPTSTKCLR,OSTASKOPTSAVEEP*/INT16UOSTCBId;/*TaskID(0..65535),目前没有使用。*/#endifstructostcb*OSTCBNext;structostcb*OSTCBPrev;/*指向TCB的双向链表的前后链接,在OSTimeTick()中使用,用来刷新各任务的任务延迟变量.OSTCBDly。*/#if(OSEVENTEN)||(OSFLAGEN>0u)OSEVENT*OSTCBEventPtr;/*指向事件控制块的指针。*/#endif#if(OSEVENTEN)&。

&(OSEVENTMULTIEN>0u)OSEVENT**OSTCBEventMultiPtr;/*指向多重事件控制块的指针*/#endif#if((OSQEN>0u)&&(OSMAXQS>0u))||(OSMBOXEN>0u)void*OSTCBMsg;/*指向传递给任务的消息的指针。*/#endif#if(OSFLAGEN>0u)&&(OSMAXFLAGS>0u)#ifOSTASKDELEN>0uOSFLAGNODE*OSTCBFlagNode;/*指向事件标志的节点的指针。

*/#endifOSFLAGSOSTCBFlagsRdy;/*当任务等待事件标志组时,该变量是使任务进入就绪态的事件标志。*/#endifINT32UOSTCBDly;/*记录事件延时或者挂起的时间。*/INT8UOSTCBStat;/*任务状态字。比如就绪态、等待*/INT8UOSTCBStatPend;/*任务挂起状态。*/INT8UOSTCBPrio;/*任务优先级*/INT8UOSTCBX;/*计算优先级用*/INT8UOSTCBY;/*计算优先级用*/#ifOSLOWESTPRIO<=63uINT8UOSTCBBitX;/*计算优先级用*/INT8UOSTCBBitY。

/*计算优先级用*/#elseINT16UOSTCBBitX;/*计算优先级用*/INT16UOSTCBBitY;/*计算优先级用*/#endif#ifOSTASKDELEN>0uINT8UOSTCBDelReq;/*表示任务是否需要删除。*/#endif#ifOSTASKPROFILEEN>0uINT32UOSTCBCtxSwCtr;/*任务切换的次数。*/INT32UOSTCBCyclesTot;/*任务运行的时钟周期数。*/INT32UOSTCBCyclesStart;/*任务恢复开始的循环计数器。*/OSSTK*OSTCBStkBase。

/*指向任务栈开始的指针。*/INT32UOSTCBStkUsed;/*使用的栈的字节数*/#endif#ifOSTASKNAMEEN>0uINT8U*OSTCBTaskName;#endif#ifOSTASKREGTBLSIZE>0uINT32UOSTCBRegTbl[OSTASKREGTBLSIZE];#endif}OSTCB;2、任务就绪表的结构0.9完成人:任务完成情况说明两个变量(OSRdyGrp,OSRdyTbl[8]),两个表格(OSMapTbl[Index],INT8UconstOSUnMapTbl[])。

三个程序组成。三个程序分别用于任务登记进入就绪态、任务脱离就绪态、找出最高优先级就绪态任务三种就绪表操作。由于系统最多有64个任务,即优先级范围为0~63。只用了8个字节的第六位就可以了。这六位又分为高三位Y,低三位X。prio>>3即可求出Y,prio&Ox3F即可求出X,而X,Y,又是针对OSRdyTbl[]而言的。Y是该数组的下标,X是数组每一个元素的第X位(从右到左表明)。OSRdyGrp是一个位操作变量。它的的8个位中,如果哪一位为1,表示OSRdyTbl[]数组的哪一行有任务就绪。OSMapTbl[]数组系统已经定义好了。共八个元素,分别是OSMapTbl[0]=00000001。

OSMapTbl[1]=00000010;OSMapTbl[2]=00000100;OSMapTbl[3]=00001000;OSMapTbl[4]=00010000;OSMapTbl[5]=00100000;OSMapTbl[6]=01000000;OSMapTbl[7]=10000000;(1):将prio右移3位,去掉X坐标占用的后三位,只取Y坐标,填入OSMapTbl[],返回值与OSRdyGrp做位或,将OSRdyGrp对应位置1,表示该行有任务进入就绪态;例如,假设prio>>3得到Y坐标=3,则OSMapTbl[3]=00001000,

与OSRdyGrp做位或,将第四位置1;(2):将prio与0x07=00000111做位与,保留低三位,将其他位置0,得到X坐标,将X坐标填入OSMapTbl[],返回值与OSRdyTbl[Y]做位或,将OSRdyTbl[Y]对应位置1,表示该行的第X位有任务进入就绪态,注意第X位要从低端算起,也就是表格的右端开始算起;例如:刚才已经算出Y坐标=3,假设prio&0x07=X坐标=4,OSMapTbl[4]=00010000,将该返回值与OSMapTbl[3]做位或,将第五位置1,表示该位的任务进入就绪态;根据X和Y倒推算任务优先级prio:只需将以上运算倒过来即可:prio=[Y<。

<3]+X;例如:刚才上面的例子里,Y=3,X=4,则:prio=[Y<<3]+X=[3<<3]+4=28;因此,进入就绪态的任务优先级为28。3、对任务就绪表的操作(将就绪任务状态填入就绪表)0.9完成人:任务完成情况说明:1、使任务进入就绪表(通过OSMapTbl[]来在就绪表相应的行和列置1):OSRdyGrp|=OSMapTbl[prio>>3];OSRdyTbl[prio>>3]|=OSMapTbl[prio&0x07];2、从就绪表中删除一个任务(通过OSMapTbl[]来在就绪表相应的行和列置0):if((OSRdyTbl[prio>。

>3]&=~OSMapTbl[prio&0x07])==0)OSRdyGrp&=~OSMapTbl[prio>>3];注意:OSRdyTbl[prio>>3]所有的位都是零时,OSRdyGrp的相应位才清零。所以要进行判断。4、根据就绪表确定最高优先级(采用查表法确定高优先级任务)1完成人:任务完成情况说明:3、找出进入就绪态的优先级最高的任务(通过优先级判定表OSUnMapTbl[]来查找):查找的思路是从上至下,从右至左,但这样要进入大量的判断,所以只要根据y=OSRdyGrp和OSRdyTbl[y]在优先级判定表OSUnMapTbl[]进入下标运算就可找到优先级最高的任务。

用空间来换时间。y=OSUnMapTbl[OSRdyGrp];x=OSUnMapTbl[OSRdyTbl[y]];prio=(y<<3)+x;5、任务调度器实现流程图表述—1完成人:任务完成情况说明:任务调度器分为两种,一种是任务级调度器,另一种是中断级调度器。任务级调度器的流程图。任务级调度器的源代码voidOSSched(void){#ifOSCRITICALMETHOD==3OSCPUSRcpsr;#endifINT8Uy;OSENTERCRITICAL();//关中断if((OSLockNesting|OSInitNesting)==0)//是否上锁了{y=OSUnMapTbl[OSRdyGrp]。

//找到高三位OSPrioHighRdy=(INT8U)((y<<3)+UnMapTbl[OSRdyTbl[y]]);//找到最高优先级if(OSPrioHighRdy!=OSPrioCur)//判断优先级高的任务是否为当前正在执行的任务{OSTCBHighRdy=OSTCBPrioTbl[OSPrioHighRdy];//得到任务控制块指针OSCtxSwCtr++;//统计任务切换次数的计数器加1OSTASKSW();//任务切换}}OSEXITCRITICAL();//关中断}中断级任务调度:6、任务调度器实现及源代码分析—1完成人:任务完成情况说明:7、任务切换的过程描述0。

展开阅读全文
 温馨提示:
下载提示
关于本文
本文标题:东软操作系统三级项目.doc
链接地址:https://www.999doc.com/661361.html
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 联系我们

copyright © 2016-2021  999doc三九文库网 版权所有

经营许可证编号:苏ICP备2020069977号  网站客服QQ:772773258  联系电话:0518-83073133