第三讲 嵌入式实时操作系统_第1页
第三讲 嵌入式实时操作系统_第2页
第三讲 嵌入式实时操作系统_第3页
第三讲 嵌入式实时操作系统_第4页
第三讲 嵌入式实时操作系统_第5页
已阅读5页,还剩76页未读 继续免费阅读

下载本文档

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

文档简介

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 网站 www.ucos-,公

2、开源代码 可移植性(Portable) 绝大部分 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个给系统。应用程序最多可以有

3、56个任务。 可确定性 全部 C/OS-II的函数调用与服务的执行时间具有可确定性。 任务栈 每个任务有自己单独的栈, C/OS-II允许每个任务有不同的栈空间,以便压低应用程序对RAM的需求。,C/OS的性能特点,系统服务 C/OS-II提供很多系统服务,例如邮箱、消息队列、信号量、块大小固定的内存的申请与释放、时间相关函数等。 中断管理 中断可以使正在执行的任务暂时挂起,如果优先级更高的任务被该中断唤醒,则高优先级的任务在中断嵌套全部退出后立即执行,中断嵌套层数可达255层。 稳定性与可靠性,C/OS的性能特点,内核结构 任务管理 时间管理 任务之间通信与同步,C/OS的内核结构,任务ta

4、sk,典型的一个无限循环。 void mytask(void *pdata) 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 OSTask

