1. 嵌入式操纵系统模型
超微内核: 规模最小,OS核心,主要完成中断、事件分发,部分可对多核处理器资源进行分配。
微内核: 扩展了任务调度等功能。
内核: 增加了任务间同步能力等服务。
执行体: 包括了私有内存模块,IO服务及其它复杂机制,大多商用嵌入式实时操作系统都是此形式。
操作系统: 提供了用户交互接口、文件系统、数据库、安全服务等组件的执行体,是一个完整的系统组件。
2. 内核基本服务——多任务机制
内核分为抢占式内核和非抢占式内核。
任务task
任务是指“需要完成工作的一个特定部分”,强调应用属性,是EOS(嵌入式系统)中的一个软件对象。
任务控制块TCB
①TCB是进行任务管理的数据结构:任务上下文及任务ID、状态、指向下一个要执行任务的TCB的指针、优先级等内容和属性。内核基于TCB中的信息,将相同状态的任务挂载到相应的任务队列中分类管理。
②任务状态由内核维护,包括运行、就绪、阻塞、睡眠、挂起等。
③任务优先级:优先级分为静态优先级和动态优先级,最低优先级的中断程序也要比最高优先级的任务先执行。
任务上下文(Task Context)及其切换
主要是保护现场,任务上下文是多任务系统中,任务被中断时所必需保存的最小数据集,涉及分配给任务的内存区域(包括堆栈)以及处理器的寄存器组等资源。
任务调度器
是内核中以就绪队列为主要对象的任务管理组件,以特定策略从就绪队列中选取要执行的任务,在内核态切换任务的上下文并跳转到该任务PC寄存器所指的位置。
抢占式调度:EDF调度等;
非抢占式调度:时间片轮转等;
中断
构成多任务系统的一种基本方式,最大中断禁止时间,即中断延迟时间,执行高优先级中断时不会响应低优先级中断,时间越小越好。
中断响应时间是指从中断发生到中断处理程序开始执行的时间间隔。
数据共享问题
多个任务间共享数据空间,可能存在读写、谢谢操作的竞争。
3. 实时性与可调度性
实时是指系统能够在限定的响应时间内提供所需水平的服务,实时系统是指计算的正确性不仅取决于程序的逻辑正确性,也取决于结果的产生时间。
逻辑或功能正确 logical or functional correctness,是指产生正确结果。
时间正确 timing correctness,是指在预定时间内完成计算。
对于嵌入式系统来说,一定要关注时间正确性。
任务的时间属性
任务的时间属性包括:就绪/释放时间、截止期、执行时间(真正持有CPU的时间)、完成时间、响应时间、滞后时间(超过截止期的时间,负时间表示提前完成)。
硬实时:截止期之前必须执行完。 硬实时系统:含多个硬实时任务,比如飞行控制、核电站、机器狗等。 软实时:允许超过截止期,统计思想,滞后时间越长,逻辑结果可信度越差。 软实时系统:多媒体、视频安防、火灾监控、城市交通调度。
可调度性
从任务角度:可调度feasible schedule,对于每一个具有截止期要求的任务,不论何时只要在释放时间后启动,就都有可能在截止期前玩成。
从调度算法角度:schedulable,对一个调度算法,一组任务总是有可行的调度方案是每个任务在截止期前完成,如果一个系统中的所有任务都是可调度的,就说这个系统是实时的。
调度优化:optimal schedule,只要存在,调度算法总是可以找到这个可执行的调度序列。
错失率:miss rate,已执行任务中,完成执行但是超过截止期的任务所占的比例。 丢失率:loss rate,丢弃的任务所占的比例。 失效率:invalid rate,错失率+丢失率。
4. 任务管理与实时调度
任务管理
任务管理是内核的核心功能之一,基本操作包括:
- 任务创建:在内存中为任务控制块和栈分配空间,初始化并激活任务;
- 任务删除:结束任务执行,删除任务实体并释放其所占用的资源或挂起任务;
- 任务控制:软件中通过系统调用,对任务运行状态进行动态控制;
实现实时系统的总目标:让紧急任务能够尽可能地先执行并且尽可能快的完成执行。
所需资源+高优先级+抢占式调度机制+尽快拿到资源
任务调度
任务调度器根据调度算法和策略从就绪队列选择要执行的任务。切换上下文+任务调度。
单调速率调度rate monotonic scheduling,RMS,静态优先级调度算法,衍生的单调截至期调度deadline monotonic scheduling,DMS。RMS是一种静态优先级调度算法,优先级一旦分配好就固定不变,分配原则是任务周期越短即执行速率越快,则优先级越高。
最早截止期调度Earliest deadline first scheduling,EDF,动态优先级调度算法,任务优先级在系统运行过程中随着某些因素动态变化,核心思想是截止期最近的任务拥有最高优先级。
时间片轮转调度Round Robin scheduling,RR。相同优先级就绪任务的调度算法,每个任务只执行固定的时间片,然后由调度器在就绪队列中选择下一个任务。
5. 优先级翻转 Priority Inversion
低优先级任务持有高优先级任务所需要的临界资源,从而导致高优先级任务被延迟执行,高优先级任务会抢占低优先级任务所持有的CPU,但需要等待低优先级任务主动放弃所持有的临界资源,此时高优先级任务被阻塞,此时CPU返还低优先级任务,如果再来一个中优先级任务,它不需要等待临界资源,直接抢占CPU执行,这时,中优先级的任务先于高优先级的任务执行完成,这就造成了优先级翻转。优先级翻转的本质就是低优先级的任务持有高优先级任务执行所需要的资源,导致中优先级的任务先于高优先级任务被阻塞执行。
解决方法有如下几种:
①优先级继承协议priority inheritance protocol,PIP
优先级翻转问题发生时,让持有共享资源的子优先级任务获取被阻塞高优先级任务的优先级,以尽快执行完并释放共享资源,进而使高优先级任务能尽快响应。也就是说,通过优先级继承来防止中优先级的任务插队。
②优先级天花板协议priority ceiling protocol,PCP
priority ceiling即为每一个临界资源赋予一个较高优先级。务在临界资源以外时,以原有的优先级运行。当一个任务t尝试获取一组所需临界资源中的一个资源s时,如果任务t的优先级严格大于已被其他任务所持有的临界资源的优先级天花板,任务能够获得该临界资源;否则的话,任务t被阻塞,而且持有临界资源的任务继承任务t的优先级。总之就是,任务有优先级,资源也有优先级,预防了死锁和阻塞传递。
③原始天花板优先级协议original ceiling priority protocol,OCPP
每个任务都有一个默认的优先级,各共享资源分别有一个静态天花板优先级,设定为使用该资源的任务的最大优先级;每个任务有一个动态优先级,是其静态优先级和继承自阻塞者任务的优先级中的最大者;当一个任务申请一个资源时,如果动态优先级高于任何被其他任务持有的资源的优先级天花板时,该任务将能够获得所申请资源。(预防死锁)
④立即天花板优先级协议immediate ceiling priority protocol,ICPP
任务具有静态优先级,每个资源具有静态优先级天花板;任务的动态优先级是其静态优先级及其所持有的资源的优先级天花板的最大值。
6. 任务间通信机制
共享内存(通信机制)
原生机制:公共内存空间+数据结构,比如说全局变量,在两个或多个人物之间交换数据。
当多任务同时访问,且有写操作时会产生数据共享问题,需要考虑互斥。
可使用的数据结构有:共享数组(线性缓冲区)、循环数组(环形缓冲区)、链表、指针变量等。
数据通信+行为协同
①消息队列(是一种内核机制)
内核机制:为多任务交互提供的以消息为单元的数据交互,内核可以同时创建、维护多个消息队列,每个队列有独立的ID,队列中的消息数量和长度可变。
FIFO队列,优先级消息队列。
队列占用内存太大,数据量太大,可以将数据映射为无数据类型指针。要在不同的任务间传递数据,先将数据放在缓冲区中,然后再将指向这个缓冲区的指针放入队列中,接收任务读取指针,依指针读取数据,由接受任务释放指针。
②消息邮箱
内核机制:可以看作是非常短的消息队列,消息指针或短队列。用于任务间少量数据通信,可用于任务间同步(此时不再关注消息内容)。
数据通信
管道:是一种内核机制,在任务见提供消息流的IO对象。流式通道,通常是完全面向字节流的,可按照M个字节写入,N个字节读出。由内核自带的API如创建、读出、写入管道等函数。可以使用标准IO或者文件读写函数对管道操作,管道具有消息队列和邮箱不具备的特性,管道作为IO设备,可使用标准的select函数来读管道。
同步
事件与事件组是基于同步模型的所人物之间,任务与中断服务程序之间,任务与操作系统资源之间的通信机制。每个任务的TCB中会包含一个二进制的事件寄存器,寄存器的每一位对应一个事件,即二进制事件标志。允许多个任务阻塞在同一个事件上,事件到来时内核依据任务优先级从阻塞在该事件的任务队列中选择并释放一个任务,允许一个任务等待在“与”或者“或”逻辑的事件组上。
同步/互斥
信号量是多任务操作系统内核重要的服务机制,用于任务与任务,任务与终端服务程序之间的同步。信号量有二进制信号量、互斥信号量、计数信号量等。
信号
软中断信号,内核提供的任务间异步通信服务,用于改变任务的控制流,以异步方式操作,所发送的信号仅在接收进程被调度时才有机会被处理,不同的EOS的信号机制有不同特性。
7. 分区存储管理机制
操作系统存储管理,重点是对物理内存及虚拟内存的管理,外部存储器的管理有文件系统负责。
静态使用:静态变量、全局变量,不会引起内存的不可预测访问,可靠但利用率低。
动态使用:动态存储器管理,分区存储器管理,按需分配、不可靠、利用率低。
静态内存管理
提前将内存分段划分为多个区域,以供不同的代码或系统功能使用,至少包括:代码区、数据区、可动态使用存储区。
动态内存管理
malloc、free,会产生碎片。
分区池机制
基本思想是对内存中的堆资源进行提前分配,创建一组确定大小的内存块block,一组内存块组成内存池pool,一组内存池构成一个分区partition。
内存是提前确定好的,在使用时进行逻辑操作。
逻辑的分配删除只是表示某块内存空闲或者占用,而不是物理上的删除和分配,物理上的分配在初始化时就已经完成了。EOS应用具有一定的确定性,系统初始化阶段进行存储资源预分配对于提高实时软件进行效率很有意义。
❗❗❗重要❗❗❗☞关注下方公粽号 《机器和智能》 回复关键词 “python项目实战” 即可获取美哆商城视频资源!