1、操作系统项目报告书项目报告书项目名称C/OS-II操作系统的进程调度模块源码分析项目组组长项目组成员及分工制定日期2013年5月3日一、目的辅助理解课堂上讲授的进程的定义、进程控制块、进程的创建以及处理及调度算法等知识点。二、任务分析C/OS-II操作系统中的进程调度模块的源码实现。进而理解进程控制块的结构,理解进程运行的并发性,掌握进程调度的方法在C/OS-II操作系统中的具体实现。三、小组内任务完成情况撰写说明:小组各成员按照任务分工对任务完成情况进行说明,形式可以是文字描述、代码描述、流程图描述或屏幕截图等。1、uC/OS的任务控制块-0.8完成人: 任务完成情况说明:任务控制块石一个结
2、构类型数据,当用户应用程序调用OSTaskCreate()函数创建一个用户任务时,这个函数就会对任务控制块中的所有成员赋予与该任务相关的数据,病驻留在RAM中任务控制块结构的定义如下: typedef struct os_tch os_stk *OSTCBStkPtr; /指向任务堆栈栈顶的指针 #if OS_TASK_CREATE_EXT_EN void *OSTCBExtPtr;/指向任务控制块扩展的指针 OS_STK *OSTCBStkBottom;/指向任务堆栈栈底的指针 INT32U OSTCBStkSize;/任务堆栈的长度 INT16U OSTCBOpt;/创建任务时的选择项 I
3、NT16U OSTCBId;/目前该域未被使用 #endif struct os_tcb *OSTCBNext;/指向后一个任务控制块的指针 struct os_tcb *OSTCBPrev;/指向前一个任务控制块的指针 #if(OS_Q_EN &(OS_MAX_OS=2)|OS_MBOX_EN |OS_Sem_En OS_EVENT *OSTCBEventPtr;/指向事件控制块的指针 #endif #if(OS_Q_EN & (OS_MAX_QS=2)|OS_MBOX_EN void *OSTCBMsq; /指向传递给任务消息的指针 #endif INT16U OSTCBDly;/任务等待
4、的时限(节拍数) INT8U OSTCBStat;/ 任务的当前状态标志 INT8U OSTCBPrio;/任务的优先级别 INT8U OSTCBX;/用于快速访问就绪表的数据 INT8U OSTCBY;/用于快速访问就绪表的数据 INT8U OSTCBBitX;/ 用于快速访问就绪表的数据 INT8U OSTCBBitY;/用于快速访问就绪表的数据 #if OS_TASK_DEL_EN BCOLEAN OSTCBDelReq;/请求删除任务时用到的标志 #endif OS_TCB/其中成员OSTCBStat用来存放任务的当前状态,该成员变量可能的值如下 OS_STAT_RDY 表示任务处于就
5、绪状态 OS_STAT_SEM 表示任务处于等待信号量状态 OS_STAT_MBOX 表示任务处于等待消息邮箱状态 OS_STAT_Q 表示任务处于等待消息队列状态 OS_STAT_SUSPEND 表示任务处于被挂起状态 OS_STAT_MUTEX 表示任务处于等待互斥型信号量状态 2、任务就绪表的结构-0.9完成人: 任务完成情况说明:任务就绪表包括两个变量,两个表格和三个程序组成。两个变量分别是OSRdyGrp和OSRdyTbl(在uCOS_II.H中声明);两个表格分别是位掩码表OSMapTbl和优先级判定表OSUnMapTbl(在uCOS_II.H中声明,在OS_CORE.C中定义);
6、三个程序分别是使任务进入就绪、使任务脱离就绪、寻找任务就绪的最高优先级任务的程序。就绪表变量OSRdyGrp的格式及含义3、对任务就绪表的操作(将就绪任务状态填入就绪表)-0.9完成人: 任务完成情况说明:在程序中,可用类似于下面的代码吧优先级为prio的任务置为就绪状态OSRdyGrp |= OSMapTblprio3;OSRdyTblprio3 |= OSmapTblprio&0x07;其中OSMapTbl 时 uc/os -II 为加快运算速度定义的一个数组,他的各元素值为: OSMapTbl0=00000001B OSMapTbl1=00000010B OSMapTbl2=000001
7、00B OSMapTbl3=00001000B OSMapTbl4=00010000B OSMapTbl5=00100000B OSMapTbl6=01000000B OSMapTbl7=10000000B如果要使一个优先级别为prio的任务脱离就绪状态,则可使用如下代码 if(OSRdyTblprio3&=-OSMapTblprio&0x07)=0) OSRdyGrp&=-OsMapTblPrio3;4、根据就绪表确定最高优先级(采用查表法确定高优先级任务)-1完成人: 任务完成情况说明:任务完成情况说明:原理:先通过查表确定最高优先级在哪行,再通过扎表确定最高优先级在这行的哪一列。最后pr
8、io的二进制值为00行号的三位二进制列号的三位二进制任务就绪表中获取优先级别最高的就绪任务可用如下代码 y=OSUnMapTalOSRdyGrp; /获取优先级别的D5 D4D3位 x=OsUnMapTalOSRdyTbly;/获取优先级别的D2 D2D0位 或 y=OSUnMapTalOsRdyGrp; prio=(INT8U)(y3)+OSUnMapTblOSRdyTbly) 该代码执行后,得到的是最高优先级就绪任务的优先级别(即任务的标识) 其中OSUn-MapTbl同样是UC/OS-II为提高查找速度定义的一个数组, 它共有256各元素,定义如下: INT8U const OSUnMa
9、pTbl= 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,
10、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 5、任务调度器实现流程图表述1完成人: 任务完成情况说明:开始 采用第三种方法开关中断 关闭中断是否是中断嵌套和调度上锁? 是 结束否 找出就绪任务中优先级最高的任
11、务该任务是否为当前正在运行的任务? 是 结束否 将最高优先级的任务指向他的TCB 任务切换统计计数+ 调用任务切换函数 开中断 结束6、任务调度器实现及源代码分析1完成人: 任务完成情况说明:void OS_Sched (void)#if OS_CRITICAL_METHOD = 3 /定义第三种方法开关中断OS_CPU_SR cpu_sr;#endifINT8U y;OS_ENTER_CRITICAL(); /关中断if (OSIntNesting = 0) & (OSLockNesting = 0) /如果调度允许且没有中断 y= OSUnMapTblOSRdyGrp; OSPrioHig
12、hRdy = (INT8U)(y 3) + OSUnMapTblOSRdyTbly); /找出最高优先级 if (OSPrioHighRdy != OSPrioCur) /如果不是正在运行的任务 OSTCBHighRdy = OSTCBPrioTblOSPrioHighRdy;/最高优先级的任务指向他的TCB OSCtxSwCtr+; OS_TASK_SW(); /调用任务切换函数OS_EXIT_CRITICAL(); /开中断2 了防止处理过程中有中断进来导致某些任务转入就绪状态,中断必须关闭。OSLockNesting=0时,才允许调度;所用中断退出时,OSIntNesting=07、任务
13、切换的过程描述-0.8(可选)完成人: 任务完成情况说明:1. 把终止任务的断点指针保存到任务堆栈中2. 把cpu通用寄存器的内容保存的任务堆栈中3. 把被终止任务的任务堆栈指针当前值保存到该任务的任务控制块的OSTCBStkPtr中4. 获得待运行任务的任务控制块5. 使cpu通过任务控制块获得待运行任务的任务堆栈指针6. 把待运行任务堆栈中通用寄存器的内容恢复到cpu的通用寄存器中7. 使cpu获得待运行任务的断点指针(该指针是待运行任务在上一次被调度器终止运行时保留在任务堆栈中的)8、用户任务的实现(编写一个示例程序验证调度算法)-1完成人:任务完成情况说明:9、任务状态切换(挂起和恢复任务)示例程序演示-0.9(可选)完成人:任务完成情况说明:10、用信号量实现任务间同步和互斥示例程序演示-0.9(可选)完成人:任务完成情况说明:11、用消息邮箱实现任务间通信示例程序演示-0.9(可选)完成人:任务完成情况说明:四、心得体会
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1