东软操作系统三级项目.doc_第1页
东软操作系统三级项目.doc_第2页
东软操作系统三级项目.doc_第3页
东软操作系统三级项目.doc_第4页
东软操作系统三级项目.doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

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

文档简介

项目报告书项目名称C/OS-II操作系统的进程调度模块源码分析项目组组长项目组成员及分工制定日期一、目的辅助理解课堂上讲授的进程的定义、进程控制块、进程的创建以及处理及调度算法等知识点。二、任务分析C/OS-II操作系统中的进程调度模块的源码实现。进而理解进程控制块的结构,理解进程运行的并发性,掌握进程调度的方法在C/OS-II操作系统中的具体实现。三、小组内任务完成情况撰写说明:小组各成员按照任务分工对任务完成情况进行说明,形式可以是文字描述、代码描述、流程图描述或屏幕截图等。1、uC/OS的任务控制块-0.8完成人:任务完成情况说明:任务控制块:任务控制块是一个结构体数据结构,用于记录各个任务的信息。当任务的CPU的使用权被剥夺时,uCOS-II用它来保存任务的当前状态。当任务重新获得CPU的使用权时,任务控制块能确保任务从当时被中断的那一点丝毫不差的继续执行。任务控制块全部存放在RAM中。typedef struct os_tcb OS_STK *OSTCBStkPtr; /* 指向当前任务使用的堆栈的栈顶。uCOS-II允许每个任务堆栈的大小可以不同,这样用户可以根据实际需要定义任务堆栈的大小,可以节省RAM的空间。另外,由于OSTCBStkPtr是该结构体中的第一个变量,所以可以使用汇编语言方便的访问,因为其偏移量是0。当切换任务时,用户可以容易的知道就绪任务中优先级最高任务的栈顶。*/#if OS_TASK_CREATE_EXT_EN 0u void *OSTCBExtPtr; /* 指向用户定义的扩展任务控制块*/ OS_STK *OSTCBStkBottom; /*指向任务堆栈的栈底。需要考虑一下你使用的MCU的栈指针是按照从高到低还是从低到高变化的。这个变量在测试任务需要的栈空间的时候需要使用。 */ INT32U OSTCBStkSize; /* 同样,该变量也是测试任务需要的栈空间需要。需要注意的是,该变量存储的是指针元的数目,而不是字节数目。*/ INT16U OSTCBOpt; /* 传给函数OSTaskCreateExt()的选择项。目前有OS_TASK_OPT_STK_CHK, OS_TASK_OPT_STK_CLR, OS_TASK_OPT_SAVE_EP */ INT16U OSTCBId; /* Task ID (0.65535),目前没有使用。*/#endif struct os_tcb *OSTCBNext; struct os_tcb *OSTCBPrev; /* 指向TCB的双向链表的前后链接,在OSTimeTick()中使用,用来刷新各任务的任务延迟变量.OSTCBDly。*/#if (OS_EVENT_EN) | (OS_FLAG_EN 0u) OS_EVENT *OSTCBEventPtr; /* 指向事件控制块的指针。*/#endif#if (OS_EVENT_EN) & (OS_EVENT_MULTI_EN 0u) OS_EVENT *OSTCBEventMultiPtr; /* 指向多重事件控制块的指针*/#endif#if (OS_Q_EN 0u) & (OS_MAX_QS 0u) | (OS_MBOX_EN 0u) void *OSTCBMsg; /* 指向传递给任务的消息的指针。*/#endif#if (OS_FLAG_EN 0u) & (OS_MAX_FLAGS 0u)#if OS_TASK_DEL_EN 0u OS_FLAG_NODE *OSTCBFlagNode; /*指向事件标志的节点的指针。 */#endif OS_FLAGS OSTCBFlagsRdy; /* 当任务等待事件标志组时,该变量是使任务进入就绪态的事件标志。*/#endif INT32U OSTCBDly; /* 记录事件延时或者挂起的时间。*/ INT8U OSTCBStat; /*任务状态字。比如就绪态、等待*/ INT8U OSTCBStatPend; /*任务挂起状态。*/ INT8U OSTCBPrio; /*任务优先级 */ INT8U OSTCBX; /* 计算优先级用*/ INT8U OSTCBY; /*计算优先级用*/#if OS_LOWEST_PRIO 0u INT8U OSTCBDelReq; /* 表示任务是否需要删除。*/#endif#if OS_TASK_PROFILE_EN 0u INT32U OSTCBCtxSwCtr; /* 任务切换的次数。*/ INT32U OSTCBCyclesTot; /* 任务运行的时钟周期数。*/ INT32U OSTCBCyclesStart; /* 任务恢复开始的循环计数器。*/ OS_STK *OSTCBStkBase; /* 指向任务栈开始的指针。*/ INT32U OSTCBStkUsed; /*使用的栈的字节数 */#endif#if OS_TASK_NAME_EN 0u INT8U *OSTCBTaskName;#endif#if OS_TASK_REG_TBL_SIZE 0u INT32U OSTCBRegTblOS_TASK_REG_TBL_SIZE;#endif OS_TCB; 2、任务就绪表的结构-0.9完成人:任务完成情况说明两个变量( OSRdyGrp, OSRdyTbl8 ),两个表格( OSMapTblIndex , INT8U const OSUnMapTbl ),三个程序组成。三个程序分别用于任务登记进入就绪态、任务脱离就绪态、找出最高优先级就绪态任务三种就绪表操作。由于系统最多有64个任务,即优先级范围为063。只用了8个字节的第六位就可以了。这六位又分为高三位Y,低三位X。prio3即可求出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,表示该行有任务进入就绪态;例如,假设prio3 得到 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 = Y3 + X;例如:刚才上面的例子里,Y = 3,X = 4,则:prio = Y3 + X = 3 3; OSRdyTblprio 3 |= OSMapTblprio & 0x07; 2、从就绪表中删除一个任务(通过OSMapTbl 来在就绪表相应的行和列置0):if (OSRdyTblprio 3 &= OSMapTblprio & 0x07) = 0) OSRdyGrp &= OSMapTblprio 3; 注意: OSRdyTblprio3所有的位都是零时,OSRdyGrp 的相应位才清零。所以要进行判断。4、根据就绪表确定最高优先级(采用查表法确定高优先级任务)-1完成人:任务完成情况说明:3、找出进入就绪态的优先级最高的任务(通过优先级判定表OSUnMapTbl 来查找):查找的思路是从上至下,从右至左,但这样要进入大量的判断,所以只要根据yOSRdyGrp和OSRdyTbly在优先级判定表OSUnMapTbl 进入下标运算就可找到优先级最高的任务,用空间来换时间。y = OSUnMapTblOSRdyGrp; x = OSUnMapTblOSRdyTbly; prio = (y 3) + x; 5、任务调度器实现流程图表述1完成人:任务完成情况说明:任务调度器分为两种,一种是任务级调度器,另一种是中断级调度器。任务级调度器的流程图。任务级调度器的源代码void OSSched(void)#if OS_CRITICAL_METHOD = 3OS_CPU_SR_cp_sr;#endifINT8U y;OS_ENTER_CRITICAL();/关中断if(OSLockNesting | OSInitNesting) = 0)/是否上锁了y = OSUnMapTblOSRdyGrp;/找到高三位OSPrioHighRdy = (INT8U) (y3)+UnMapTblOSRdyTbly);/找到最高优先级if(OSPrioHighRdy != OSPrioCur)/判断优先级高的任务是否为当前正在执行的任务OSTCBHighRdy = OSTCBPrioTblOSPrioHighRdy;/得到任务控制块指针OSCtxSwCtr+;/统计任务切换次数的计数器加1OS_TASK_SW();/任务切换OS_EXIT_CRITICAL();/关中断中断级任务调度:6、任务调度器实现及源代码分析1完成人:任务完成情况说明:7、任务切换的过程描述-0.8(可选)完成人:任务完成情况说明:一个被中断的任务能否正确的进行,关键在于能否正确的在CPU总个寄存器中恢复断点数据,而能正确的恢复端点数据的关键是CPU的堆栈指针SP是否有正确的指向。有OSCrxSw()完成。1.把被终止任务断点指针保存到任务堆栈中。2.把CPU通用寄存器的内容保存到任务堆栈中。3.把被终止任务的任务堆栈指针当前值保存到该任务的任务控制块OSTCBStkprt中。4.获得带运行任务的任务控制块。5.是CPU通过任务控制块获得待运行任务的任务堆栈指针。6.吧待运行的任务堆栈通用寄存器的内容恢复到CPU的通用寄存器中。7使CPU获得待运行任务的端点指针(该指针是待运行任务的在上一次被调度器中止运行时保留在任务堆栈中的)。改变CPU的PC指针的值是通过中断来实现的。8、用户任务的实现(编写一个示例程序验证调度算法)-1完成人:任务完成情况说明:9、任务状态切换(挂起和恢复任务)示例程序演示-0.9(可选)完成人:任务完成情况说明:MyTa

温馨提示

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

评论

0/150

提交评论