嵌入式实操时作系统.ppt
《嵌入式实操时作系统.ppt》由会员分享,可在线阅读,更多相关《嵌入式实操时作系统.ppt(81页珍藏版)》请在三一办公上搜索。
1、嵌入式操作系统第三讲 嵌入式实时操作系统,一、嵌入式实时操作系统C/OS二、嵌入式Linux三、WinCE,第三讲、嵌入式实时操作系统分析,本节提要,1,3,2,嵌入式实时操作系统C/OS,嵌入式Linux,WinCE,一、嵌入式实时操作系统C/OS,C/OS简介内核结构任务以及调度机制C/OS的移植,C/OS简介,1、C/OSmicro C O S,微控制器操作系统2、C/OS简介美国人Jean Labrosse 1992年完成应用面覆盖了诸多领域,如照相机、医疗器械、音响设备、发动机控制、高速公路电话系统、自动提款机等 1998年C/OS II,公开源代码可移植性(Portable)绝大部
2、分 C/OS-II的源码是用移植性很强的ANSI C写的。和微处理器硬件相关的那部分是用汇编语言写的。C/OS-II可以在绝大多数8位、16位、32位以至64位微处理器、微控制器、数字信号处理器(DSP)上运行。可裁剪(Scalable)可以只使用 C/OS-II中应用程序需要的那些系统服务,这样可以减少产品中的 C/OS-II所需的存储器空间(RAM和ROM)。这种可剪裁性是靠条件编译实现的。,C/OS的性能特点,占先式(Preemptive)多任务 C/OS-II可以管理64个任务,然而,目前这一版本保留8个给系统。应用程序最多可以有56个任务。可确定性 全部 C/OS-II的函数调用与服
3、务的执行时间具有可确定性。任务栈 每个任务有自己单独的栈,C/OS-II允许每个任务有不同的栈空间,以便压低应用程序对RAM的需求。,C/OS的性能特点,系统服务 C/OS-II提供很多系统服务,例如邮箱、消息队列、信号量、块大小固定的内存的申请与释放、时间相关函数等。中断管理 中断可以使正在执行的任务暂时挂起,如果优先级更高的任务被该中断唤醒,则高优先级的任务在中断嵌套全部退出后立即执行,中断嵌套层数可达255层。稳定性与可靠性,C/OS的性能特点,内核结构任务管理时间管理任务之间通信与同步,C/OS的内核结构,任务task,典型的一个无限循环。void mytask(void*pdata)
4、for(;)do something;waiting;do something;C/OS II 2.5版本支持64个任务,每个任务一个特定的优先级。优先级越高,数字越小。(Windows、Linux?)系统占用了8个任务,保留优先级为0、1、2、3、OS_LOWEST_PRIO-3、OS_LOWEST_PRIO-2、OS_LOWEST_ PRIO-1、OS_LOWEST_PRIO-0。,建立任务,OS TaskCreate()OSTaskCreateExtended(),INT8U OSTaskCreate(void(*task)(void*pd),void*p_arg,OS_STK*ptos
5、,INT8U prio)INT8U OSTaskCreateExt(void(*task)(void*pd),void*p_arg,OS_STK*ptos,INT8U prio,INT16U id,OS_STK*pbos,INT32U stk_size,void*pext,INT16U opt),进程函数体传递给进程的参数进程栈顶指针进程优先级进程ID号进程栈底指针进程栈大小传递给进程控制块的数据是否初始化进程栈,任务状态,任务控制块(TCB),任务控制块 OS_TCB是一个数据结构,保存该任务的相关参数,包括任务堆栈指针,状态,优先级,任务表位置,任务链表指针等。所有的任务控制块分为两条链表
6、,空闲链表和使用链表。,任务控制块结构,Struct os_tcb OS_STK*OSTCBStkPtr;struct os_tcb*OSTCBNext;struct os_tcb*OSTCBprev;OS_EVENT*OSTCBEventPtr;void*OSTCBMsg;INT16U OSTCBDly;INT8U OSTCBStat;INT8U OSTCBPrio;INT8U OSTCBX,OSTCBY,OSTCBBitX,OSTCBBitY;OS_TCB,加速任务进入就绪态的过程,事件控制块的指针,任务的状态字,空任务列表,系统初始化时,所有任务控制块被链接成空任务控制块的单向链表,任务
7、的调度-OSSched,C/OS是占先式实时多任务内核,优先级最高的任务一旦准备就绪,则拥有CPU所有权并投入运行。C/OS中不支持时间片轮转法,每个任务的优先级不一样且是唯一的,所以任务调度的工作就是:查找准备就绪的最高优先级的任务并进行上下文切换。将被挂起的任务寄存器入栈将较高优先级任务的寄存器出栈PC指针跳转到新的位置开始执行C/OS任务调度所花的时间为常数,与应用程序中建立的任务数无关。(Linux?),检查是否中断调用和允许任务调用,找到优先级最高的任务,该任务是否正在运行,根据优先级找到任务在就绪任务表中的位置,每个任务的就绪状态标志都标入就绪表中(ready list)中,就绪表
8、有两个变量:DORdyGrp、OSRdyTbl,根据优先级确定就绪表,假设优先级为12的任务进入就绪状态,12=1 100b,则OSRdyTbl1的第4位置1,且OSRdyGrp的第1位置1,相应的数学表达式为:OSRdyGrp|=0 x02;OSRdyTbl1|=0 x10;而优先级为21的任务就绪21=10 101b,则OSRdyTbl2的第5位置1,且OSRdyGrp的第2位置1,相应的数学表达式为:OSRdyGrp|=0 x04;OSRdyTbl2|=0 x20;,根据优先级确定就绪表,从上面的计算我们可以得到:若第n位置1,则应该与2n 相或。uC/OS中,把2n的n=0-7的8个值
9、 先计算好存在数组OSMapTbl7中,也就是:OSMapTbl0=20=0 x1;OSMapTbl1=21=0 x2;OSMapTbl7=27=0 x80;,根据优先级确定就绪表,利用OSMapTbl,通过任务的识别号优先级prio来设置任务在就绪组和就绪表数组中相应位置的数学式为:OSRdyGrp|=OSMapTblprio3;OSRdyTblprio3|=OSMapTblprio,根据就绪表确定最高优先级,两个关键:优先级数分解为高三位和低三位分别确定;高优先级有着小的优先级号;,根据就绪表确定最高优先级,通过OSRdyGrp值确定高3位,假设为0 x24=100 100b,OSRdyT
10、bl2 和OSRdyTbl5,高优先级为第2组通过OSRdyTbl2的值来确定低3位,假设为0 x12=010010b,第1个和第4个任务,取高优先级第1个 prio=17,源代码中使用了查表法,查表法具有确定的时间,增加了系统的可预测性,uC/OS中所有的系统调用时间都是确定的:High3=OSUnMapTblOSRdyGrp;Low3=OSUnMapTblOSRdyTblHigh3;Prio=(Hign33)+Low3;?为什么频繁的使用查表法?请问OSUnMapTbl的来历;,INT8U const OSUnMapTbl=0,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4
11、,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
12、,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;,任务间通信手段,C/OS中,采用多种方法保护任务之间的共享数据和提供任务之间的通信。提供OS_ENTER_CRITICAL和OS_EXIT_CRITICAL来对临界资源进行保护OSSchedLock()禁止调度保护任务级的共享资源。提供了经
13、典操作系统任务间通信方法:信号量、邮箱、消息队列,事件标志。,事件控制块ECB,所有的通信信号都被看成是事件(event),一个称为事件控制块(ECB,Event Control Block)的数据结构来表征每一个具体事件,ECB的结构如下:typedef struct void*OSEventPtr;/*指向消息或消息队列的指针*/INT8U OSEventTblOS_EVENT_TBL_SIZE;/*等待任务列表*/INT16U OSEventCnt;/*计数器(当事件是信号量时)*/INT8U OSEventType;/*事件类型:信号量、邮箱等*/INT8U OSEventGrp;/*
14、等待任务组*/OS_EVENT;与TCB类似的结构,使用两个链表,空闲链表与使用链表,信号量semaphore,信号量在多任务系统中用于:控制共享资源的使用权、标志事件的发生、使两个任务的行为同步。uC/OS中信号量由两部分组成:信号量的计数值和等待该信号任务的等待任务表。信号量的计数值可以为二进制,也可以是其他整数。系统通过OSSemPend()和OSSemPost()来支持信号量的两种原子操作P()和V()。P()操作减少信号量的值,如果新的信号量的值不大于0,则操作阻塞;V()操作增加信号量的值。,多任务的启动,首先创建任务最后调用OSStart开始多任务调度void main()OSI
15、nit();.OSTaskCreat().OSStart();,任务的格式,每个任务不能占用全部CPU的资源需要有等待,或延时等系统调用典型的一个无限循环。void mytask(void*pdata)for(;)do something;waiting;do something;,任务调度,For example1 创建2个任务,每个任务仅仅是进行延时,延时不同的时间片,不同优先级void Task1(void)void Task2(void)while(1)while(1)blinkled1();blinkled2();Task1Data+;Task2Data+;OSTimeDly(25)
16、;OSTimeDly(50);,void main()sysinit();OSInit();OSTaskCreate(Task1,(void*),void OSStart(void)INT8U y,x;if(OSRunning=FALSE)判断是否没有启动内核 y=OSUnMapTblOSRdyGrp;x=OSUnMapTblOSRdyTbly;OSPrioHighRdy=(INT8U)(y 3)+x);找到优先级最高的准备就绪任务 OSPrioCur=OSPrioHighRdy;当前运行任务优先级 OSTCBHighRdy=OSTCBPrioTblOSPrioHighRdy;根据任务优先级找
17、到任务 OSTCBCur=OSTCBHighRdy;OSStartHighRdy();让优先级最高的任务运行起来,OSStartHighRdyLDRr4,addr_OSTCBCur;得到当前任务的TCB地址LDRr5,addr_OSTCBHighRdy;得到最高优先级任务的TCB地址LDRr5,r5;得到任务栈顶指针,注:任务栈顶是TCB的第一个成员LDRsp,r5;切换栈顶指针,也就是切换任务STRr5,r4;改变addr_OSTCBCur值为最高优先级任务TCB地址LDMFDsp!,r4;取任务栈中保存的CPU保存状态寄存器SPSRMSRSPSR_cxsf,r4;改变CPU保存状态寄存器S
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 实操时作 系统

链接地址:https://www.31ppt.com/p-5970487.html