移植嵌入式操作系统心得

上传人:第*** 文档编号:34049804 上传时间:2018-02-20 格式:DOC 页数:15 大小:70KB
返回 下载 相关 举报
移植嵌入式操作系统心得_第1页
第1页 / 共15页
移植嵌入式操作系统心得_第2页
第2页 / 共15页
移植嵌入式操作系统心得_第3页
第3页 / 共15页
移植嵌入式操作系统心得_第4页
第4页 / 共15页
移植嵌入式操作系统心得_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《移植嵌入式操作系统心得》由会员分享,可在线阅读,更多相关《移植嵌入式操作系统心得(15页珍藏版)》请在金锄头文库上搜索。

1、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(时钟节拍)

2、 ,其中包含时间延迟、时钟设置及时钟恢复等与时钟相关的函数。(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 任务状态

3、在 uC/OS-II 中,一个任务就是一个线程,该任务可以认为 CPU 完全属于它自己。任务有自己的堆栈和 CPU 寄存器,并且被赋予一定的优先级。任务可能处于睡眠、就绪、运行、等待或中断服务状态之一。4. uC/OS-II 与 VxWorks 的比较 【专题】uC/OS-II 内核架构解析(3 )-uC/OS-II 系统核心 主要包含在 C 源文件 OS_CORE.C 中。1. uC/OS-II 任务调度 (1) uC/OS-II 调度算法 uC/OS-II 采用基于优先级的调度算法,总是选择当前处于就绪状态的优先级最高的任务进行调度。uC/OS-II 是可抢占性的强实时性 OS,在完成中断

4、后允许进行新的任务调度。 uC/OS-II 有两种调度方式:任务级任务调度、中断级任务调度。(2) 任务就绪表 INT8U const OSUnMapTbl256 = ; OS_EXT INT8U OSRdyGrp; OS_EXT INT8U OSRdyTblOS_RDY_TBL_SIZE; 添加就绪任务至就绪表; 从就绪表删除就绪任务; 查找最高优先级就绪任务 OS_SchedNew(); (3) 任务级任务调度 指在非中断返回时进行任务调度,一般发生在当前任务因时间延迟或等待某事件而阻塞或被挂起,或有更高优先级的任务处于就绪状态。任务的基本信息:CPU 的 PC 寄存器:任务当前执行的位置

5、; CPU 的通用寄存器:任务当前执行涉及的临时数据; CPU 的状态寄存器:存储当前 CPU 的状态。 任务级任务切换:从一个任务直接切换至另一个任务,不涉及 CPU 状态的切换,OS_TASK_SW()既保存当前任务上下文,又恢复新任务上下文。过程:OS_Sched() - OS_SchedNew() - OS_TASK_SW() (4) 中断级任务调度 中断级任务切换:在中断处理完成后,通过 OSIntExit()判断是否有更高优先级就绪任务。如果有,调用 OSIntCtxSW()恢复新任务上下文。注意:在中断处理中,已经保存了被中断任务的上下文,所以这里仅仅恢复。过程:OSIntExt

6、() 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 标识当前是否处于中断状态。在

7、所有任务及事件管理的程序中,都有对 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()进行初始化,然后创建任务

8、(此时还未启动系统,仅仅为其分配资源) ,然后调用 OSStart()启动系统,将 CPU 控制权交给 uC/OS-II,OS 根据任务优先级选择由哪个任务开始执行,或创建新的任务。(1) 初始化函数 OSInit() OSInit()主要完成初始化操作,包括初始化全局变量(在 OS_InitMisc()中) 、任务就绪表、TCB 、ECB、FCB、内存单元、消息队列,并创建空闲任务。如果有必要,创建统计任务。OS_InitMisc(); /初始化部分全局变量 OS_InitRdyList(); /初始化任务就绪表 OS_InitTCBList(); /初始化空闲 TCB 链表 OS_Init

9、EventList(); /初始化 ECB 链表 OS_FlagInit(); /初始化事件组标志结构 OS_MemInit(); /初始化内存管理 OS_QInit(); /初始化消息队列 OS_InitTaskIdle(); /创建空闲任务 OS_InitTaskStat(); /创建统计任务 uC/OS-II 初始化了 5 个空的数据结构缓冲区,每个缓冲区都是单向链表,允许uC/OS-II 从缓冲区中迅速取得或释放一个缓冲区中的元素。 uC/OS-II 调用 OSInit()后的变量与数据结构 如下图所示:(2) 启动函数 OSStart() OSStart()在一切准备就绪且需要首先创

10、建的任务都被创建后,启动 uC/OS-II。它从就绪表中查找最高优先级就绪任务,并恢复其上下文开始执行。过程:OSStart() - OS_SchedNew() - OSStartHighRdy()问题:任务第一次被调用时,哪来的上下文供其恢复呢 ?创建任务时,调用了OSTaskStkInit()初始化任务堆栈,可此函数中没有涉及任务的上下文呀?uC/OS-II 调用 OSStart()后的变量和数据结构 如下图所示:(3) 统计任务 OSTaskStat OSTaskStat 用于计算 CPU 利用率。设置 OS_CFG.H 中的 OS_TASK_STAT_EN 为 1,创建统计任务,在系统

11、启动后一直处于就绪状态。刚开始时,空闲任务运行 1S,为计算 CPU 利用率提供一个基准值,并保存在统计任务的堆栈中,这个值不会改变除非重新启动 CPU。此后空闲任每次被其它任务抢去 CPU 时,它里面的计数器就会直接记录下 CPU 空闲的时间。3. uC/OS-II 系统时钟 任何实时系统的时钟硬件设备每隔一段时间(一个系统 tick)产生一个硬件中断,OS 接收到该中断后,更新时间计数器,更新所有对时钟依赖的程序代码,从而维持系统有序稳定的运行。主要包含在 C 源文件 OS_TIME.C 中。#define OS_TICKS_PER_SEC 100 /系统时钟中断间隔 OS_EXT vol

12、atile INT32U OSTime; /系统运行的时间值 void OSTimeTick(void); /时钟中断服务程序 void OSTimeDly(INT16U ticks); /延迟指定时钟节拍 INT8U OSTimeDlyHMSM(); /延迟指定时间长度 INT8U OSTimeDlyResume(prio); /恢复等待(时延/ 阻塞)任务 INT32U OSTimeGet(void); /读取当前时间 void OSTimeSet(INT32U ticks); /设置当前时间 4. uC/OS-II 事件管理 (1) 事件控制块 INT8U OSEventType; /事

13、件类型 void *OSEventPtr; /指向 MBox 或 Queue INT16U OSEventCnt; /信号量计数器(注:Mutex) INT8U OSEventGrp; /事件等待组标志 INT8U OSEventTbl; /时间任务等待表 INT8U OSEventName; /时间名称 (2 ) ECB 管理机制 OS_EXT OS_EVENT *OSEventFreeList; /空闲 ECB 链表指针 OS_EXT OS_EVENT OSEventTbl; /ECB 结构体数组 (3 ) ECB 管理函数 OS_InitEventList():初始化 ECB; OS_E

14、ventWaitListInit():在创建事件时调用,初始化 ECB 任务等待表; OS_EventTaskRdy():在事件发生时调用,修改此事件中最高优先级任务的 TCB 成员变量,在任务就绪表中添加此任务,将相应信息传递给该任务 TCB,并将此任务从事件的任务等代表中删除; OS_EventTaskWait():在申请资源失败而暂停当前任务时被调用,将任务从任务就绪表中删除,并添加到事件的任务等代表中; OS_EventTO():在事件等待超时时调用,将此任务从事件的任务等代表中删除,并修改该任务的 TCB 成员变量; 【专题】uC/OS-II 内核架构解析(4 )-uC/OS-II

15、任务管理 1. C 可执行代码结构 (1)代码段.text:存放 CPU 执行的机器指令,通常.text 是可共享且只读的。(2)数据段.data:.rodata(常量数据) 、.rwdata(已初始化全局变量、静态变量) 。(3)未初始化数据段.bss:未初始化的全局变量、静态变量。(4)栈.stack:存放函数参数、局部变量及任务切换时的上下文。(5)堆.heap :用于动态内存分配。2. 任务结构 在 uC/OS-II 中,任务是事件运行和管理的基本单元。一个 uC/OS-II 任务至少包含程序代码、栈和 TCB,还可选择性使用相当于堆的动态内存空间。程序运行时,uC/OS-II 中的任务相当于可执行代码(可单

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 解决方案

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号