内核实验五(μCOS-II的内存管理)
嵌入式μCOS-II内核实验四(哲学家就餐问题的实现)
目录
• 引言 • 哲学家就餐问题概述 • μcos-ii内核任务管理 • 哲学家就餐问题的μcos-ii实现 • 实验结果与分析 • 总结与展望
01
引言
嵌入式系统与μcos-ii内核简介
嵌入式系统
是一种专用的计算机系统,主要用于控制、监视或帮助操作 机器设备。它通常具有实时性、可靠性和低功耗等特点,广 泛应用于工业控制、智能家居、医疗设备等领域。
任务优先级与调度
任务优先级
在μcos-ii内核中,每个任务都有自己 的优先级。优先级高的任务会优先获 得CPU的使用权。
任务调度
μcos-ii内核使用基于优先级的抢占式任务 调度算法。当一个高优先级的任务就绪时, 内核会立即抢占当前正在运行的任务,并切 换到高优先级的任务上运行。
任务同步与通信
任务同步
解决方案的分类与比较
解决方案分类
解决哲学家就餐问题的方案可以分为两类:静态方案和动态方案。静态方案在 系统启动时分配固定的资源,而动态方案则在运行时动态地分配资源。
解决方案比较
静态方案实现简单,但可能导致死锁或饥饿问题。动态方案可以更好地解决这 些问题,但实现起来较为复杂,需要更多的系统资源和时间。在实际应用中, 需要根据具体需求和系统限制选择合适的解决方案。
05
实验结果与分析
实验环境与配置
01
硬件平台
ARM Cortex-M4微控制器 (具体型号为
STM32F407ZGT6)
02
开发环境
Keil uVision5
03
04
实验任务
实现基于μcos-ii内核的多任务 切换
配置参数
任务优先级、任务堆栈大小、 任务状态等
实验五 ucOS II内存管理及显示驱动实验
实验五ucOS II内存管理及显示驱动实验一、实验目的●回顾uC/OS II 在Cortex-M3(LM3S9B2芯片)平台上的移植,以及RS232串口、TFT显示等驱动程序的加载。
●回顾µC/OS-II任务管理的基本函数调用,任务堆栈、任务控制块、任务就绪表的结构和作用。
●掌握操作系统存储管理方法,以及在uC/OS II 中采用的存储光管理方法。
●掌握uC/OS II中和存储管理相关的基本函数,实现原理以及应用方法。
●应用µC/OS-II中的存储管理机制处理简单的实际问题。
二、实验环境与设备1、实验独立进行,每位学生上交一份实验报告及其相应的程序。
2、安装Windows操作系统(Windows Xp)的计算机,并且已经安装VC 6.0编程调试软件。
3、安装Keil for ARM 仿真调试软件,JLink软件,超级终端或者串口精灵等辅助调试工具。
4、Cortex-M3(LM3S9B92内核)评估板,串口线,USB线,电源等。
三、预习要求1. 基础内容在ANSI C 中是使用malloc 和free 两个函数来动态分配和释放内存。
例如在Linux 系统中就是这样。
但在嵌入式实时系统中,多次这样的操作会导致内存碎片,因为嵌入式系统尤其是uCOS是实地址模式,这种模式在分配任务堆栈时需要整块连续的空间,否则任务无法正确运行。
且由于内存管理算法的原因,malloc 和free的执行时间也是不确定。
这点是实时内核最大的矛盾。
基于以上的原因uC/OS‐II中把连续的大块内存按分区管理。
每个分区中包含整数个大小相同的内存块,但不同分区之间的内存快大小可以不同。
用户需要动态分配内存时,系统选择一个适当的分区,按块来分配内存。
释放内存时将该块放回它以前所属的分区,这样能有效解决碎片问题,同时执行时间也是固定的。
同时uCOS‐II 根据以上的处理封装了适合于自己的动态内存分配函数OSMemGet()和OSMemPut(),但是使用这两个函数动态分配内存前需要先创建内存空间即内存分块。
μCOS原理与实践6
6.4内存分区获取 创建之后,形成了一个空闲内存块链表,而给链表由内存控制块MCB来管理。现 在就可以申请内存分区了,内存分区获取函数是OSMemGet。 应用程序需要从已建立的内存分区中申请一个内存块时,可以调用OSMemGet函 数。该函数有两个参数,第一个参数为pmem,也就是前节创建内存分区函数 所返回的内存控制块的指针。另一个参数为perr,用于返回函数执行的信心。 表6.6分配一个内存块OSMemGet()解析 1首先进行参数检查,查看QCB指针是否有效。 2判断是否有空闲的内存块,如果没有就设置perr为 OS_ERR_MEM_NO_FREE_BLKS,然后返回空指针。 3从链表中摘下表头,返回取下的内存块的地址。这样就申请到了内存块。
嵌入式实时操作系统 μC/OS原理与实践
第6章 内存管理
6.1 内存管理数据结构 6.1.1内存控制块 6.1.2 内存控制块实体 6.1.3 空闲内存控制块链表 6.1.4 内存分区 6.2 内存控制块初始化 6.3 创建内存分区 6.4内存分区获取 6.5内存分区释放 6.6查询内存分区的状态 6.7内存管理实例 习题
首先,当操作系统需要创建内存分区时,调用 OSMemCreate()函数,并通过参数传递需要建立内存分区 的属性,包括:内存分区的首地址,内存分区中内存块的数 量,内存分区中内存块的大小,以及返回信息代码的地址。 然后,检查判断是否执行函数参数检查,以保证内存分区的 创建成功。如果执行函数参数检查,则判断:内存分区地址 是否有效,内存分区地址大小是否一致,内存分区是否至少 含有两个内存块,每个内存块是否起码可以容纳一个指针。
嵌入式系统中,内存资源是十分宝贵的,如果采 用内存分区方式不合理,经过一段时间的内存分 配和释放、再发配和再释放,会产生很多零散的 内存碎块。这些零散的空间很难利用,因此怎样 解决内存分配过程中产生的碎块问题是内存管理 的关键问题。 μC/OS-II中,采用分区的方式管理内存,即将连 续的大块内存按分区来管理,每个系统中有数个 这样的分区,每个分区又包含数个小相同的内存 块。这样,在分配内存的时候,根据需要从不同 的分区中得到数个内存块,而在释放时,这些内 存块重新释放回他们原来所在的分区。这样就不 会产生内存越分越凌乱,没有整块的连续分区的 问题了。
μCOS-II微小内核分析
概述| μC/OS-II微小内核分析
3、配置文件
μC/OS-II微小内核简介
配置文件是每个μC/OS-II程序必备的文件,而且不同的程序 一般不一样,但大小基本上相同。配置文件范例位于H目录下, 分别为INCLUDES.H和OS_CFG.H文件。
(1) INCLUDES.H:内核需要的头文件,对于特定的移植,一般 不需要改变; (2)OS_CFG.H:内核配置的头文件,一般需要根据程序的需求 修改其常量的内容。
OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL() 所属文件 移植代码 函数名称 OSTimeTick OSIntEnter 所属文件 OS_CORE.C OSTaskCreate OSSemCreate OSIntExit OSTaskDel OSStart OS_TASK.C 函数名称 OSSemDel 函数名称 OSSemPend OS_TIME.C OSInit OS_CORE.C OS_SEM.C 所属文件 OS_SEM.C 函数名称 OSSemPost 函数名称 OSTimeDly 由移植代码决定 (INT8U prio) 函数原型 void OSTimeTick(void) void OSIntExit(void) OS_EVENT *OSSemCreate (INT16U *pd), INT8U opt, INT8U *err) INT8U *OSSemDel OSStart(void) 函数原型 OS_EVENTOSTaskDel (void (*task)(voidINT16U timeout, INT8U *err) 函数原型 void OSSemPend (INT16U ticks) *pevent) OSTimeDly (OS_EVENT *pevent, cnt) void OSTaskCreate OSInit(void) 函数原型 INT8U OSSemPost (void)(OS_EVENT *pevent,void *pdata, OS_STK *ptos, INT8U prio) 函数原型 INT8U OSIntEnter (OS_EVENT 一般来说,OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()为定义的宏,用来 通知μC/OS-Ⅱ一个中断服务已开始执行,这有助于μC/OS-Ⅱ掌握中断嵌套的情 功能描述 删除信号量:在删除信号量之前,应当删除可能会使用这个信号量的任务 在每次时钟节拍中断服务程序中被调用,无函数参数和返回值。OSTimeTick()检查 建立并初始化一个信号量 通知μC/OS-Ⅱ一个中断服务已执行完毕,这有助于μC/OS-Ⅱ掌握中断嵌套的情 启动μC/OS-II的多任务环境,无函数参数和返回值 功能描述 发送信号量:如果指定的信号量是零或大于零,OSSemPost()函数递增该信号量 建立一个新任务。既可以在多任务环境启动之前,也可以在正在运行的任务中创建 删除一个指定优先级的任务。被删除的任务将回到休眠状态,任务被删除后可 初始化μC/OS-Ⅱ,无函数参数和返回值 功能描述 将一个任务延时若干个时钟节拍,无函数返回值。延时时间的长度可从0到65535个 功能描述 等待信号量:当任务调用OSSemPend()函数时,如果信号量的值大于零,那么 功能描述 功能描述 禁止、打开CPU的中断,无函数参数和返回值 况。通常OSIntExit()和OSIntEnter()联合使用,无函数参数和返回值 处于延时状态的任务是否达到延时时间,或正在等待事件的任务是否超时 任务 况。通常OSIntExit()和OSIntEnter()联合使用。当最后一层嵌套的中断执行完毕 以用函数OSTaskCreate()重新建立 时钟节拍,延时时间0表示不进行延时,函数将立即返回调用者,延时的具体时间 并返回。如果有任务在等待信号量,则最高优先级的任务将得到信号量并进入就绪 功能描述 pevent :指向信号量的指针,OSSemCreate()的返回值 cnt :建立的信号量的初始值,可以取0到65535之间的任何值 在调用OSStart( )之前必须先调用OSInit ( )。在用户程序中OSStart( )只能被调用 函数参数 OSSemPend()函数对该值减一并返回:如果调用时信号量等于零,那么OSSemPend() 必须在调用OSStart()函数之前调用OSInit(),而只有在调用OSStart()函数之后, 功能描述 特殊说明 函数将任务加入该信号量的等待列表,任务将等待直到获得信号量或超时 后,如果有更高优先级的任务准备就绪,μC/OS-Ⅱ会调用任务调度函数,在这 功能描述 opt OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()必须成对使用 依赖于系统每秒钟有多少时钟节拍(由文件OS_CFG..H中的常量 状态。然后进行任务调度,决定当前运行的任务是否仍然为处于最高优先级的就绪 特殊说明 OSTimeTick()的运行时间和系统中的任务数直接相关,在任务或中断中都可以调用。 在中断服务程序中,如果保证直接递增OSIntNesting“原子操作”,中断服务 prio :指定要删除任务的优先级,如果为OS_PRIO_SELF则删除自身 一次,第二次调用OSStart( )将不执行任何操作 :指向任务代码的指针(函数指针) 函数参数 task:定义信号量删除条件 μC/OS-Ⅱ才真正开始运行多任务 正常 : 态的任务 指向分配给所建立的信号量的事件控制块的指针 OS_TICKS_PER_SEC设定) 种情况下,中断返回到更高优先级的任务而不是被中断了的任务。无函数参数 函数参数 -OS_DEL_NO_PEND:没有任何任务等待信号量才删除 特殊说明 如果在任务中调用,任务的优先级应该很高(优先级数字很小),这是因为 函数返回值 pevent:传递给任务的参数(一个变量指针) 程序使用直接递增OSIntNesting的方法而不调用OSIntEnter()函数。 pdata :指向信号量的指针,OSSemCreate()的返回值 OS_NO_ERR:函数调用成功 和返回值 NULL :没有可用的事件控制块 特殊说明 pevent :指向信号量的指针,OSSemCreate()的返回值 函数参数 -OS_DEL_ALWAYS:立即删除 函数参数 timeout:最多等待的时间(超时时间),以时钟节拍为单位 OSTimeTick()负责所有任务的延时操作 ticks:要延时的时钟节拍数 函数参数 ptos :指向任务堆栈栈顶的指针 何为原子操作?在一个任务的执行过程中,如果有某些操作不希望在执行 OS_TASK_DEL_IDLE:错误,试图删除空闲任务(Idle task) :用于返回错误码 特殊说明 err 在任务级不能调用该函数。即使中断服务程序使用直接递增OSIntNesting的 OS_NO_ERR :发送信号量成功 延时时间0表示不进行延时操作,而立即返回调用者。为了确保设定的延时时间, err 必须先建立信号量,然后使用 过程中被别的任务或中断打断,那么这些不希望被打断的操作就是原子操作 :任务的优先级 特殊说明 prio :用于返回错误码 OS_TASK_DEL_ ERR:错误,指定要删除的任务不存在 函数返回值 方法(没有调用OSIntEnter()),也必须调用OSIntExit()函数 特殊说明 *err可能为以下值: 建议用户设定的时钟节拍数加1。例如,希望延时10个时钟节拍,可设定参数为11 OS_SEM_OVF :信号量的值溢出 函数返回 OS_NO_ERR :成功删除信号量 *err可能为以下值: OS_NO_ERR:函数调用成功 OS_PRIO_INVALID:参数指定的优先级大于OS_LOWEST_PRIO 值 OS_ERR_EVENT_TYPE :pevent 不是指向信号量的指针 OS_PRIO_EXIST:具有该优先级的任务已经存在 OS_TASK_DEL_ISR:错误,试图在中断处理程序中删除任务 函数返回 OS_ERR_DEL_ISR :在中断中删除信号量所引起的错误 函数返回 OS_NO_ERR :调用成功,得到信号量 OS_ERR_INVALID_OPT :错误,opt值非法 OS_ERR_PEVENT_NULL :错误,pevent为NULL OS_TIMEOUT :超过等待时间 值 值 OS_PRIO_INVALID:参数指定的优先级大于OS_LOWEST_PRIO 函数返回 OS_ERR_TASK_WAITING :有一个或多个任务在等待信号量 值 必须先建立信号量,然后使用 特殊说明 OS_ERR_EVENT_TYPE :错误,pevent不是指向信号量的指针 OS_ERR_PEND_ISR :在中断中调用该函数所引起的错误 OS_NO_MORE_TCB:系统中没有OS_TCB可以分配给任务了 OS_ERR_PEVENT_NULL :错误,pevent为NULL OS_ERR_EVENT_TYPE :错误,pevent 不是指向信号量的指针 任务堆栈必须声明为OS_STK类型。注意:在中断处理程序中不能建立任务。在任 (1)使用这个函数调用时,必须特别小心,因为其它任务可能还要用这个信号量 务中必须调用μC/OS提供的下述过程之一:延时等待、任务挂起、等待事件发生 特殊说明 OS_ERR_PEVENT_NULL :错误,pevent为NULL 特殊说明 (2)当挂起任务就绪时,中断关闭时间与挂起任务数目有关 (等待信号量,消息邮箱、消息队列),以便其它任务也能获得CPU的使用权 特殊说明 必须先建立信号量,然后使用,不允许在中断中调用该函数,因为中断不能被挂起
ucosII实验报告(DOC)
实验1《任务的创建、删除、挂起、恢复》实验学时: 2 实验地点:二综x203 实验日期:2013/12/13一、实验目的1.实验环境的建立2.任务的接口函数的应用二、实验内容1.设计一个只有一个任务Task1,当程序运行后任务的工作就是每秒在显示器上显示一个字符“M”。
2.在任务Task1中在创建一个任务Task2 。
当程序运行后,任务Task1的工作在显示器上显示一个字符“M”;Task2 则是在显示器上显示字符“Y”。
3. 要求任务Task2运行20次后,挂起任务Task1;任务Task2运行40次后,恢复任务Task1。
4. 当任务Task1运行5次时,用函数OSSchedLock()对调度器进行加锁;而当任务Task1运行到第10次时,再用函数OSSchedUnlock()对调度器进行解锁,并运行该程序。
5. 使任务Task1能删除任务Task2。
三、实验方法包括实验方法、原理、技术、方案等。
四、实验步骤1.将BC45文件夹拷贝到C分区根目录下。
2.将software文件夹拷贝到任意分区根目录下。
3. 分别完成实验1、2、3、4、5五、实验结果1. DOS窗口每秒显示一个字符“M”。
每行显示10个“M”字符,行与行的间隔是一行。
按ESC键程序退出2. DOS窗口交替显示字符"M"和“Y”,每隔一秒显示一次。
每行显示10个字符,行与行之间的间隔是一行。
按ESC键程序退出3.DOS窗口开始交替显示字符"M"和“Y”,显示20次以后,Task1挂起,只显示“Y”,当Task2运行40次以后,Task1恢复,然后开始Task1,Task2交替运行。
4.DOS窗口开始交题显示字符"M"和“Y”,显示5次以后,Task1将任务调度器上锁,此时只有“M”打印,当Task1运行10次后,Task1,Task2开始交替运行。
5.DOS窗口开始交替显示字符“M”和“Y”,显示10次后,只显示“Y”六、实验结论对实验数据和结果进行分析描述,给出实验取得的成果和结论。
ucore操作系统学习(二)ucorelab2物理内存管理分析
ucore操作系统学习(⼆)ucorelab2物理内存管理分析⼀、lab2物理内存管理介绍 操作系统的⼀个主要职责是管理硬件资源,并向应⽤程序提供具有良好抽象的接⼝来使⽤这些资源。
⽽内存作为重要的计算机硬件资源,也必然需要被操作系统统⼀的管理。
最初没有操作系统的情况下,不同的程序通常直接编写物理地址相关的指令。
在多道并发程序的运⾏环境下,这会造成不同程序间由于物理地址的访问冲突,造成数据的相互覆盖,进⽽出错、崩溃。
现代的操作系统在管理内存时,希望达到两个基本⽬标:地址保护和地址独⽴。
地址保护指的是⼀个程序不能随意的访问另⼀个程序的空间,⽽地址独⽴指的是程序指令给出的内存寻址命令是与最终的物理地址⽆关的。
在实现这两个⽬标后,便能够为多道并发程序运⾏时的物理内存访问的隔离提供⽀持。
每个程序在编译、链接后产⽣的最终机器代码都可以使⽤完整的地址空间(虚拟地址),⽽不需要考虑其它的程序的存在。
ucore通过两个连续的实验迭代,lab2和lab3分别实现了物理内存管理和虚拟内存管理(利⽤磁盘缓存⾮⼯作集内存,扩展逻辑上的内存空间)。
ucore的每个实验都是建⽴在前⼀个实验迭代的基础上的,要想更好的理解lab2,最好先理解之前lab1中的内容()。
lab2在lab1平坦模型段机制的基础上,开启了80386的分页机制,并建⽴了内核页表;同时通过硬件中断探测出了当前内存硬件的布局,并以此为依据根据可⽤的内存建⽴了⼀个物理内存管理框架,通过指定某种分配算法,负责处理所有的物理内存页分配与释放的请求。
lab2的代码结构和执⾏流程与lab1差别不⼤,其主要新增了以下功能: 1. bootmain.S中的物理内存探测 2. 在新增的entry.S内核⼊⼝程序中开启了80386页机制 3. kern_init内核总控函数中通过pmm_init函数进⾏整个物理内存管理器的构建初始化⼆、lab2实验细节分析2.1 物理内存布局探测 为了进⾏物理内存的管理,操作系统必须先探测出当前硬件环境下内存的布局,了解具体哪些物理内存空间是可⽤的。
μCOS-Ⅱ内核任务调度的实现.
…
}
OS_TCBInit(对OSTCBX,OSTCBBitX, OSTCBY,OSTCBBitY提前做了运算,节约任务调度时间。OSTCBX和OSTCBY都要转换为相应位掩码,这个是通过OSMapTbl[ ]实现[1],如图2。内核通过按位或运算把OSRdyGrp和OSRdyTbl[ ]的相应位置1,这样就完成了把任务置于就绪态的工作。
在切换任务时首先更新ospriocurostcbcurospriocur是内核运行任务的任务号ostcbcur指向内核运行任务的任务控制块然后从ostcbcur中得到任务堆栈指针ostcbstkptr栈指针从堆栈中取出最高优先级任务的状态即程序计数器指pc状态寄存器和寄存器把这些值分别恢复到处pc状态寄存器和寄存器后就开始新任务的执行如此便完成了任务的调度
任务控制块结构体在uCOS_II.H中定义,以下代码是节选OS_TCB中对本文分析相关的进构体成员。
// File : uCOS_II.H
typedef struct os_tcb {
OS_STK *OSTCBStkPtr; /*当前任务的栈顶指针*/
…
INT8U OSTCBPrio;
INT8U OSTCBX;
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,//0xB0 to 0xBF
6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,//0xC0 to 0xCF
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,//0xD0 to 0xDF
μCOS-II实时操作系统内存管理的改进
摘要:分析了μC/OS-II实时操作系统在内存管理上存在的不足,提出了改进方法,通过一个具体实例描述了该方法的实现。
关键词:实时操作系统内存管理微处理器链接器μC/OS-II是一种开放源码的实时操作系统,具有抢先式、多任务的特点,已被应用到众多的微处理器上。
虽然该内核功能较多,但还是有不甚完善的地方。
笔者在分析使用中发现,内核在任务管理(包括任务调度、任务间的通信与同步)和中断管理上是比较完善的,具有可以接受的稳定性和可靠性;但在内存管理上显得过于简单,内存分区的建立方式有不合理之处。
1 内存管理不足之处的分析在分析许多μC/OS-II的应用实例中发现,任务栈空间和内存分区的创建采用了定义全局数组的方法,即定义一维或二维的全局数组,在创建任务或内存分区时,将数组名作为内存地址指针传递给生成函数。
这样实现起来固然简单,但是不够灵活有效。
编译器会将全局数组作为未初始化的全局变量,放到应用程序映像的数据段。
数组大小是固定的,生成映像后不可能在使用中动态地改变。
对于任务栈空间来说,数组定义大了会造成内存浪费;定义小于了任务栈溢出,会造成系统崩溃。
对于内存分区,在不知道系统初始化后给用户留下了多少自由内存空间的情况下,很难定义内存分区所用数组的大小。
总之利用全局数组来分配内存空间是很不合理的。
另外,现在的μC/OS-II只支持固定大小的内存分区,容易造成内存浪费。
μC/OS-II将来应该被改进以支持可变大小的内存分区。
为了实现这一功能,系统初始化后能清楚地掌握自由内存空间的情况是很重要的。
2 解决问题的方法为了能清楚掌握自由内存空间的情况,避免使用全局数组分配内存空间,关键是要知道整个应用程序在编译、链接后代码段和数据段的大小,在目标板内存中是如何定位的,以及目标板内存大小。
对于最后一条,系统编程人员当然是清楚的,第一条编译器会给出,而如何定位是由编程人员根据具体应用环境在系统初始化确定的。
因此,系统初始化时,如果能正确安排代码段和数据段的位置,就能清楚地知道用户可以自由使用的内存空间起始地址。
6、uCOS-II-内存管理
page 11
OSMemFreeList
OSMemAddr OSMemFreeList OSMemBlkSize OSMemNBlks OSMemNFree
OSMemAddr OSMemFreeList OSMemBlkSize OSMemNBlks OSMemNFree
OS_MAX_MEM_PART
&message_n
message
M1_Data M2_data
Mn_Data
2020/8/23
page 6
目录
1、 内存控制块 2、 动态内存的管理
2020/8/23
page 7
1 内存控制块
uC/OS-II中将连续的大块内存按分区来管理,称之为 “内存分区”。
分区由若干个体积相等、类型一致的 “内存块” 组 成。
Partition
Block
2020/8/23
memory partition
Multiple memory partitions
fixed-sized memory blocks from a partition
page 10
/* MEMORY CONTROL BLOCK
*/
typedef struct {
/* Total number of blocks in this partition*/ INT32U OSMemNBlks;
/* Number of memory blocks remaining in this partition*/
INT32U OSMemNFree; } OS_MEM;
Memory control block data structure
uCOSII实时操作系统通信机制之内核分析
μC/OS-II通信机制之内核分析摘要:本文主要着重对μC/OS-III通信机制的内核分析,研究μC/OS-II内核通信机制的实现方式及实现的技巧,同时分析其中不足之处。
1.引言μC/OS-II是一种可移植的,可植入ROM的,可裁剪的,抢占式的,实时多任务操作系统内核。
它被广泛应用于微处理器、微控制器和数字信号处理器。
uC/OS-II只是一个实时操作系统内核,它仅仅包含了任务调度,任务管理,时间管理,内存管理和任务间的通信和同步等基本功能。
没有提供输入输出管理,文件系统,网络等额外的服务。
但由于uC/OS-II良好的可扩展性和源码开放,这些非必须的功能完全可以由用户自己根据需要分别实现。
μC/OS-II这款操作系统内核简单易学,通过对其源代码的分析,可以加深我们对操作系统内核的理解,为学习linux等大型操作系统打下基础。
2.操作系统中任务间的通信机制内核中多个任务之间不可避免的存在相互协同的关系,来完成一定的内核功能。
这种协同最直观的就是任务间相互通信。
包括VxWorks 等所有的嵌入式操作系统一般都会提供许多任务间通信的方法,通常包括:(1)共享内存,数据的简单共享。
(2)信号量,基本的互斥和同步。
(3)消息队列和管道,同一CPU 内多任务间消息传递。
(4)Socket 和远程调用,任务间透明的网络通信。
(5)Signals,用于异常处理。
在μC/OS-II中设计了五种通讯机制,或者说是同步机制,分别是信号量(semaphore),互斥体(mutual exclusion semaphore),事件组(event flag),邮箱(message box)和队列(queue)。
3. uC/OS-II中通信机制实现的方式分析在uC/OS-II中是如何通信机制呢?这几种通信机制有什么关系?或者说有什么共同点有什么不同点?在实现上有哪些步骤是相同的?下面将就这几个问题进行分析论述。
我们知道通信机制是发生在任务之间的,换句话说任务与通信机制存在着关联。
嵌入式实时操作系统uCOS-II原理(课件PPT) μCOS-II中的任务管理
1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 3
1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 4
1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0
5 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0
或
prio=29 0 0 0 1 1 1 0 1
y = OSUnM图5a-6p在T就bl绪[O表S中R查d找yG最高rp优];先级别任务的过程 prio = (INT8U)((y << 3)
任当务控应制用块结程构序的主调要用成员函数OSTaskCreate( )
任务及控任制务块控(O制S_块TC链B)表 t…y创统进任务控这表…pOssIII数具链的表…ettNNNrrd…S建函行务控制个的TTTuue任_会有接任。fcc188Stts任 任 制 认6UU务T一数初从制块任头μ栈务理控tooUr当由按相为务即Kuss控__c个始空块各务部O务务块和ttt制*C指有的制cc进于用应一,相oSObbOOOs/块任化任,个控T_S**SSS控的的管行这户数个故当tT优针关O块OOC链TTTcbCSS务。务然成制BCCCS表系 些提量链这于BTT{BBBI制 身 任理先、 的-SCCDSP时这控后员块ntIBBtr统任供的表个是kliayi块 份 务的NPPot级任 属I;,个制用进链t;r;te初务的任。链一re用x///;vt///就 证 是这函块任行入(任任任/;;别务 性//始控任务表些指///指务务务来指个数链务赋到)向相 , 不等的 的向化制务控叫空等的的向来任记函首表的值任后待当优前时块数制做白当 没 能务为一当 表一的前先一空数先获属,务堆录个,还为块空的时状级个任任于 有 被栈些前 就会为取性最控任限态别任务初没系并任身任栈务务标(务是 任 系控与状 叫调 被 一 对后 制顶控始有统 把务份志节控控制务的用创个任再块制拍一务统制任态做块化对创它块证指制块数块的链系建任务把链针个控承的函应建们链。)务任、的块表指堆指管任务针针
μCOS-II原理
姓名:张萍学号:20093213006 专业:计算机应用技术(嵌入式)μC/OS-II原理一.计算机操作系统的基本概念1、操作系统是一种为应用程序提供服务的系统软件,是一个完整计算机系统的有机组成部分。
2、从层次来看,操作系统位于计算机硬件之上,应用软件之下。
所以也把它叫做应用软件的运行平台。
3、从用户的角度来看,它就是一大堆函数(API和系统函数),用户可以调用(普通调用或系统调用)它们来对系统资源进行操作。
二.操作系统中常用的数据结构1、数组(1)、同一数据类型数据的集合;(2)、占用连续内存空间;(3)、其中的所有元素名称都相同,但每个元素都有一个编号;(4)、元素名去掉编号(下标),得到的是数组名,数组名是个指针。
2、位图3、结构(1)、不同数据类型数据的集合;(2)、占用连续内存空间;4、链表(1)、同数据类型数据的集合;(2)、不占用连续内存空间。
5、队列按照先进先出的规则组织的数据结构可以用数组也可以用链表来实现。
6、堆栈按照先进后出规则组织的数据结构主要用数组来实现。
三.并发操作系统的概念并发操作系统的概念:在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。
由同一个处理器轮换地运行多个程序。
或者说是由多个程序轮班地占用处理器这个资源。
且在占用这个资源期间,并不一定能够把程序运行完毕。
四.任务的要素一个完整的任务应该有如下三部分:(1)、任务代码(程序)(2)、任务的私有堆栈(用以保护运行环境)(3)、任务控制块(提供私有堆栈也是虚拟处理器的位置)五. μC/OS-II的任务管理(任务调度)1、μC/OS-II提供的另一个系统任务是统计任务OSTaskStat( )。
这个统计任务每秒计算一次CPU在单位时间内被使用的时间,并把计算结果以百分比的形式存放在变量OSCPUsage中,以便应用程序通过访问它来了解CPU的利用率,所以这个系统任务OSTaskStat( )叫做统计任务。
ucOSII内存管理.ppt
内存管理(续)
如图所示,在一个系 统中可以有多个内存 分区。这样,用户的 应用程序就可以从不 同的内存分区中得到 不同大小的内存块。 但是,特定的内存块 在释放时必须重新放 回它以前所属于的内 存分区。采用这样的 内存管理算法,上面 的内存碎片问题就得 到了解决。
内存控制块
typedef struct { void *OSMemAddr;
由于内存管理算法的原因,malloc()和free()函 数执行时间是不确定的。
内存管理(续)
在μC/OS-II中,操作 系统把连续的大块内 存按分区来管理。每 个分区中包含有整数 个大小相同的内存块, 如图所示。利用这种 机制,μC/OS-II 对 malloc()和free()函 数进行了改进,使得 它们可以分配和释放 固定大小的内存块。 这样一来,malloc() 和free()函数的执行 时间也是固定的了。
void *OSMemFreeList; INT32U OSMemBlkSize; INT32U OSMemNBlks; INT32U OSMemNFree;} OS_MEM;
为了便于内存的管理,在μC/OSII中使用内存控制块(memory control blocks)的数据结构来跟 踪每一个内存分区,系统中的每个 内存分区都有它自己的内存控制块。
plink = (void **)pblk; pblk = pblk + blksize; } *plink = (void *)0; OS_ENTER_CRITICAL(); pmem->OSMemAddr = addr; (6) /在对应的内存控制块中填写相应的信 息 pmem->OSMemFreeList = addr; pmem->OSMemNFree = nblks; pmem->OSMemNBlks = nblks; pmem->OSMemBlkSize = blksize; OS_EXIT_CRITICAL(); *err = OS_NO_ERR; return (pmem); (7) /返回指向该内存块的指针,该指针在以后对内存块的 操作中使用。 }
uCOS-II内核分析
UC/OS-II内核分析Silence.Wang一.内核概述:多任务系统中,内核负责管理各个任务,或者说为每个任务分配CPU时间,并且负责任务之间的通讯。
内核提供的基本服务是任务切换。
之所以使用实时内核可以大大简化应用系统的设计,是因为实时内核允许将应用分成若干个任务,由实时内核来管理它们。
内核本身也增加了应用程序的额外负荷,代码空间增加ROM的用量,内核本身的数据结构增加了RAM的用量。
但更主要的是,每个任务要有自己的栈空间,这一块吃起内存来是相当厉害的。
内核本身对CPU的占用时间一般在2到5个百分点之间。
UC/OS-II有一个精巧的内核调度算法,实时内核精小,执行效率高,算法巧妙,代码空间很少。
UC/OS-II的内核还可以被裁剪,Hmax中RTOS的就是一个被高度裁剪过的UC/OS-II。
二.任务控制块 OS_TCB:uC/OS-II的TCB数据结构简单,内容容易理解,保存最基本的任务信息,同时还支持裁减来减小内存消耗,TCB是事先根据用户配置,静态分配内存的结构数组,通过优先级序号进行添加,查找,删除等功能。
减少动态内存分配和释放。
因为依靠优先级进行TCB分配,每个任务必须有自己的优先级,不能和其他任务具有相同的优先级。
typedef struct os_tcb{OS_STK *OSTCBStkPtr;#if OS_TASK_CREATE_EXT_ENvoid *OSTCBExtPtr;OS_STK *OSTCBStkBottom;INT32U OSTCBStkSize;INT16U OSTCBOpt;INT16U OSTCBId;#endifstruct os_tcb *OSTCBNext;struct os_tcb *OSTCBPrev;#if (OS_Q_EN && (OS_MAX_QS >= 2)) || OS_MBOX_EN || OS_SEM_ENOS_EVENT *OSTCBEventPtr;#endif#if (OS_Q_EN && (OS_MAX_QS >= 2)) || OS_MBOX_ENvoid *OSTCBMsg;#endifINT16U OSTCBDly;INT8U OSTCBStat;INT8U OSTCBPrio;INT8U OSTCBX;INT8U OSTCBY;INT8U OSTCBBitX;INT8U OSTCBBitY;#if OS_TASK_DEL_ENBOOLEAN OSTCBDelReq;#endif} OS_TCB;.OSTCBStkPtr是指向当前任务栈顶的指针。
嵌入式操作系统μCOSII实验okPPT课件
μC/OS-II的任务管理
OSTaskCreate() 建立任务
OSTaskCreateExt() 建立任务扩展版本
OSTaskDel()
删除任务
OSTaskDelReq() 请求删除任务
OSTaskChangePri o()
OSTaskSuspend()
改变任务的优先级 挂起任务
OSTaskResume() 恢复任务
OSTaskStkChk() 堆栈检验
OSTaskQuery() 获得有关任务的信息 14
写在最后
经常不断地学习,你就什么都知道。你知道得越多,你就越有力量 Study Constantly, And You Will Know Everything. The More
You Know, The More Powerful You Will Be
第七章 嵌入式操作系统μCOS-II实验 7.1 μC/OS-II 移植实验 7.2 μC/OS-II 应用实验
1
7.1 μC/OS-II 移植实验 7.1.1实验目的 7.1.2实验设备 7.1.3实验内容 7.1.4实验原理 7.1.5实验操作步骤
2
7.1.1实验目的
了解μC/OS-II移植条件和内核基本结构。 掌握将μC/OS-II内核移植到ARM7处理器 上的方法和步骤。
15
结束语
感谢聆听
不足之处请大家批评指导
ease Criticize And Guide The Shortcomings
讲师:XXXXXX
XX年XX月XX日
16
3
7.1.2实验设备
硬件:Embest S3CEV40实验平台, Embest ARM标准/增强型仿真器套件, PC机。 软件:Embest IDE 2003集成开发环境, Windows 98/2000/NT/XP。
μCOS-ii 介绍
第三章内核结构3.00 临界段,OS_ENTER_CRITICAL() 和 OS_EXIT_CRITICAL()3种方法实现上边两个函数:(1) OS_CRITICAL_METHOD==1,用关中断实现OS_ENTER_CRITICAL,用开中断实现OS_EXIT_CRITLCAL();此方法的缺点是如果进入该函数前系统的中断状态是关中断,调用函数后则会改变其中断状态。
(2)OS_CRITICAL_METHOD==2, 用在堆栈中保存现在的中断开关状态,然后关中断来实现OS_ENTER_CRITICAL,用从堆栈中弹出原来的中断状态来实现OS_EXIT_CRITICAL();此方法存在的问题是:有些编译器不够灵敏,不能正确进行出入栈操作而引起严重错误。
(3)OS_CRITICAL_METHOD==3,用户可以得到当前处理器的状态字值,并保存在一个C函数的局部变量里,这个变量可以用于恢复PSW。
3.01 任务Ucosii 最多管理64个任务,但有些被系统保留,所以推荐使用其中的56个,不用前4个和后4个;为了使ucosii管理用户任务,必须在建立任务时,将任务的起始地址与其他参数传递给OSTaskCreate()或OSTaskCreateExt()中的一个。
3.02任务状态(睡眠态、就绪态、运行态、中断服务态、等待态)当所有任务都在等待事件的发生或等待延迟时间的结束时,ucosii执行空闲任务OSTaskIdle().3.03任务控制块(OS_TCB)一旦任务建立,一个任务控制块OS_TCB就被赋值,任务控制块是一个数据结构,当任务的CPU使用权被剥夺时,任务控制块用来保存该任务的状态,当任务重新得到CPU的使用权时,任务控制块能确保任务从当时被中断的那一点继续执行。
OS_TCB全部驻留在RAM中。
3.04就绪表每个就绪的任务都放在就绪表(ready list)中,就绪表中有两个变量:OSRdyGrp 和OSRdyTbl[]. 找出进入就绪态的优先级最高的任务的办法(ucosii提供了一个表OSUnMapTbl[]): y = OSUnMapTbl[OSRdyGrp]; x =OSUnMapTbl[OSRdyTbl[y]]; prio = (y<<3) + x ;附:若从就绪表的两个变量,通过查找法或直观地看,也可以找到处于就绪态的优先级最高的任务,但是比较麻烦,ucosii加入了算法,通过查表的办法可以直接得到处于就绪态的优先级最高的任务,比较方便。
操作系统-ucore-lab2
操作系统实验报告题目:物理内存管理目录一、内容 (2)二、目的 (2)三、实验流程 (3)四、实验环境与结果分析 (3)五、实验体会和思考题 (9)附录(源代码及注释) (10)一、内容本次实验包含三个部分。
首先了解如何发现系统中的物理内存;然后了解如何建立对物理内存的初步管理,即了解连续物理内存管理;最后了解页表相关的操作,即如何建立页表来实现虚拟内存到物理内存之间的映射,对段页式内存管理机制有一个比较全面的了解。
本实验里面实现的内存管理还是非常基本的,并没有涉及到对实际机器的优化,比如对cache的优化等。
如果大家有余力,尝试完成扩展练习。
练习1:实现first-fit连续物理内存分配算法(需要编程)在实现first fit内存分配算法的回收函数时,要考虑地址连续的空闲块之间的合并操作。
提示:在建立空闲页块链表时,需要按照空闲页块起始地址来排序,形成一个有序的链表。
可能会修改default_pmm.c中的default_init,default_init_memmap,default_alloc_pages,default_free_pages等相关函数。
请仔细查看和理解default_pmm.c中的注释。
请在实验报告中简要说明你的设计实现过程。
请回答如下问题:你的first fit算法是否有进一步的改进空间练习2:实现寻找虚拟地址对应的页表项(需要编程)通过设置页表和对应的页表项,可建立虚拟内存地址和物理内存地址的对应关系。
其中的get_pte函数是设置页表项环节中的一个重要步骤。
此函数找到一个虚地址对应的二级页表项的内核虚地址,如果此二级页表项不存在,则分配一个包含此项的二级页表。
本练习需要补全get_pte函数in kern/mm/pmm.c,实现其功能。
请仔细查看和理解get_pte函数中的注释。
get_pte 函数的调用关系图如下所示:请在实验报告中简要说明你的设计实现过程。
请回答如下问题:请描述页目录项(Pag Director Entry)和页表(Page Table Entry)中每个组成部分的含义和以及对ucore而言的潜在用处。
μCOS-II的实时性能分析
1 嵌入式实时操作系统和μC/OS-II嵌入式操作系统EOS(Embedded Operating System)主要负责嵌入式系统的全部软、硬件资源的分配、调度、控制、协调并发活动;它必须体现其所在系统的特征,能够通过装卸某些模块来达到系统所要求的功能[1]。
μC/OS-II是专门为计算机的嵌入式应用而设计的实时操作系统,是基于静态优先级的占先式(preemptive)多任务实时内核。
采用μC/OS -II作为测试的目标,一方面是因为它已经通过了很多严格的测试,被确认是一个安全的、高效的实时操作系统;另一个重要的原因,是因为它免费提供了内核的源代码,通过修改相关的源代码,就可以比较容易地构造自己所需要的测试环境,实现自己需要的功能。
2 实时操作系统和系统实时性能指标实时系统对逻辑和时序的要求非常严格,如果逻辑和时序出现偏差将会引起严重后果。
实时系统有两种类型:软实时系统和硬实时系统。
软实时系统仅要求事件响应是实时的,并不要求限定某一任务必须在多长时间内完成;而在硬实时系统中,不仅要求任务响应要实时,而且要求在规定的时间内完成事件的处理。
通常,大多数实时系统是两者的结合。
事实上,没有一个绝对的数字可以说明什么是硬实时,什么是软实时。
它们之间的界限是十分模糊的。
这与选择什么样的CPU,它的主频、内存等参数有一定的关系[1]。
另外,因为应用的场合对系统实时性能要求的不同而有不同的定义。
因此,在现有的固定的软、硬件平台上,如何测试并找出决定系统实时性能的关键参数,并给出优化的措施和试验数据,就成为一个具有普遍意义并且值得深入探讨的课题。
本文就是基于此目的进行讨论的。
因为采用实时操作系统的意义就在于能够及时处理各种突发的事件,即处理各种中断,因而衡量嵌入式实时操作系统的最主要、最具有代表性的性能指标参数无疑应该是中断响应时间了。
中断响应时间通常被定义为:中断响应时间=中断延迟时间+保存CPU状态的时间+该内核的ISR进入函数的执行时间[2]。
μCOS-Ⅱ内核任务调度的实现.
任务控制块是一个和任务息息相关的重要的结构体。当任务的CPU使用权被剥夺时, µC /OS-Ⅱ用它来保存该任务的状态。当任务重新获得CPU的使用权时,任务控制块能确保任务从被中断的那一点丝毫不差的继续执行[2]。每个任务都拥有自己独立的任务控制块,一旦任务建立,与之相对应的任务控制块就被赋值。
µC /OS-Ⅱ中最多运行的任务是64个,内核把任务优先级分组,八个为一组[1],如图1所示。任务优先级号中Y是所属组部分, X是所在组部分,在就绪表中有2个变量OSRdyGrp和OSRdyTbl[ ], OSRdyGrp表示所属组,每一位代表一个组内是否有进入就绪态的任务, OSRdyTbl[ ]表示所在组,一组八个任务,即一位代表一个任务是否进入就绪态。当任务进入就绪态时,就绪表OSRdyGrp和OSRdyTbl[ ]相应位置1。OSRdyGrp和OSRdyTbl[ ]之间的关系见图1, OSRdyGrp的第n位对应OSRdyTbl[ n ],即OSRdyTbl[ n ]中任何一位是1时, OSRdyGrp的第n位要置1。
2. µC/OS- Ⅱ的任务调度
2
任务,也称线程,是一个简单的应用程序。每个任务都被赋予一定的优先级,并有自己的一套CPU寄存器和栈空间[1]。实时应用程序的设计过程是如何把问题分割成多个任务。每个任务都是一个无限的循环,都处在以下五种状态之一,即休眠态、就绪态、运行态、挂起态和被中断态。1休眠态:相当于任务驻留在内存中,但并不能被多任务内核所调度; 2就绪态:意味着任务已经准备好,可以运行,但由于该任务的优先级比正在运行的任务的优先级低,还暂时不能运行; 3运行态:指任务掌握了CPU的使用权,正在运行中; 4挂起态:指任务在等待,等待某一事件的发生; 5被中断态:指发生中断时, CPU提供相应的中断服务,原来正在运行的任务暂不能运行,就进入了中断态。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
CommMsg1=OSMemGet(CommMem,&err); /* 第一次申请*/ …… CommMsg2=OSMemGet(CommMem,&err); /* 第二次申请*/ ……
CommMsg3=OSMemGet(CommMem,&err); /* 第三次申请*/ ……
ReleaseMem(i); /* 释放内存块 (i为 3,2,1) */
源程序说明
2、创建应用任务Task
OSTaskCreate(Task, (void *)&TaskData[0], &TaskStk[0][TASK_STK_SIZE - 1], 5);
3、应用任务
源程序说明
void Task (void *pdata) { for (;;) { ……
/* 无限循环 */
源程序说明
TaskStart负责: •安装时钟中断服务例程
•ucos_x86_idt_set_handler(0x20,(void *)OSTickISR,0x8e00);
•初始化操作系统时钟
•ucos_timer_init();
•初始化分区
•MemoryCreate();
•创建应用任务
•TaskStartCreateTasks();
#define OS_MEM_EN 1 /*是否允许使用内存管理的功能*/ #define OS_MEM_QUERY_EN /*是否允许使用OSMemQuery()*/ 1
操作系统配置
#define OS_MAX_TASKS /*最多可以创建2个任务*/
#define OS_LOWEST_PRIO /*任务优先级不可以大于7*/ #define OS_TASK_STAT_EN /* 禁止统计任务*/
内核实验(五)
µC/OS-II的内存管理
实验目的
掌握嵌入式实时操作系统µC/OS-II 内存管理中内存分配和回收的功能。
内存管理的原理
在µC/OS-II中,操作系统把连续的大块内 存按分区来管理。每个分区中包含有整数个 大小相同的内存块。用户的应用程序就可以 从不同的内存分区中得到不同大小的内存块。 但是,特定的内存块在释放时必须重新放回 它以前所属于的内存分区。
……
}
}
输出信息
2
7 0
#define OS_TIME_DLY_HMSM_EN 1 /*是否允许使用OSTimeDlyHMSM()*/
#define OS_TICKS_PER_SEC 200 /*设置每秒之内的时钟节拍数目*/
本实验中所用到的µC/OS-II相关函数
• OSTaskCreate():建立一个新任务 • OSMemCreate():初始化一个用于动态内存分配的区域 • OSMemGet() :从内存区域分配一个内存块
• OSMemPut():释放一个内存块
• OSMemQuery():得到内存区域的信息 • OSTimeDlyHMSM( ):将一个任务延时若干时间
源程序说明
1、创建起始任务TaskStart
OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], 4);
实验设计
创建一个含有2个内存块的内存分区, 然后在这个分区中申请3次内存块,再释 放掉申请的内存块。
运行流程
内存块
试图申请内 存块3,失 败。
试图申请内 存块3,失败。 Nhomakorabea3 2
1
t1
t2 t3 t4 t5 t6 已分配: t7 t8 t9 t10 t11
时 间
未分配:
操作系统配置
#define OS_MAX_MEM_PART /*最多可以划分5个内存块*/ 5