2022年微实时操作系统方案与实现大学方案.docx
精选学习资料 - - - - - - - - - 个人资料整理 仅限学习使用目 录摘要 1 1.1 选题的目的和意义331.2 国内外的讨论现状和趋势1.2.1 ARM 处理器 3 1.2.2 操作系统 5 2 系统设计 7 2.1 可行性分析 7 2.2 需求分析 7 2.3 系统功能设计 8 2.3.1 总体结构 8 2.3.2 RTOS 内核处理流程 8 3 系统开发环境和工具 10 3.1 开发环境 10 3.2 开发工具 10 4 系统具体设计 10 4.1 任务创建模块 11 4.2 任务调度模块 12 4.3 任务通信模块 125 系统具体实现 13 5.1 任务创建模块 13 5.1.1 任务 13 5.1.2 任务状态 13 5.1.3 任务掌握块 14 5.1.4 任务就绪表 15 5.2 任务调度模块 17 5.2.1 基于优先级抢占调度 17 5.2.2 时钟节拍函数 18 5.3 任务间的通信 19 6 系统测试 216.1 工程一:内核移植到周立功LPC2138测试及 RS232串口的实现 216.2 工程二:内核多任务的抢占调度及任务的睡眠机制 226.3 工程三:任务治理测试 226.4 工程四:任务间通信测试- 互斥信号量 227 总结和展望 22Abstract24参考文献 25名师归纳总结 - - - - - - -第 1 页,共 24 页精选学习资料 - - - - - - - - - 个人资料整理 仅限学习使用微实时操作系统设计与实现田德伟<德州学院运算机系,山东德州 253023 )摘要 :随着物联网的进展,嵌入式系统在人们的生活中的作用日益凸显;嵌入式操作系统在嵌入式开发中也逐步得到了开发人员的关注,如何在保证嵌入式系统的效率的前提下,降低开发成本,成为诸多厂商关注的焦点;该微实时操作系统与现行linux 系统具有相比,具有更高实时性;与 /COS-ii 相比内核更精简、在掌握产品成本中有庞大优势;该系统主要针对低端微处理器平 台,旨在降低开发成本同时提高嵌入式系统对外围设备治理效率;该系统支持八个优先级,每个 优先级可以创建一个任务,任务间同步采纳信号量机制;关键字 :嵌入式实时操作系统, 1.1 选题的目的和意义/COS-ii ,嵌入式系统 1 引言随着微电子技术的快速进展,芯片功能更加强大,微嵌入式实时操作系统必将成 为嵌入式操作系统进展的趋势,这不仅能降低成本,缩小产品体积,仍能增强产品的 牢靠性;同时,软件硬件的紧密结合,嵌入式软件与硬件界线更加模糊,嵌入式软件 经常以硬件形状存在,这种方式可提高实时性,增强可爱护性;1.2 国内外的讨论现状和趋势嵌入式操作系统种类繁多,有资源开销很少的IC 卡操作系统,也有功能较强的网络运算机操作系统;这些嵌入式操作系统从功能到性能各具特色,为各种硬件环境 及应用供应了相应的支持和服务;目前市场上共有几十种操作系统,有多任务系统,也有单任务系统;有实时系统 系统,也有分时系统;总之,不同厂商推出的操作系统或多或少都有差异,但很多嵌 入式操作系统一般具有如下一些内容和功能:系统核心、窗口图形系统、文件系统、设备驱动程序和网络协议等;嵌入式操作系统系统将有以下方向趋势:1. 随着微电子技术的快速进展,芯片功能更加强大,嵌入式实时操作系统必将成为嵌入式操作系统的进展趋势,这不仅能 降低成本,缩小产品体积,仍能增强产品的牢靠性;同时,软件硬件的紧密结合,嵌 入式软件与硬件界线更加模糊,嵌入式软件经常以硬件形状存在,这种方式可提高实 时性,增强可爱护性; 2. 嵌入式操作系统会与嵌入应用软件协同进展;嵌入式系统中 的重要角色包括嵌入式应用软件,嵌入式系统应用领域千差万别,只有充分重视应用名师归纳总结 - - - - - - -第 2 页,共 24 页精选学习资料 - - - - - - - - - 个人资料整理 仅限学习使用软件的进展,才能满意丰富多彩的应用要求;1.2.1 ARM 处理器ARM<Advanced RISC Machines )是微处理器行业的一家知名企业,设计了大量高性能、廉价、耗能低的 RISC 处理器、相关技术及软件;技术具有性能高、成 本低和能耗小的特点;适用于多种领域,比如嵌入掌握、消费 / 训练类多媒体、 DSP和移动式应用等;ARM 处理器共有 7 种运行模式:用户模式 <user ,use ) 正常程序执行模式 快速中断模式 <fiq )用于高速数据传输和通道处理 外部中断模式 <irq )用于通常的中断处理 治理模式 <sve ) 操作系统使用的一种爱护模式 数据拜访终止模式 <abt )用于虚拟储备及储备爱护 未定义指令终止模式 <und )用于支持通过软件方针硬件的协处理器 系统模式 <sys )用于运行特权级的操作系统任务除了用户模式之外的6 种处理器模式称为特权模式<privileged modes );在这些模式下,程序可以拜访全部的系统资源,也可以任意的进行处理器模式切换;除 系统模式外,其他 5 种特权模式又称为反常模式;处理器模式可以通过软件掌握进行切换,也可以通过外部中断或反常处理过程进 行切换;大多数的用户程序运行在用户模式下;这时,应用程序不能够拜访一些受操 作系统爱护的系统资源,应用程序也不能直接进行处理器模式的切换;当需要进行处 理器模式切换时,应用程序可以产生反常处理,在反常处理过程中进行处理器处理器 模式的切换;这种体系结构可以使系统掌握整个系统的资源;当应用程序发生反常中断时,处理器进入相应的反常模式;在每一种反常模式中都有一组寄存器,供相应的反常处理程序使用,这样就可以保证在进入反常模式时,拥护模式下的寄存器 < 储存了程序运行状态)不被破坏;系统模式并不是通过反常过 程进入的,它和用户模式具有完全一样的寄存器;但是系统模式属于特权模式,可以 拜访全部的系统资源,也可以直接进行处理器模式切换;它主要供操作系统任务使 用;通常操作系统的任务需要拜访全部的系统资源,同时该任务仍旧使用拥护模式的 寄存组,而不是使用反常模式下相应的寄存器组,这样可以保证当反常中断发生时任 务状态不被破坏;ARM 处理器含有 37 个寄存器,这些寄存器包括以下两类寄存器;<1 )31 个通用寄存器:包括程序计数器PC 等,这些寄存器都是32位寄存器;名师归纳总结 - - - - - - -第 3 页,共 24 页精选学习资料 - - - - - - - - - 个人资料整理 仅限学习使用<2 )6 个状态寄存器:状态寄存器也是 32 位的寄存器,但是只使用了其中的12 位;在 ARM 处理器的 7 种模式下都有一组对应的寄存器组;在任意时刻,可见的寄存器组包括 15 个通用寄存器 R0R14 、一个或两个状态寄存器和 PC;在全部的寄存器中,有些是各种模式下共用的同一个物理寄存器,有些是各种模式自己独立拥有的物理寄存器;七种运行模式下寄存器安排如下图 1.1 所示:图 1-1 1.2.2 操作系统目前的操作系统种类繁多,很难用单一标准统一分类;依据操作系统的使用环境和对作业处理方式来考虑,可分为批处理系统、分时系统、实时系统;下面介绍一操作系统的五大类型:批处理操作系统、分时操作系统、实时操作系统、网络操作系统、分布式操作系统;1. 批处理操作系统批处理 Batch Processing>操作系统的工作方式是:用户将作业交给系统操作员,系统操作员将很多用户的作业组成一批作业,之后输入到运算机中,在系统中形名师归纳总结 - - - - - - -第 4 页,共 24 页精选学习资料 - - - - - - - - - 个人资料整理 仅限学习使用成一个自动转接的连续的作业流,然后启动操作系统,系统自动、依次执行每个作业,最终由操作员将作业结果交给用户;批处理操作系统的特点是:多道和成批处理;2. 分时操作系统分时Time Sharing>操作系统的工作方式是:一台主机连接了如干个终端,每个终端有一个用户在使用;用户交互式地向系统提出命令恳求,系统接受每个用户的 命令,采纳时间片轮转方式处理服务恳求,并通过交互方式在终端上向用户显示结果;用户依据上步结果发出下道命;分时操作系统将CPU 的时间划分成如干个片段,称为时间片;操作系统以时间片为单位,轮番为每个终端用户服务;每个用户轮 流使用一个时间片而使每个用户并不感到有别的用户存在;分时系统具有多路性、交 互性、 “ 独占”性和准时性的特点;多路性指,伺时有多个用户使用一台运算机,宏观 上看是多个人同时使用一个 CPU,微观上是多个人在不同时刻轮番使用 CPU;交互 > ; “独占 ”性是指,用户依据系统响应结果进一步提出新恳求 用户直接干预每一步 性是指,用户感觉不到运算机为其他人服务,就像整个系统为他所独占;准时性指,系统对用户提出的恳求准时响应;它支持位于不同终端的多个用户同时使用一台运算 机,彼此独立互不干扰,用户感到似乎一台运算机全为他所用;常见的通用操作系统是分时系统与批处理系统的结合;其原就是:分时优先,批处理在后; “ 前台” 响应需频繁交互的作业,如终端的要求;“后台 ”处理时间性要求 不强的作业;3. 实时操作系统实时操作系统 RealTimeOperatingSystem, RTOS> 是指使运算机能准时响应外部大事的恳求在规定的严格时间内完成对该大事的处理,并掌握全部实时设备和 实时任务和谐一样地工作的操作系统;实时操作系统要追求的目标是:对外部恳求在 严格时间范畴内做出反应,有高牢靠性和完整性;其主要特点是资源的安排和调度首 先要考虑实时性然后才是效率;此外,实时操作系统应有较强的容错才能;4. 网络操作系统 网络操作系统是基于运算机网络的,是在各种运算机操作系统上按网络体系结构协议标准开发的软件,包括网络治理、通信、安全、资源共享和各种网络应用;其目 标是相互通信及资源共享;在其支持下,网络中的各台运算机能相互通信和共享资 源;其主要特点是与网络的硬件相结合来完成网络的通信任务;5. 分布式操作系统名师归纳总结 - - - - - - -第 5 页,共 24 页精选学习资料 - - - - - - - - - 个人资料整理 仅限学习使用它是为分布运算系统配置的操作系统;大量的运算机通过网络被连结在一起,可以 获 得 极 高 的 运 算 能 力 及 广 泛 的 数 据 共 享 ; 这 种 系 统 被 称 作 分 布 式 系 统DistributedSystem> ;它在资源治理,通信掌握和操作系统的结构等方面都与其他操作系统有较大的区分;由于分布运算机系统的资源分布于系统的不同运算机上,操作系统对用户的资源需求不能像一般的操作系统那样等待有资源时直接安排的简洁 做法而是要在系统的各台运算机上搜寻,找到所需资源后才可进行安排;对于有些资 源,如具有多个副本的文件,仍必需考虑一样性;所谓一样性是指如干个用户对同一 个文件所同时读出的数据是一样的;为了保证一样性,操作系统须掌握文件的读、写、操作,使得多个用户可同时读一个文件,而任一时刻最多只能有一个用户在修改 文件;分布操作系统的通信功能类似于网络操作系统;由于分布运算机系统不像网络 分布得很广,同时分布操作系统仍要支持并行处理,因此它供应的通信机制和网络操 作系统供应的有所不同,它要求通信速度高;分布操作系统的结构也不同于其他操作 系统,它分布于系统的各台运算机上,能并行地处理用户的各种需求,有较强的容错 才能;2 系统设计2.1 可行性分析<1)技术可行性:依据开发人员供应的系统函数接口、实时性及实现系统的各 项条件,从技术的角度讨论实现系统的可行性;<2)经济可行性:经济可行性是可行性讨论的重要组成部分,它用于评估基于 运算机系统的经济合理性,给出系统开发的成本论证;本系统是为保险公司信息治理 而做的系统,装上该应用系统后即可使用,在系统移植方面简洁,对硬件设备的要求 进一步降低,节省了不必要的支出,所带来的效益大于系统的开发成本,在经济上完 全可行;<3)法律可行性:讨论在系统开发过程中可能涉及的各种合同、侵权、责任以 及各种与法律相关的抵触问题;本系统的开发不触犯国家的任何法律规章,不涉及侵 权等内容,法律上完全可行;综上所述,该系统符合全部的开发目标,能够保证系统开发有肯定的实时性和稳 定性;因此,该微实时操作系统的开发是可行的;2.2 需求分析名师归纳总结 1 参考硬件平台为: ARM9 2410;实际上,也可用其他博创科技系列CPU 和第 6 页,共 24 页- - - - - - -精选学习资料 - - - - - - - - - 个人资料整理 仅限学习使用试验班,只要 CPU 有足够的 RAM 、Flash 储备器和一个串口扩展就可以了;但与ARM9 2410 区分越小越好,最终验证功能在都统一在 ARM9 2410 上进行测试;2 硬件抽象层的接口遵循 C/OS-II 的借口规范;3 操作系统的调用采纳函数调用方式,不用中断陷入方式;4 每个任务拥有自己独立的任务堆栈,作为任务的私有储备区;5 同时支持任务数不多于8 个,闲暇任务编号为0;7 串口接口参数:波特率 115200,8 位数据, 1 为停止位,无硬件流掌握;8 任务优先级级数多于8 级,最高优先级为0,最低优先级为7 ,闲暇任务优先级为 7;2.3 系统功能设计2.3.1 总体结构应用层互斥用户用户用户信号量任务 1任务 2任务 nRTOS内核任务间通信任务调度模块驱动层Flash.hUart.H硬件层周立功 LPC2138海量串口储备器RS232图 2-1 1. 硬件层硬件层主要包括:含量Flash 储备器、串口 RS232等,它是保证系统实现指定任务的最底层的部件;2. 驱动层驱动层的作用是给操作系统供应接口,使其能治理相应的硬件;3.RTOS 内核RTOS 内核主要任务是完成多任务之间的调度和同步;4. 应用层名师归纳总结 - - - - - - -第 7 页,共 24 页精选学习资料 - - - - - - - - - 个人资料整理 仅限学习使用 在用户的应用程序中可以创建用户自己的任务;任务之间的通信主要依靠信号 量;2.3.2 RTOS 内核处理流程 1.RTOS内核结构框架 系统初始化任务创建任务 1任务 2任务 n任务n+1任务间通信任务 1任务 2任务 n任务n+1任务调度启动最高优先级任务图 2-2 2. 查找最高优先级任务流程 查找最高优先级的 TCB以任务优先级表最高优先级任TCB务为索引 TCB 列表切换OSTCBRdyTbl名师归纳总结 - - - - - - -第 8 页,共 24 页精选学习资料 - - - - - - - - - 个人资料整理 仅限学习使用图 2-3 3. 任务通信中使等待状态优先级最高的任务从等待列表中删除,并把其放入就绪列表中流程如下:图 2-4 3 系统开发环境和工具3.1 开发环境硬件平台:博创科技 ARM9 2410 ,也可用其他博创科技系列 CPU 和试验板,只要 CPU 有足够的 RAM 、Flash 储备器和一个串口扩展就可以了;但与 ARM9 2410 区分越小越好,最终的验证都统一在 ARM9 2410 上进行;内存: 4MB ROM :64MB 开发工具: ADS 1.2 3.2 开发工具名师归纳总结 ADS1.2 ADS 是 ARM 公司的集成开发环境软件,他的功能特别强大;他的前第 9 页,共 24 页身是 SDT ,SDT 是 ARM 公司几年前的开发环境软件,目前SDT 早已经不再升级;ADS包括了四个模块分别是:SIMULATOR ;c 编译器;实时调试器;应用函数库; ADS的编译器调试器较SDT都有了特别大的改观,ADS1.2供应完整的WINDOWS界面开发环境; c 编译器效率极高,支持c 以及 c+ ,使工程师可以很便利的使用 C 语言进行开发;供应软件模拟仿真功能,使没有Emulators的学习者也能够熟识ARM 的指令系统;协作FFT-ICE使用, ADS1.2供应强大的实时调试跟踪功能 ,片内运行情形尽在把握;ADS1.2需要硬件支持才能发挥强大功能;目前支持的硬件调试器有Multi-ICE以及兼容 Multi-ICE的调试工具如 FFT-ICE ;- - - - - - -精选学习资料 - - - - - - - - - 个人资料整理 仅限学习使用4 系统具体设计该内核设计采纳结构化设计方法,以算法为中心,从处理处处理的数据流;内核一级数据流图如图4-1 所示:闲暇TCB任务任务掌握块任务就绪列表闲暇 TCB池任务列表任务掌握块创建模块任 务 编 号闲暇OS_EVENT池闲暇大事互斥信号任务掌握块任务任务掌握块键盘手动输入任务调度模块Shell命令行超级终掌握块端显示OS_EVNET量标示进程间Shell创建模块通信模块界面模块大事大事列表掌握块图 4-1 4.1 任务创建模块第一,创建任务taskCreate>函数从闲暇 TCB 池取得闲暇的TCB,并依据用户 分 配 堆 栈 的 大 小 确 定 任 务 堆 栈 的 栈 顶 指 针 , 调 用 任 务 堆 栈 初 始 化 函 数名师归纳总结 OSTaskStkInit>对任务堆栈进行初始化,返回任务堆栈的栈顶指针;然后调用函第 10 页,共 24 页数 OSTCBInit>完成对任务掌握块的初始化工作;最终把任务掌握块存放任务就绪列表中,具体流程如图4-2 所示:- - - - - - -精选学习资料 - - - - - - - - - 个人资料整理 仅限学习使用任务堆栈 初始化任务堆栈 栈顶指针闲暇 TCB池闲暇 TCB任务掌握块闲暇TCB任务列表初始化任务 编号图 4-2 4.2 任务调度模块第一 taskStart>函数依据任务编号和任务列表得到任务掌握块,把任务的编号和优先级放存放到 OSIDPrioTbl 和就绪列表中,然后启动任务调度器,依据OSIDPrioTbl 和就绪列表查找进入就绪态优先级最高的任务,最终调用函数OS_TASK_SW> 完成任务切换;任务调度具体流程如图 4-3 所示:任务编号任务列表任务掌握块taskStart任务掌握块OSTCBRdyTbl优先级储备任务优先级列表任务进入多任务调度列表任务掌握块OS_Sched任务优先级多任务调度器OS_TASK_SW任务切换启动任务图 4-3 4.3 任务通信模块第一, semCreate>函数从闲暇的OS_EVENT池中取得一个闲暇大事掌握块,并完成对其的初步初始化,将其放到大事列表中;然后,当前任务调用函数名师归纳总结 semTake>时,检查互斥信号量是否可用,假如可用当前任务占用该信号量,否就第 11 页,共 24 页调用OSEventTaskWait>函数将当前任务从就绪列表移除存放到大事等待列表- - - - - - -精选学习资料 - - - - - - - - - 个人资料整理 仅限学习使用中;最终,假如占用该互斥信号量任务的任务调用 semGive> 释放信号量,调用函数 OSEventTaskRdy>,查找等待该互斥信号量优先级最高的任务,将其从等待列表移除存放到就绪列表中,等待任务调度;具体数据流程如图 4-4 所示:任务 编号闲暇OS_EVENT池OS_EVENT大事掌握块大事编号大事列表初始化任务 编号OS_EVENT大事等待列表任务编号掌握块互斥信号量任务 编号图 4-4 5 系统具体实现5.1 任务创建模块5.1.1 任务一个任务通常是一个无限的循环;一个任务看起来像其它voidC 的函数一样,有函数返回类型,有形式参数变量,任务返回类型必需定义为型,但是任务是绝不会返回的;任务可以在一次执行完毕之后被删除,并不是任务代码被删除,只是内核不会再理睬该任务的代码,该任务再也不能运行了;5.1.2 任务状态图 5-1 是 RTOS 内核掌握下的任务状态转换土,在任一给定时刻,任务的状态肯定是在这六种状态之一;名师归纳总结 - - - - - - -第 12 页,共 24 页精选学习资料 - - - - - - - - - 个人资料整理 仅限学习使用堵塞态semTaketaskDelete僵死taskCreatesemGive就绪态OS_TASK_W运行态时钟中断中断服务态状态taskDelete任务被抢占OSIntExittaskSleepOSTimeTicktaskDelete睡眠态图 5-1 僵死状态 <OS_STAT_DORMANT)指任务驻留在程序空间中,仍没有交给RTOS 治理,把任务交给 RTOS 治理通过函数 taskStart> 来实现;任务一旦被创建就处于僵死状态,通过 taskStart> 使任务进入就绪态;任何任务的创建可以是在多任务运行之前,也可以是动态地被一个运行着的任务建立;假如一个任务是被另一个任务建立的,而这个任务的优先级高于建立它的那个任务,就这个刚刚建立的任务将立刻得到CPU 的掌握权;一个任务可以通过taskDelete>返回到僵死状态,也可以通过调用该函数使另一个任务进入僵死状态;正在运行的任务可以通过调用函数taskSleep>使自身主动舍弃CPU 掌握权,休眠一段时间,这个任务进入睡眠态,等待这段时间过去,下一个最高优先级的就绪态 任 务 立 即 获 得 CPU 的 控 制 权 ; 等 待 的 时 间 过 去 以 后 , 由 系 统 服 务 函 数OSTimeTick> 使处于睡眠状态的任务进入就绪态;正在运行的任务等待某一大事时要等待,当任务因等待大事被堵塞,下一个优先级最高的任务立刻得到CPU 的掌握权;当等待的大事放生了,堵塞状态最高优先级的任务进入就绪态;大事发生的报告可能来自另一个任务,也可能来自中断服务子程 序;正在运行的任务是可以被中断的,除非该任务将中断关了或者 RTOS 将中断关了;被中断了的任务就进入了中断服务态<ISR );响应中断时,正在执行的任务被挂起,中断服务子程序掌握了 CPU 的使用权;中断服务子程序可能会报告一个或多 个大事的发生,而使一个或多个任务进入就绪态;在这种情形下,从中断服务子程序返回之前, RTOS 要判定被中断的任务是否仍是就绪态任务中优先级最高的;假如中 断服务子程序使一个优先级更高的任务进入了就绪态,就新进入就绪态的这个优先级更高的任务将得以运行;否就原先被中断了的任务才能连续运行;5.1.3 任务掌握块为了防止动态内存安排引起的问题,该RTOS 内核采纳内存静态安排的方式,名师归纳总结 - - - - - - -第 13 页,共 24 页精选学习资料 - - - - - - - - - 个人资料整理 仅限学习使用同时为了削减对内存的需求量引入了回收和复用的机制;任务掌握块 <OS_TCB )回收使用和任务编号 <tid )复用的安排机制;在任务掌握块初始化时获得一个闲暇的TCB 方式如图 5-2 下:OSTCBFreeListOSTCBTbl0OSTCBTbl1OSTCBTbl2OSTCBTblOS_MAX_TASKOSTCBNextOSTCBNextOSTCBNextOSTCBNext0图 5-2 ptcb = OSTCBFreeList; /* 获得闲暇的 TCB */ OSTCBFreeList = ptcb->OSTCBNext; /* 修改闲暇 TCB 链表的指针 */在任务被删除时回收 ptcbOSTCBNextTCB ,如图 5-3 所示:OSTCBFreeListOSTCBTbl0OSTCBTbl1OSTCBTbl2OSTCBTblOS_MAX_TASK0OSTCBNextOSTCBNextOSTCBNextOSTCBNext图 5-3 ptcb->OSTCBNext = OSTCBFreeList; /*回收 TCB所占用的资源 */OSTCBFreeList = ptcb; /* 修改闲暇 TCB链表的指针 */ 为了降低任务列表对内存的需求量,引入了任务编号的复用机制,任务的编号与 系统最多运行的任务有关,而与其他的优先级无关,从而削减了 RTOS 对 RAM 的需求量;任务编号的复用机制如下所示:ptcb 表示任务掌握块ptcb = OSTCBFreeList; /* 从 TCB表中获得闲暇的 TCB*/任务掌握块 OS_TCB中的几个成员的算法 : OSTCBX = priority&0x07;OSTCBBitX = OSMapTblpriority&0x07;上述变量主要用于加速任务就绪态的过程或进入等待大事发生状态的过程 < 防止在运行中去运算这些值);这些值是在任务创建时算好的,或者是在转变任务优先级时算出的;5.1.4 任务就绪表名师归纳总结 - - - - - - -第 14 页,共 24 页精选学习资料 - - - - - - - - - 个人资料整理 仅限学习使用每个任务被赐予不同的优先级,从 0 级到最低优先级 OS_LOWEST_PRIO,包括 0 和 OS_LOWEST_PRIO 在 内 ; 当 系 统 初 始 化 的 时 候 , 最 低 优 先 级OS_LOWEST_PRIO 总 是 被 赋 给 空 闲 任 务 idle task ; 注 意 , 最 多 任 务 数 目OS_MAX_TASK 和最低优先级时没有关系的;每个任务的就绪态都放入就绪表中,OSRdyTbl 中的相应元素的相应位也置位;就绪表 OSRdyTbl 数组的大小取决于 OS_LOWEST_PRIO;当用户的应用程序中的任务数目比较少时,削减 OS_LOWEST_PRIO 的值可以降低 RTOS 对 RAM的需求量;为 了 确 定 下 次 改 哪 个 优 先 级 的 任 务 运 行 了 , 内 核 调 度 器 总 是 将OS_LOWEST_PRIO在就绪表中相应就绪表中的相应字节的相应位置置1 ;如图 5-4当优先级 0 时, OSRdyTbl 的第 0 位置 1,当优先级 1 时, OSRdyTbl 的第 1 位置 1,当优先级 2 时, OSRdyTbl 的第 2 位置 1,当优先级 3 时, OSRdyTbl 的第 3 位置 1,当优先级 4 时, OSRdyTbl 的第 4 位置 1,当优先级 5 时, OSRdyTbl 的第 5 位置 1,当优先级 6 时, OSRdyTbl 的第 6 位置 1,当优先级 7 时, OSRdyTbl 的第 7 位置 1,01234567优先级为0优先级为1优先级为2优先级为3优先级为4优先级为5优先级为6优先级为7图 5-4 把任务放入等待列表中,采纳位图的方式,将任务放入等待列表;priority表示任务的优先级:OSMapTbl 的值名师归纳总结 下标二进制掩码第 15 页,共 24 页0 00000001 1 00000010 2 00000100 3 00001000 4 00010000 5 00100000 - - - - - - -精选学习资料 - - - - - - - - - OSRdyTbl priority>>3 个人资料整理仅限学习使用6 01000000 ;7 10000000 |= OSMapTblpriority & 0x075.2 任务调度模块 5.2.1 基于优先级抢占调度 当一个运行着的任务使一个比它优先级高的任务进入了就绪态,当前任务的 CPU 使用权就被剥夺了或者说是挂起了,那个高优先级的任务立刻得到 CPU 的掌握 权;假如中断服务子程序使一个高优先级的任务进入就绪态,中断完成时,中断了的 任务被挂起,优先级高的那个任务得到运行;调度流程如图 5-5 所示:图 5-5 基于优先级抢占的内核,最高优先级的任务什么时候可以执行,可以得到 CPU 的掌握权是可知的;使用基于优先级的抢占式内核使得任务响应时间得以最优化;基于优先级调度的内核总是让就绪态的高优先级的任务先运行,中断服务程序可以抢占 CPU,到中断服务完成时,内核使优先级最高的任务运行,任务响应时间得到了最 优化,且是可知的;查找进入就绪态优先级最高的任务的TCB并完成任务前换的步骤如图任5-6 所示:查找就绪态查找最高优先最高优先优先级级的TCB以最高优先级为最高优先级优先级位图储备就绪列表最高优先级务索引TCB列表TCB切换名师归纳总结 OSRdyTblOSTCBRdyTbl( 3 )第 16 页,共 24 页( 2 )( 1 )- - - - - - -精选学习资料 - - - - - - - - - 个人资料整理 仅限学习使用图 5-6 第一步:利用就绪表查找处于就绪态的最高优先级;利用任务就绪表和 OSUnMapTbl 查询处于就绪态优先级最高的任务的方法如下: priority 表示任务的优先级X= OSUnMapTblOSRdyTbl ;priority = INT16U>X;OSUnMapTab 数组结构如下所示:INT8U const OSUnMapTbl256 = 0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x00 to 0x0F */ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x10 to 0x1F */ 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x20 to 0x2F */ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x30 to 0x3F */ 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x40 to 0x4F */ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x50 to 0x5F */ 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x60 to 0x6F */ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x70 to 0x7F */ 7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x80 to 0x8F */ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x90 to 0x9F */ 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1,