5、Create (void (*task)(void *pd), void *p_arg, OS_STK *ptos, 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号 进程栈底指针 进程栈大小 传递给进程控制块的数据 是否初始化进程栈,任务状态,任务控制

6、块(TCB),任务控制块 OS_TCB是一个数据结构,保存该任务的相关参数,包括任务堆栈指针,状态,优先级,任务表位置,任务链表指针等。 所有的任务控制块分为两条链表,空闲链表和使用链表。,任务控制块结构,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, OSTC

7、BY, OSTCBBitX, OSTCBBitY; OS_TCB,加速任务进入就绪态的过程,事件控制块的指针,任务的状态字,空任务列表,系统初始化时,所有任务控制块被链接成空任务控制块的单向链表,任务的调度-OSSched,C/OS是占先式实时多任务内核,优先级最高的任务一旦准备就绪,则拥有CPU所有权并投入运行。 C/OS中不支持时间片轮转法,每个任务的优先级不一样且是唯一的,所以任务调度的工作就是:查找准备就绪的最高优先级的任务并进行上下文切换。 将被挂起的任务寄存器入栈 将较高优先级任务的寄存器出栈 PC指针跳转到新的位置开始执行 C/OS任务调度所花的时间为常数,与应用程序中建立的任务

8、数无关。(Linux?),检查是否中断调用和允许任务调用,找到优先级最高的任务,该任务是否正在运行,根据优先级找到任务在就绪任务表中的位置,每个任务的就绪状态标志都标入就绪表中(ready list)中,就绪表有两个变量: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的第

9、2位置1,相应的数学表达式为: OSRdyGrp |=0 x04; OSRdyTbl2 |=0 x20;,根据优先级确定就绪表,从上面的计算我们可以得到:若第n位置1,则应该与2n 相或。uC/OS中,把2n的n=0-7的8个值 先计算好存在数组OSMapTbl7中,也就是: OSMapTbl0 =20=0 x1; OSMapTbl1 =21=0 x2; OSMapTbl7 =27=0 x80;,根据优先级确定就绪表,利用OSMapTbl,通过任务的识别号优先级prio来设置任务在就绪组和就绪表数组中相应位置的数学式为: OSRdyGrp |=OSMapTblprio3; OSRdyTblpr

10、io3 |=OSMapTblprio ,根据就绪表确定最高优先级,两个关键: 优先级数分解为高三位和低三位分别确定; 高优先级有着小的优先级号 ;,根据就绪表确定最高优先级,通过OSRdyGrp值确定高3位, 假设为0 x24=100 100b, OSRdyTbl2 和OSRdyTbl5,高优先级为第2组 通过OSRdyTbl2的值来确定低3位, 假设为0 x12=010010b ,第1个和第4个任务,取高优先级第1个 prio=17,源代码中使用了查表法,查表法具有确定的时间,增加了系统的可预测性,uC/OS中所有的系统调用时间都是确定的: High3 =OSUnMapTblOSRdyGrp

11、; 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, 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

12、, 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

13、, 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 ;,任务间通信手段,C/OS中,采用多种方法保

14、护任务之间的共享数据和提供任务之间的通信。 提供OS_ENTER_CRITICAL和OS_EXIT_CRITICAL来对临界资源进行保护 OSSchedLock( )禁止调度保护任务级的共享资源。 提供了经典操作系统任务间通信方法:信号量、邮箱、消息队列,事件标志。,事件控制块ECB,所有的通信信号都被看成是事件(event), 一个称为事件控制块(ECB, Event Control Block)的数据结构来表征每一个具体事件,ECB的结构如下: typedef struct void *OSEventPtr; /*指向消息或消息队列的指针*/ INT8U OSEventTblOS_EVEN

15、T_TBL_SIZE; /*等待任务列表*/ INT16U OSEventCnt; /*计数器(当事件是信号量时)*/ INT8U OSEventType; /*事件类型:信号量、邮箱等*/ INT8U OSEventGrp; /*等待任务组*/ OS_EVENT; 与TCB类似的结构,使用两个链表,空闲链表与使用链表,信号量semaphore,信号量在多任务系统中用于:控制共享资源的使用权、标志事件的发生、使两个任务的行为同步。 uC/OS中信号量由两部分组成:信号量的计数值和等待该信号任务的等待任务表。信号量的计数值可以为二进制, 也可以是其他整数。 系统通过OSSemPend( )和OS

16、SemPost( )来支持信号量的两种原子操作P()和V()。P()操作减少信号量的值,如果新的信号量的值不大于0,则操作阻塞;V()操作增加信号量的值。,多任务的启动,首先创建任务 最后调用OSStart开始多任务调度 void main( ) OSInit( ); . OSTaskCreat( ) . OSStart(); ,任务的格式,每个任务不能占用全部CPU的资源 需要有等待,或延时等系统调用 典型的一个无限循环。 void mytask(void *pdata) for (;) do something; waiting; do something; ,任务调度,For examp

17、le1 创建2个任务,每个任务仅仅是进行延时,延时不同的时间片,不同优先级 void Task1(void) void Task2(void) while(1) while(1) blinkled1(); blinkled2(); Task1Data+; Task2Data+; OSTimeDly(25); OSTimeDly(50); ,void main() sysinit(); OSInit (); OSTaskCreate ( Task1, (void *) ,void OSStart (void) INT8U y, x; if (OSRunning = FALSE) 判断是否没有启动

18、内核 y = OSUnMapTblOSRdyGrp; x = OSUnMapTblOSRdyTbly; OSPrioHighRdy = (INT8U)(y 3) + x); 找到优先级最高的准备就绪任务 OSPrioCur = OSPrioHighRdy; 当前运行任务优先级 OSTCBHighRdy = OSTCBPrioTblOSPrioHighRdy; 根据任务优先级找到任务 OSTCBCur = OSTCBHighRdy; OSStartHighRdy(); 让优先级最高的任务运行起来 ,OSStartHighRdy LDRr4, addr_OSTCBCur; 得到当前任务的TCB地址

19、 LDRr5, addr_OSTCBHighRdy; 得到最高优先级任务的TCB地址 LDRr5, r5; 得到任务栈顶指针,注:任务栈顶是TCB的第一个成员 LDRsp, r5; 切换栈顶指针,也就是切换任务 STRr5, r4; 改变addr_OSTCBCur值为最高优先级任务TCB地址 LDMFDsp!, r4; 取任务栈中保存的CPU保存状态寄存器SPSR MSRSPSR_cxsf, r4 ; 改变CPU保存状态寄存器SPSR LDMFDsp!, r4; 取任务栈中保存的当前CPU状态寄存器CPSR MSRCPSR_cxsf, r4; 改变当前CPU状态寄存器CPSR LDMFDsp!

20、, r0-r12, lr, pc ; 从栈中恢复其它上下文内容,包括r0-r12,lr等 ; 另外跳转PC指针到新任务的代码执行 END,void OSSched (void) INT8U y; OS_ENTER_CRITICAL(); if (OSLockNesting | OSIntNesting) = 0) 调度锁,或者处于中断状态禁止调度 y = OSUnMapTblOSRdyGrp; OSPrioHighRdy = (INT8U)(y 3) + OSUnMapTblOSRdyTbly); 获取准备就绪组里最高优先级的任务 if (OSPrioHighRdy != OSPrioCur)

21、 OSTCBHighRdy = OSTCBPrioTblOSPrioHighRdy; 设置运行任务为最高优先级任务 OSCtxSwCtr+; OS_TASK_SW(); 执行上下文切换 OS_EXIT_CRITICAL(); ,OS_TASK_SW 任务的上下文切换,保护当前任务的现场 恢复新任务的现场 开始执行新的任务 自己阅读代码,什么也不做的空闲任务,只是为了消耗CPU的时间片 void OSTaskIdle ( ) for (;) OS_ENTER_CRITICAL(); OSIdleCtr+; OS_EXIT_CRITICAL(); ,中断与时钟节拍,我们知道:当发生中断时,首先应保

