uCOS-II微小内核分析.ppt
《uCOS-II微小内核分析.ppt》由会员分享,可在线阅读,更多相关《uCOS-II微小内核分析.ppt(166页珍藏版)》请在三一办公上搜索。
1、第1章 C/OS-II微小内核分析,本章导读,为了方便初学者学习嵌入式实时操作系统的基本原理,作者将C/OS-II V2.52由小到大裁减为几个只具备基本功能的微小内核。通过分析仅仅418行的操作系统最小内核,带领初学者尽快入门。作者建议在学习或教授本章的过程中,初学者或教师要边阅读原码,边画图,深刻理解过程,因为“过程比结论更重要!”。,目录,概述最小内核临界区与中断管理任务的结束信号量删除信号量,目录,概述最小内核临界区与中断管理任务的结束信号量删除信号量,1.1 概述,C/OS-II微小内核简介,C/OS-II 嵌入式实时操作系统的源代码可以分成三部分:与硬件无关的内核代码、与处理器有关
2、的移植代码和用户配置文件。,1.1 概述,C/OS-II微小内核简介,内核代码,内核代码位于source目录下,提供了4个微小内核。它们分别位于sourceSOURCE1(包含建立任务和延时功能)、sourceSOURCE2(增加删除任务功能)、sourceSOURCE3(增加信号量文件)和sourceSOURCE4(增加删除信号量功能)。它们的功能依次增强,代码也依次增大。以上代码并没有完全裁减到最小,还包含了一些参数校验代码等非必需代码,C/OS-II的代码裁减功能也同时保留,这些代码大约50多行。,1.1 概述,C/OS-II微小内核简介,移植代码,本书提供基于ARM的移植代码,位于ar
3、m目录下,分别为OS_CPU_C.C(移植代码C语言部分)、OS_CPU_a.S(移植代码汇编语言部分)、OS_CPU.H(移植代码头文件)和IRQ.INC(移植代码与芯片无关的中断处理接口程序)4个文件。,1.1 概述,C/OS-II微小内核简介,配置文件,配置文件是每个C/OS-II程序必备的文件,而且不同的程序一般不一样,但大小基本上相同。配置文件范例位于H目录下,分别为INCLUDES.H(内核需要的头文件,对于特定的移植,一般不需要改变)和OS_CFG.H(内核配置的头文件,一般需要根据程序的需求修改其常量的内容)文件。一般来说,每个应用程序都有自己的配置文件拷贝,并很可能与范例不同
4、。,1.1 概述,函数说明,C/OS-II 微小内核SOURCE4提供OSInit函数。,1.1 概述,函数说明,C/OS-II 微小内核SOURCE4提供OSStart函数。,1.1 概述,函数说明,C/OS-II 微小内核SOURCE4提供OSTaskCreate函数。,1.1 概述,函数说明,C/OS-II 微小内核SOURCE4提供OSTimeDly函数。,1.1 概述,函数说明,C/OS-II 微小内核SOURCE4提供OSTimeTick函数。,1.1 概述,函数说明,C/OS-II 微小内核SOURCE4提供OSTaskDel函数。,1.1 概述,函数说明,C/OS-II 微小内
5、核SOURCE4提供OSIntEnter函数。,1.1 概述,函数说明,C/OS-II 微小内核SOURCE4提供OSIntExit函数。,1.1 概述,函数说明,C/OS-II 微小内核SOURCE4提供禁止/允许中断函数。,1.1 概述,函数说明,C/OS-II 微小内核SOURCE4提供OSSemCreate函数。,1.1 概述,函数说明,C/OS-II 微小内核SOURCE4提供OSSemPend函数。,1.1 概述,函数说明,C/OS-II 微小内核SOURCE4提供OSSemPost函数。,1.1 概述,函数说明,C/OS-II 微小内核SOURCE4提供OSSemDel函数。,目
6、录,概述最小内核临界区与中断管理任务的结束信号量删除信号量,1.2 最小内核,基本概念案例分析任务控制块任务就绪算法OS初始化任务管理任务堆栈初始化,获取并初始化TCB启动OSTargetInit 初始化时间管理任务调度SWI软件中断异常任务级的任务调度小结,1.2 最小内核,基本概念案例分析任务控制块任务就绪算法OS初始化任务管理任务堆栈初始化,获取并初始化TCB启动OSTargetInit 初始化时间管理任务调度SWI软件中断异常任务级的任务调度小结,1.2 最小内核,基本概念,什么是任务,在实时多任务系统下运行的应用软件程序就是任务。在没有使用OS的前后台系统中,我们可以认为main函数
7、以及通过main函数调用的全体函数为一个任务。通常将“并行程序执行的基本逻辑单位”称之为“任务”,也就是说任务是可以被分割为独立的且可并行执行的基本逻辑单位程序。一个任务的程序是顺序执行的,而不同任务的程序却是并行执行的。任务必须包括相互“独立”和“并行”执行两个方面。,1.2 最小内核,基本概念,独立,独立具体指任务不能彼此直接调用,也不能直接进行数据交换。,void task0(void)task1();,void task1(void),内核,通过调用执行任务,因此可以看成整体。,void task0(void)系统调用,通过内核进行任务调度和数据交换。,1.2 最小内核,基本概念,独立
8、,独立具体指任务不能彼此直接调用,也不能直接进行数据交换。,1.2 最小内核,基本概念,并行执行,想象相互独立的任务各自拥有一个CPU,每个CPU各自执行各自的任务,此即任务的并行执行。但实际上CPU只有一个,我们认为操作系统为每个任务虚拟了一个CPU。,1.2 最小内核,基本概念,任务的状态,在C/OS-中,任务有5种状态,分别为睡眠状态、就绪状态、运行状态、等待状态和被中断状态。,睡眠状态,等待状态,就绪状态,被中断状态,运行状态,任务驻留在内存中尚未创建,任务已经准备好但尚未运行,任务掌握CPU的控制权,任务等待事件的而尚未发生,中断服务程序执行打断任务,1.2 最小内核,基本概念案例分
9、析任务控制块任务就绪算法OS初始化任务管理任务堆栈初始化,获取并初始化TCB启动OSTargetInit 初始化时间管理任务调度SWI软件中断异常任务级的任务调度小结,1.2 最小内核,案例分析,CPU,Task0,Task1,TaskIdle,P0.9,P0.10,在前后台系统中,一个“模块”可以调用另一个“模块”,因此各模块在执行时间上相互错开,且信息传递“同步”。,1.2 最小内核,案例分析,在操作系统中,程序设计就象记流水帐一样简单。,1.2 最小内核,案例分析,注意:在进入首个运行的任务之前要禁止产生任何受操作系统管理的中断,包括节拍定时器的中断。因为这类中断产生后操作系统会对任务进
10、行扫描,并尝试进行任务切换,这将会导致程序出错,甚至引起系统崩溃。所以通常将硬件初始化函数放在首个运行任务开始的地方执行。,void Task0(void*pdata)pdata=pdata;TargetInit();while(1),1.2 最小内核,基本概念案例分析任务控制块任务就绪算法OS初始化任务管理任务堆栈初始化,获取并初始化TCB启动OSTargetInit 初始化时间管理任务调度SWI软件中断异常任务级的任务调度小结,1.2 最小内核,任务控制块,C/OS-是通过任务控制块来管理任务的。任务控制块是一个基于链表的数据结构,任务控制块主要用于记录任务的堆栈栈顶指针、指向下一个任务控
11、制块的指针、任务等待的延迟时间、任务的当前状态标志与任务的优先级别等一些与任务管理有关的属性。当任务的CPU使用权被剥夺时,C/OS-用任务控制块来保存该任务的状态,从而保证任务重新获得CPU使用权时从断点处执行。,1.2 最小内核,任务控制块,typedef struct os_tcb OS_STK*OSTCBStkPtr;struct os_tcb*OSTCBNext;INT16U OSTCBDly;INT8U OSTCBStat;INT8U OSTCBPrio;INT8U OSTCBX;INT8U OSTCBY;INT8U OSTCBBitX;INT8U OSTCBBitY;OS_TCB
12、;,任务控制块定义,任务控制块成员示意图,OSTCBStkPtr,OSTCBNext,OSTCBDly,OSTCBStat,OSTCBPrio,OSTCBX,OSTCBY,OSTCBBitX,OSTCBBitY,指向当前任务栈栈顶的指针。C/OS-允许每个任务有自己的栈,尤为重要的是,每个任务的堆栈的容量可以是任意的。,指向下一个任务控制块的指针。用于任务控制块OS_TCB的链接。,任务等待的延时时间变量。用于将任务挂起一段时间以等待某事件的发生,这种等待是有超时限制的。,任务的当前状态标志变量。其为0时,任务进入就绪态。,任务优先级变量。变量值越小,任务的优先级越高。,1.2 最小内核,任务
13、控制块,C/OS-最小内核定义了4个指针、1个数组和1个指针数组。,OSTCBCur指向“当前任务控制块”的指针;OSTCBFreeList“空任务控制块”链表的表头指针;OSTCBHighRdy 指向“将要运行最高优先级任务控制块”的指针;OSTCBList“已使用任务控制块”链表的表头指针;,1.2 最小内核,任务控制块,OSTCBPrioTbl任务控制块优先级表,专门用来存放指向各任务控制块的指针,并按任务的优先级别将这些指针存放在数组的各个元素里。,OSTCBPrioTbl指向各任务控制块的起始地址,即OSTCBStkPtr地址。,1.2 最小内核,任务控制块,OSTCBTbl任务控制
14、块数组,所有的任务控制块都保存在这个数组中。,任务控制块初始状态,建立“单向空任务块链表”,链表头指针,存放“节点”地址,存放下一个节点地址,用户数据,表尾存放“空指针”,1.2 最小内核,任务控制块,OSTCBTbl任务控制块数组,所有的任务控制块都保存在这个数组中。,建立一个用户任务后的状态,系统空闲任务,用户任务,初始化空OS_TCB链表,OS_TCB*ptcb1;OS_TCB*ptcb2;,OSTCBList=(OS_TCB*)0;for(i=0;i(OS_LOWEST_PRIO+1);i+)OSTCBPrioTbli=(OS_TCB*)0;,ptcb1=,for(i=0;i OSTC
15、BNext=ptcb2;ptcb1+;ptcb2+;,ptcb1-OSTCBNext=(OS_TCB*)0;OSTCBFreeList=,1.2 最小内核,基本概念案例分析任务控制块任务就绪算法OS初始化任务管理任务堆栈初始化,获取并初始化TCB启动OSTargetInit 初始化时间管理任务调度SWI软件中断异常任务级的任务调度小结,1.2 最小内核,任务就绪算法,所谓就绪状态是指任务准备运行但CPU没空,任务等待运行的状态。任务就绪算法涉及“任务就绪表OSRdyTbl、映射表OSMapTbl、优先级判定表OSUnMapTbl以及变量OSRdyGrp和相关的任务优先级prio”,其中映射表O
16、SMapTbl和优先级判定表OSUnMapTbl是2个常数表,用于查表算法。,优先级19的任务放入就绪表,OSRdyGrp|=OSMapTblPrio 3;OSRdyTblPrio 3|=OSMapTblPrio,就绪的任务在任务就绪表相应位置置1,1,优先级19的任务脱离就绪表,If(OSRdyTblPrio 3,&,=,0,&,=,0,该优先级任务脱离就绪表,优先级判定表,8线3线优先编码表,INT8U const OSUnMapTbl=/*0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f*/*0 x00*/0,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,/*
17、0 x10*/4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,/*0 x20*/5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,/*0 x30*/4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,/*0 x40*/6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,/*0 x50*/4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,/*0 x60*/5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,/*0 x70*/4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,/*0 x80*/7,0,1,
18、0,2,0,1,0,3,0,1,0,2,0,1,0,/*0 x90*/4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,/*0 xA0*/5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,/*0 xB0*/4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,/*0 xC0*/6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,/*0 xD0*/4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,/*0 xE0*/5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,/*0 xF0*/4,0,1,0,2,0,1,0,3,0
19、,1,0,2,0,1,0;,优先级判定表,计算48在表中的对应值?,321 16 48,48O 30H,INT8U const OSUnMapTbl=/*0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f*/*0 x00*/0,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,/*0 x10*/4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,/*0 x20*/5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,/*0 x30*/4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,/*0 x40*/6,0,1,0,2,0,1,0,3,
20、0,1,0,2,0,1,0,/*0 x50*/4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,/*0 x60*/5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,/*0 x70*/4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,/*0 x80*/7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,/*0 x90*/4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,/*0 xA0*/5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,/*0 xB0*/4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0
21、,/*0 xC0*/6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,/*0 xD0*/4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,/*0 xE0*/5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,/*0 xF0*/4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0;,所在任务的Y值越小优先级越高,所在任务的X值越小优先级越高,由此可见最小的Y、X值所对应的任务就是进入就绪态优先级最高的的任务。,查找就绪态优先级最高的任务,y=OSUnMapTblOSRdyGrp;x=OSUnMapTblOSRdyTbly;Prio=(y 3)+x
22、;,01101001B 69H,00110000B 30H,Y=0,X=4,Prio=4,0,4,Y3,就绪表初始化,OSRdyGrp=0 x00;,prdytbl=,OS_RDY_TBL_SIZE=2,OSPrioCur=0;OSPrioHighRdy=0;OSTCBHighRdy=(OS_TCB*)0;OSTCBCur=(OS_TCB*)0;,1.2 最小内核,基本概念案例分析任务控制块任务就绪算法OS初始化任务管理任务堆栈初始化,获取并初始化TCB启动OSTargetInit 初始化时间管理任务调度SWI软件中断异常任务级的任务调度小结,1.2 最小内核,OS初始化,C/OS-II必须通
23、过函数OSInit()初始化后才可以使用,该仅调用OS_InitMisc()、OS_InitRdyList()、OS_InitTCBList()和OS_InitTaskIdle()4个函数。,OS_InMisc(),1.2 最小内核,OS初始化,static void OS_InitMisc(void)OSIntNesting=0;OSRunning=FALSE;,0,FALSE,初始化为FLASE,表明OS没启动。调用OSStart()之后,OSRunning始终为TRUE。,0表示OS已经推出中断或所有中断嵌套已完成;1代表当前中断发生在执行任务;1表示发生嵌套。,1.2 最小内核,OS初
24、始化,OS_InitTaskIdle()创建空闲任务函数比较重要,当所有用户任务都可能未处于就绪状态的时候,此时CPU将运行空闲任务,以防程序跑飞。,#define OS_IDLE_PRIO(OS_LOWEST_PRIO)#defineOS_STK_GROWTH 1#defineOS_TASK_IDLE_STK_SIZE 512,空闲任务优先级,堆栈由高地址往低地址生长,空闲任务堆栈大小,1.2 最小内核,OS初始化,void OS_TaskIdle(void*pdata)pdata=pdata;for(;),static void OS_InitTaskIdle(void)#if OS_ST
25、K_GROWTH=1(void)OSTaskCreate(OS_TaskIdle,(void*)0,#endif,创建空闲任务,空闲任务,OS初始化后状态,1.2 最小内核,基本概念案例分析任务控制块任务就绪算法OS初始化任务管理任务堆栈初始化,获取并初始化TCB启动OSTargetInit 初始化时间管理任务调度SWI软件中断异常任务级的任务调度小结,1.2 最小内核,任务管理,C/OS-通过任务控制块对任务进行管理,创建任务实际上就是给任务代码分配一个任务控制块,通过调用函数OSTaskCreate()实现。任务可以在多任务调度开始前建立,也可以在其它任务的执行过程中建立。在开始多任务调度
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- uCOS II 微小 内核 分析
链接地址:https://www.31ppt.com/p-5451410.html