操作系统项目报告书.docx
《操作系统项目报告书.docx》由会员分享,可在线阅读,更多相关《操作系统项目报告书.docx(10页珍藏版)》请在冰豆网上搜索。
![操作系统项目报告书.docx](https://file1.bdocx.com/fileroot1/2022-12/6/b4289a97-24d4-4596-87eb-15c5e18b1691/b4289a97-24d4-4596-87eb-15c5e18b16911.gif)
操作系统项目报告书
项目报告书
项目名称
µC/OS-II操作系统的进程调度模块源码分析
项目组组长
项目组成员及分工
制定日期
2013年5月3日
一、目的
辅助理解课堂上讲授的进程的定义、进程控制块、进程的创建以及处理及调度算法等知识点。
二、任务
分析µC/OS-II操作系统中的进程调度模块的源码实现。
进而理解进程控制块的结构,理解进程运行的并发性,掌握进程调度的方法在µC/OS-II操作系统中的具体实现。
三、小组内任务完成情况
撰写说明:
小组各成员按照任务分工对任务完成情况进行说明,形式可以是文字描述、代码描述、流程图描述或屏幕截图等。
1、uC/OS的任务控制块--0.8
完成人:
任务完成情况说明:
任务控制块石一个结构类型数据,当用户应用程序调用OSTaskCreate()函数创建一个用户任务时,这个函数就会对任务控制块中的所有成员赋予与该任务相关的数据,病驻留在RAM中
任务控制块结构的定义如下:
typedefstructos_tch
{
os_stk*OSTCBStkPtr;//指向任务堆栈栈顶的指针
#ifOS_TASK_CREATE_EXT_EN
void*OSTCBExtPtr;//指向任务控制块扩展的指针
OS_STK*OSTCBStkBottom;//指向任务堆栈栈底的指针
INT32UOSTCBStkSize;//任务堆栈的长度
INT16UOSTCBOpt;//创建任务时的选择项
INT16UOSTCBId;//目前该域未被使用
#endif
structos_tcb*OSTCBNext;//指向后一个任务控制块的指针
structos_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
INT16UOSTCBDly;//任务等待的时限(节拍数)
INT8UOSTCBStat;//任务的当前状态标志
INT8UOSTCBPrio;//任务的优先级别
INT8UOSTCBX;//用于快速访问就绪表的数据
INT8UOSTCBY;//用于快速访问就绪表的数据
INT8UOSTCBBitX;//用于快速访问就绪表的数据
INT8UOSTCBBitY;//用于快速访问就绪表的数据
#ifOS_TASK_DEL_EN
BCOLEANOSTCBDelReq;//请求删除任务时用到的标志
#endif
}OS_TCB
//其中成员OSTCBStat用来存放任务的当前状态,该成员变量可能的值如下
OS_STAT_RDY表示任务处于就绪状态
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中定义);三个程序分别是使任务进入就绪、使任务脱离就绪、寻找任务就绪的最高优先级任务的程序。
就绪表
变量OSRdyGrp的格式及含义
3、对任务就绪表的操作(将就绪任务状态填入就绪表)--0.9
完成人:
任务完成情况说明:
在程序中,可用类似于下面的代码吧优先级为prio的任务置为就绪状态
OSRdyGrp|=OSMapTbl[prio>>3];
OSRdyTbl[prio>>3]|=OSmapTbl[prio&0x07];
其中OSMapTbl[]时uc/os-II为加快运算速度定义的一个数组,他的各元素值为:
OSMapTbl[0]=00000001B
OSMapTbl[1]=00000010B
OSMapTbl[2]=00000100B
OSMapTbl[3]=00001000B
OSMapTbl[4]=00010000B
OSMapTbl[5]=00100000B
OSMapTbl[6]=01000000B
OSMapTbl[7]=10000000B
如果要使一个优先级别为prio的任务脱离就绪状态,则可使用如下代码
if((OSRdyTbl[prio>>3]&=-OSMapTbl[prio&0x07])==0)
OSRdyGrp&=-OsMapTbl[Prio>>3];
4、根据就绪表确定最高优先级(采用查表法确定高优先级任务)--1
完成人:
任务完成情况说明:
任务完成情况说明:
原理:
先通过查表确定最高优先级在哪行,再通过扎表确定最高优先级在这行的哪一列。
最后prio的二进制值为00[行号的三位二进制][列号的三位二进制]
任务就绪表中获取优先级别最高的就绪任务可用如下代码
y=OSUnMapTal[OSRdyGrp];//获取优先级别的D5D4D3位
x=OsUnMapTal[OSRdyTbl[y];//获取优先级别的D2D2D0位
或
y=OSUnMapTal[OsRdyGrp];
prio=(INT8U)((y<<3)+OSUnMapTbl[OSRdyTbl[y]])
该代码执行后,得到的是最高优先级就绪任务的优先级别(即任务的标识)
其中OSUn-MapTbl[]同样是UC/OS-II为提高查找速度定义的一个数组,
它共有256各元素,定义如下:
INT8UconstOSUnMapTbl[]=
{
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,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
完成人:
任务完成情况说明:
开始→采用第三种方法开关中断→关闭中断
↓
是否是中断嵌套和调度上锁?
→是→结束
↓
否→找出就绪任务中优先级最高的任务
↓
该任务是否为当前正在运行的任务?
→是→结束
↓
否→将最高优先级的任务指向他的TCB→任务切换统计计数++→调用任务切换函数→开中断→结束
6、任务调度器实现及源代码分析—1
完成人:
任务完成情况说明:
voidOS_Sched(void)
{
#ifOS_CRITICAL_METHOD==3//定义第三种方法开关中断
OS_CPU_SRcpu_sr;
#endif
INT8Uy;
OS_ENTER_CRITICAL();//关中断①
if((OSIntNesting==0)&&(OSLockNesting==0))
{//如果调度允许且没有中断②
y=OSUnMapTbl[OSRdyGrp];
OSPrioHighRdy=(INT8U)((y<<3)+OSUnMapTbl[OSRdyTbl[y]]);//找出最高优先级
if(OSPrioHighRdy!
=OSPrioCur)
{//如果不是正在运行的任务
OSTCBHighRdy=OSTCBPrioTbl[OSPrioHighRdy];//最高优先级的任务指向他的TCB
OSCtxSwCtr++;
OS_TASK_SW();
}//调用任务切换函数
}
OS_EXIT_CRITICAL();//开中断
}
2了防止处理过程中有中断进来导致某些任务转入就绪状态,中断必须关闭。
②OSLockNesting=0时,才允许调度;所用中断退出时,OSIntNesting=0
7、任务切换的过程描述--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(可选)
完成人:
任务完成情况说明:
四、心得体会