22、护现场,将CPU寄存器入栈,再处理中断函数,然后恢复现场,将CPU寄存器出栈,最后执行中断返回iret(x86)指令实现中断返回。 uC/OS中提供了OSIntEnter() 和OSIntExit() 告诉内核进入了中断状态。 OSIntNesting标识中断嵌套层次。 时钟节拍是一种特殊的中断,操作系统的心脏。首先32位的整数OSTime加一。对任务列表进行扫描,判断是否有延时任务应该处于准备就绪状态,最后进行上下文切换。,void OSTimeDly (INT16U ticks) if (ticks 0) 确保tick大于0 OS_ENTER_CRITICAL(); 进入临界段代码 if

23、(OSRdyTblOSTCBCur-OSTCBY 调度下一个任务开始运行 ,时钟定时,void OSTimeTick (void) OS_TCB *ptcb; ptcb = OSTCBList; -OSTCB链表指针 while (ptcb-OSTCBPrio != OS_IDLE_PRIO) 是不是空闲任务?空闲任务在队列尾部 if (ptcb-OSTCBDly != 0) 是否延时 if (-ptcb-OSTCBDly = 0) 延时减一,看是否延时结束 if (!(ptcb-OSTCBStat 变量加一,记录系统启动以来的时钟滴答数 ,时钟节拍函数,OSTimeTick( void ),

24、时间,任务一,任务二,OSStart,Time Tick,Time Tick,0,25,50,Time Tick,空闲任务,5,总结,不存在一个内核任务/实体,内核的管理是通过调用系统函数来实现的。 每个任务有自己的堆栈空间。内核对任务的占先式调度不会干扰每个任务的总的运行结果。,COS-II在ARM9上的移植,所谓移植,是指使一个实时操作系统能够在某个微处理器平台上运行。COS-II的主要代码都是由标准的C语言写成的,移植方便。,移植COS-II满足的条件,处理器的C编译器能产生可重入代码。 在程序中可以打开或者关闭中断。 处理器支持中断,并且能产生定时中断(通常在101000Hz之间)。

25、处理器能够容纳一定量数据的硬件堆栈。 处理器有将堆栈指针和其他CPU寄存器存储和读出到堆栈(或者内存)的指令。,打开/关闭中断,在COS-II中,可以通过: OS_ENTER_CRITICAL () OS_EXIT_CRITICAL() 宏来控制系统关闭或者打开中断。这需要处理器的支持。 在ARM9的处理器上,可以设置相应的寄存器来关闭或者打开系统的所有中断。(CPSR的I/F位、MSR、MRS),处理器支持中断并且能产生定时中断,COS-II是通过处理器产生的定时器的中断来实现多任务之间的调度的。ARM9的处理器上可以产生定时器中断。 本系统工作在200MHz的主频下,可以设置定时器的中断的

26、频率为100Hz。也就是系统的响应时间为10ms。,处理器支持硬件堆栈,COS-II进行任务调度的时候,会把当前任务的CPU寄存器存放到此任务的堆栈中,然后,再从另一个任务的堆栈中恢复原来的工作寄存器,继续运行另一个任务。所以,寄存器的入栈和出栈是COS-II多任务调度的基础。 ARM9处理器中有专门的指令处理堆栈,可以灵活的使用堆栈。(LDM、STM),例:C/OS-II在S3C2410上的移植,设置OS_CPU.H中与处理器和编译器相关的代码 用C语言编写六个操作系统相关的函数 OS_CPU_C.C 用汇编语言编写四个与处理器相关的函数 OS_CPU.ASM,设置与处理器和编译器相关的代码

27、,OS_CPU.H中定义了与编译器相关的数据类型。比如:INT8U、INT8S等。 与 ARM处理器相关的代码,使用 OS_ENTER_CRITICAL() 和 OS_EXIT_CRITICAL() 宏开启关闭中断。 设施堆栈的增长方向 堆栈由高地址向低地址增长,用汇编语言编写四个与处理器相关的函数,OSStartHighRdy() OSCtxSw() OSIntCtxSw() OSTickISR(),移植要点,定义函数OS_ENTER_CRITICAL和OS_ENTER_ CRITICAL。 定义函数OS_TASK_SW执行任务切换。 定义函数OSCtxSw实现用户级上下文切换,用汇编实现。

28、 定义函数OSIntCtxSw实现中断级任务切换,用汇编实现。 定义函数OSTickISR。 定义OSTaskStkInit来初始化任务的堆栈。,本节提要,1,3,2,嵌入式实时操作系统C/OS,嵌入式Linux,WinCE,Linux的特点,Linux系统是层次结构且内核完全开放 强大的网络支持功能 Linux具备一整套开发工具链 Linux具有广泛的硬件支持特性 遵循通用国际标准,便于程序的移植,Linux的结构,类UNIX,嵌入式Linux,嵌入式Linux(Embedded Linux)是指对Linux经过小型化裁剪后,能够固化在容量只有几百K字节或几兆字节的存储器芯片或单片机中,应用

29、于特定嵌入式场合的专用Linux操作系统。嵌入式Linux的开发和研究是目前操作系统领域的一个热点。 RTLinux CLinux ,Linux作为嵌入式应用的缺点,首先linux最初设计为通用操作系统,其目标是追求整体最佳性能,所以不能很好处理实时任务; 其次,如何精简linux适用于嵌入式环境也是一个难题。,嵌入式linux的研究内容,嵌入式linux内核技术 嵌入式库技术 开发环境技术 BIOS和boot loader启动加载程序 设备驱动技术 图形界面技术 嵌入式应用,几种嵌入式Linux,MontaVista linux MontaVista Linux是由MontaVista公司开

30、发产品,是目前最具影响力嵌入式Linux。MontaVista通过直接修改内核来扩充linux内核的实时性。 RTlinux RTlinux是FSMLabs开发的硬实时嵌入式linux。RTlinux使用双内核结构;在底层使用一个硬实时内核,linux作为该内核的空闲任务;当有实时任务时,通过硬实时内核调度该任务;没有其他任务时,则运行普通linux。 uClinux uClinux是针对无mmu微控制领域而设计的Linux系统。u是希腊字母表示”小”,C是controller表示控制器。uClinux和标准linux最大的区别是内存管理上,标准linux利用CPU硬件的支持实现虚拟内存机制,

31、而uClinux采用实存储器管理策略。,uCLinux是一个完全符合GNU/GPL公约的项目,完全开放代码,现由Lineo公司支持维护。英文单词中u表示Micro,小的意思,C表示Control,控制的意思,所以uCLinux就是Micro-Control-Linux,字面上的理解就是“微控制领域中的Linux系统”。它专门针对没有MMU的CPU,并专为嵌入式系统做了许多小型化的工作,已支持前面提到的多款CPU。 uCLinux与nommu相关的功能现已被合并到Linux 2.6核心中。 官方主页:,Clinux,内存管理,uClinux同标准Linu

32、x的最大区别就在于内存管理,标准Linux使用的虚拟存储器技术 标准Linux是针对有内存管理单元的处理器设计的。虚拟地址被送到内存管理单元(MMU),把虚拟地址映射为物理地址。采用分页的方式来载入进程。实际存储器分割为相同大小的页面。 虚拟存储器由存储器管理机制及一个大容量的快速硬盘存储器支持。当一个程序在运行之前,没有必要全部装入内存,而是仅将那些当前要运行的那些部分页面装入内存运行(copy-on-write)。 通过赋予每个任务不同的虚拟-物理地址转换映射(页表),还可支持不同任务之间的保护、共享等。 对于多进程管理当处理器进行进程切换并执行一个新任务时,一个重要部分就是为新任务切换页

33、表。,标准Linux系统的内存管理功能,可以运行只加载了部分的程序,缩短了程序启动的时间 运行比内存还要大的程序。理想情况下应该可以运行任意大小的程序可以使多个程序同时驻留在内存中提高CPU的利用率可以运行重定位程序。即程序可以方于内存中的任何一处,而且可以在执行过程中移动 可以进行程序代码共享提供内存保护,进程不能以非授权方式访问或修改页面,内核保护单个进程的数据和代码以防止其它进程修改它们。 代价:内存管理需要地址转换表和其他一些数据结构,留给程序的内存减少了。地址转换增加了每条指令的执行时间,而对于有额外内存操作的指令会更严重。当进程访问不在内存的页面时,系统处理失效的磁盘I/O操作极耗时间。,针对NOMMU的特殊处理,uClinux针对没有MMU的处理器设计,不能使用处理器的虚拟内存管理技术;uClinux仍然沿用标准Linux的分页内存管理结构,系统在启动时把实际存

温馨提示

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

评论

0/150

提交评论