资源预览内容
第1页 / 共25页
第2页 / 共25页
第3页 / 共25页
第4页 / 共25页
第5页 / 共25页
第6页 / 共25页
第7页 / 共25页
第8页 / 共25页
第9页 / 共25页
第10页 / 共25页
亲,该文档总共25页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
目录嵌入式RTOS31.嵌入式系统基本模型32.RTOS设计原则33.GPOS与RTOS34.嵌入式开发模式35.(不)可重入46.互斥条件47.临界状态4uC/OS-II基本介绍51.uC/OS-II文件结构52.uC/OS-II组成部分53.uC/OS-II任务状态6uC/OS-II系统核心61.uC/OS-II任务调度6(1)uC/OS-II调度算法6(2)任务就绪表6(3)任务级任务调度7(4)中断级任务调度7(5)调度器上锁与解锁8(6)中断管理函数9(7)中断相关问题92.uC/OS-II系统启动10(1)初始化函数OSInit()10(2)启动函数OSStart()11(3)统计任务OSTaskStat113.uC/OS-II系统时钟114.uC/OS-II事件管理12(1)事件控制块12(2)ECB管理机制12(3)ECB管理函数12uC/OS-II任务管理131.C可执行代码结构132.任务结构133.任务栈144.任务控制块14(1)TCB描述14(2)TCB主要成员14(3)TCB全局变量145.任务状态切换146.任务管理函数15uC/OS-II通信与同步151.消息邮箱Mbox152.消息队列msgQ16(1)msgQ基本内容16(2)msgQ全局变量16(3)msgQ管理函数17(4)msgQ几个问题173.信号量Sem174.互斥锁Mutex18(1)Mutex基本原理18(2)提升/恢复优先级18(3)Mutex管理函数195.事件组标志Flag19(1)Flag基本原理19(2)Flag数据结构20(3)Flag管理函数216.Task就绪状态判断?22uC/OS-II内存管理221.memPart基本原理222.memPart管理函数233.memPart几个问题23uC/OS-II应用开发231.开发步骤232 编写任务函数243堆栈设计扩展244 一些借鉴经验25uC/OS-II内核移植251.uC/OS-II正常运行的条件252.运行态代码分布253.移植的几个问题26嵌入式RTOS1. 嵌入式系统基本模型2. RTOS设计原则采用各种算法和策略,始终保持系统行为的可预测性。即在任何情况下,在系统运行的任何时刻,OS的资源配置策略都能为争夺资源(包括CPU、内存、网络带宽等)的多个实时任务合理地分配资源,使每个实时任务的实时性要求都能得到满足。3. GPOS与RTOS GPOS:注重每次执行的平均响应时间,而不是某次特定执行的响应时间。 RTOS:除满足应用功能需求外,还要满足实时性要求,始终保证系统行为的可预测性(predictability)。与GPOS不同,RTOS注重的不是系统的平均表现,而是要满足每个实时任务在最坏情况下的实时性要求。也就是说,RTOS注重的是个体表现,更准确地说是个体最坏情况表现。RTOS与GPOS的差别主要表现在:a) 任务调度策略不同;b) 内存管理方式不同;c) 中断处理方式不同;d) 系统管理方式不同;4. 嵌入式开发模式 单片机系统的前后台程序:不使用OS,将应用程序设计成死循环,系统轮流处理各事件,对时间响应要求高的异步事件采用中断进行处理。 基于任务(进程)的软件设计方法:使用OS,由OS管理硬件资源,任务只是在需要资源时申请即可,至于when/which,完全由OS决定。5. (不)可重入 (1) 可重入函数:指函数代码在运行过程中可以被中断,中断返回后仍能够恢复到原来的状态,并能准确无误执行的函数。可重入函数可以被一个以上的任务调用,而不必担心数据被破坏。可重入函数或者只使用局部变量,即变量保存在CPU寄存器或堆栈中;或者使用全局变量,则要对全局变量予以保护。(2) 不可重入函数:函数在运行过程中不可以被中断。6. 互斥条件实现任务间通信最简便的办法是使用共享数据,但要保证任务在处理共享数据时的排它性。使共享资源满足互斥条件,最一般的方法有:(1) 关中断使用某种实时内核,一般情况下关中断的时间最长不超过内核本身的关中断时间,这样就不会影响系统中断延迟。(2) 使用测试并置位指令Test&Set操作可能是微处理器一条不会被中断的指令,否则应该在程序中关中断做TAS操作再开中断。(3) 禁止做任务切换此时任务切换虽然是禁止的,但仍允许中断。如果这时中断来了,ISR会在这一临界区内立即执行。(4) 利用信号量;7. 临界状态临界状态指当前程序处于不可中断状态。一般情况下,在调用不可重入函数前或在修改全局变量数据时,都需要先进入临界状态。进入临界状态的主要操作是关闭所有可以屏蔽的中断;而退出临界状态的主要操作是恢复到上次进入临界状态时前中断管理的状态。在uC/OS-II中,宏OS_ENTER_CRITICAL()描述进入临界状态所完成的操作,宏OS_EXIT_CRITICAL()描述退出临界状态的操作。uC/OS-II提供了3种进入和退出临界状态的办法,可以根据CPU类型由宏OS_CRITICAL_MOTHOD指定具体的临界状态处理办法。uC/OS-II基本介绍1. uC/OS-II文件结构2. uC/OS-II组成部分uC/OS-II大致可以分成系统核心(包含任务调度)、任务管理、时间管理、多任务同步与通信、内存管理、CPU移植等部分。(1) 核心部分(OSCore.c) :uC/OS-II处理核心,包括初始化、启动、中断管理、时钟中断、任务调度及事件处理等用于系统基本维持的函数。(2) 任务管理(OSTask.c) :包含与任务操作密切相关的函数,包括任务建立、删除、挂起及恢复等,uC/OS II以任务为基本单位进行调度。(3) 时钟部分(OSTime.c) :uC/OS-II中最小时钟单位是timetick(时钟节拍),其中包含时间延迟、时钟设置及时钟恢复等与时钟相关的函数。(4) 多任务同步与通信(OSMbox.c, OSQ.c, OSSem.c, OSMutex.c, OSFlag.c):包含事件管理函数,涉及Mbox、msgQ、Sem、Mutex、Flag等。(5) 内存管理部分(OSMem.c):主要用于构建私有的内存分区管理机制,其中包含创建memPart、申请/释放memPart、获取分区信息等函数。(6) CPU接口部分:uC/OS-II针对特定CPU的移植部分,由于牵涉到SP等系统指针,通常用汇编语言编写,包括任务切换、中断处理等内容。3. uC/OS-II任务状态在uC/OS-II中,一个任务就是一个线程,该任务可以认为CPU完全属于它自己。任务有自己的堆栈和CPU寄存器,并且被赋予一定的优先级。任务可能处于睡眠、就绪、运行、等待或中断服务状态之一。uC/OS-II系统核心 主要包含在C源文件OS_CORE.C中。1. uC/OS-II任务调度(1) uC/OS-II调度算法uC/OS-II采用基于优先级的调度算法,总是选择当前处于就绪状态的优先级最高的任务进行调度。uC/OS-II是可抢占性的强实时性OS,在完成中断后允许进行新的任务调度。uC/OS-II有两种调度方式:任务级任务调度、中断级任务调度。(2) 任务就绪表INT8U const OSUnMapTbl256 = ;OS_EXT INT8U OSRdyGrp;OS_EXT INT8U OSRdyTblOS_RDY_TBL_SIZE; 添加就绪任务至就绪表; 从就绪表删除就绪任务; 查找最高优先级就绪任务OS_SchedNew();(3) 任务级任务调度指在非中断返回时进行任务调度,一般发生在当前任务因时间延迟或等待某事件而阻塞或被挂起,或有更高优先级的任务处于就绪状态。任务的基本信息: CPU的PC寄存器:任务当前执行的位置; CPU的通用寄存器:任务当前执行涉及的临时数据; CPU的状态寄存器:存储当前CPU的状态。任务级任务切换:从一个任务直接切换至另一个任务,不涉及CPU状态的切换,OS_TASK_SW()既保存当前任务上下文,又恢复新任务上下文。过程:OS_Sched() - OS_SchedNew() - OS_TASK_SW()(4) 中断级任务调度 中断级任务切换:在中断处理完成后,通过OSIntExit()判断是否有更高优先级就绪任务。如果有,调用OSIntCtxSW()恢复新任务上下文。注意:在中断处理中,已经保存了被中断任务的上下文,所以这里仅仅恢复。过程:OSIntExt() OSIntEnter() - ISR OSIntExit() - OSIntCtxSW()(5) 调度器上锁与解锁uC/OS-II提供调度器锁定功能,在锁定期间不能进行任务调度。uC/OS-II使用全局变量OSLockNesting标识是否锁定了任务调度器。 OS_EXT INT8U OSLockNesting; void OSSchedLock(void); void OSSchedUnlock(void);(6) 中断管理函数在中断处理中,不允许进行任务管理、事件管理及任务调度等操作。uC/OS-II通过全局变量OSIntNesting标识当前是否处于中断状态。在所有任务及事件管理的程序中,都有对OSIntNesting进行判断的语句。 void OSIntEnter(void); void OSIntExit(void);(7) 中断相关问题 OS_ENTER_CRITICAL() OS_EXIT_CRITICAL()关中断使得uC/OS-II能够同时避免有其他任务或中断服务进入临界代码段。调用uC/OS-II功能函数时,中断总应当是开着的。 uC/OS-II如何禁止调度? 在中断中允许调度吗?为什么? uC/OS-II如何屏蔽中断?2. uC/OS-II系统启动uC/OS-II首先调用OSInit()进行初始化,然后创建任务(此时还未启动系统,仅仅为其分配资源),然后调用OSStart()启动系统,将CPU控制权交给uC/OS-II,OS根据任务优先级选择由哪个任务开始执行,或创建新的任务。(1) 初始化函数OSInit()OSInit()主要完成初始化操作,包括初始化全局变量(在OS_InitMisc()中)、任务就绪表、TCB、ECB、FCB、内存单元、消息队列,并创建空闲任务。如果有必要,创建统计任务。 OS_InitMisc();/初始化部分全局变量 OS_InitRdyList();/初始化任务就绪表 OS_InitTCBList();/初始化空闲TCB链表 OS_InitEventList();/初始化ECB链表 OS_FlagInit();/初始化事件组标志结构 OS_MemInit();/初始化内存管理
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号