文章目录
嵌入式软件基础
- 嵌入式软件的特点
- 规模较小:几MB以内。
- 开发难度大:硬件资源有限,时间和空间的限制,涉及到底层软件,运行环境和开发环境受限
- 高实时性和可靠性要求:
- 确定的、可重复的、可预测的;
- 事件的处理要在限定的时间期限之前完成,否则就有可能引起系统的崩溃。例如航天控制、核电站、工业机器人
- 软件固化存储
- 嵌入式软件的分类
- 系统软件:设备驱动程序、嵌入式操作系统、嵌入式中间件等。
- 应用软件:嵌入式系统功能的体现,一般面向特定的应用领域。
- 支撑软件:辅助软件开发的工具软件
- 系统软件和应用软件运行在目标平台,软件开发工具运行在宿主机上。
- 嵌入式软件的体系结构:无操作系统和有操作系统
- 无操作系统的嵌入式软件
- 采用循环轮转和中断(前后台)两种实现方式。
- 循环轮转方式:把系统的功能分解为若干个不同的任务,按照时间顺序逐一执行。当程序执行完一轮后,又回到程序的开头重新执行,循环不断。
- 中断方式:又称为前后台系统形式,系统在循环轮转方式的基础上增加了中断处理功能。
- 前台程序,无中断时运行的程序。
- 后台程序,处理中断服务。
- 采用循环轮转和中断(前后台)两种实现方式。
- 有操作系统的嵌入式软件
- 无操作系统的嵌入式软件
- 嵌入式系统的设备驱动层
- 功能:
- 嵌入式系统硬件设备所需的软件初始化和管理
- 直接对硬件进行管理和控制,并为上层软件提供所需的驱动支持
- 板级支持包(BSP)
- 把所有与硬件相关的代码都封装起来,为操作系统提供一个虚拟的硬件平台。使用一组定义好的编程接口,通过BSP来访问真正的硬件
- BootLoader(引导加载程序)和设备驱动程序
- 功能:
- BootLoader
- 与嵌入式系统的硬件平台直接相关
- 在操作系统内核运行之前运行的一小段程序。
- 初始化硬件设备、建立内存空间的映射图,将系统的软硬件环境设置到一个合适的状态,为调用操作系统内核做好准备。
- BootLoader程序从地址0x00000000处开始执行。
- 包含片级初始化、板级初始化和加载内核。
- 片级初始化
- 是纯硬件的初始化过程
- 设置系统所要求的工作状态
- 设置微处理器的核心寄存器和控制寄存器
- 微处理器的核心工作模式
- 局部总线模式等初始化
- 板级初始化
- 硬件的初始化过程:完成微处理器以外的其他硬件设备的初始化
- 软件的初始化过程:设置内存空间的地址映射,某些软件的数据结构和参数等
- 加载内核
- 复制:将操作系统和应用程序的映像从Flash存储器复制到系统的内存当中
- 跳转到系统内核的第一条指令处继续执行
- 设备驱动程序
- 一组库函数,用来对硬件进行初始化和管理,并向上层软件提供访问接口
- 具有硬件启动(初始化)、硬件关闭(关机)、硬停用(暂停)、硬件启用(重新启用)、读操作(读取数据)、写操作(写入数据)等基本功能
- 设备驱动程序采用函数的形式来实现,有分层结构和混合结构两种组织结构形式
- 在分层结构中,设备驱动程序中的函数分为硬件接口和上层接口两种类型
- 在混合结构中,上层接口和硬件接口的函数是混在一起、相互调用的,之间没有明确的层次关系
- 嵌入式中间件
- 嵌入式中间件是指不包括操作系统内核、设备驱动程序和应用软件在内的所有系统软件
- 嵌入式中间件把原本属于应用软件层的一些通用的功能模块抽取出来,形成独立的一层软件
- 为应用软件提供一个灵活、安全、移植性好、相互通信、协同工作的平台
- 消息中间件、对象中间件、远程过程调用等
- 如Sun的嵌入式Java,微软的.NET Compact Framework,OMG的嵌入式CORBA等
- 嵌入式中间件是指不包括操作系统内核、设备驱动程序和应用软件在内的所有系统软件
嵌入式操作系统基础
- 嵌入式操作系统(EOS)的功能
- 构成一个易于编程的虚拟机平台
- EOS提供的编程接口就是操作系统对外提供的系统调用函数
- 系统资源的管理者
- 管理系统中的各种软硬件资源,如处理器、内存、各种I/O设备、文件和数据等
- 为了完成某一项或有限项功能,要求系统功能剪裁、调整
- 构成一个易于编程的虚拟机平台
- EOS都有一个内核(kernel),内核是系统当中的一个组件
- 任务管理:对嵌入式系统中的运行软件进行描述和管理,并完成处理机资源的分配与调度
- 存储管理:用来提高内存的利用率,方便用户的使用,并提供足够的存储空间
- I/O设备管理:提高CPU和输入/输出设备的利用率
- 文件管理:解决文件资源的存储、共享、保密和保护等问题
- 嵌入式操作系统的分类
- 按系统的类型分类
- 商业化系统
- 风河公司(WindRiver)的VxWorks,微软公司的Windows CE,Palm公司的PalmOS
- 特点是功能强大,性能稳定,辅助软件工具齐全,应用范围广泛,但成本较高
- 专用系统
- 专业厂家为本公司产品特制的嵌入式操作系统
- 开放源代码系统
- µC/OS、FreeRTOS和各类嵌入式Linux系统
- 具有免费、开源、性能优良、资源丰富、技术支持强
- 商业化系统
- 按响应时间分类
- 实时操作系统(RTOS)
- 响应时间有非常严格的要求
- 硬实时和软实时
- 硬实时:失败会导致灾难性的后果
- 软实时:失败会降低一些性能,可能会引起用户注意,但不会导致系统失败。
- 非实时操作系统
- 对响应时间没有严格的要求,各个进程分享处理器,以获得各自所需要的运行时间
- 实时操作系统(RTOS)
- 按软件结构分类:单体、分层、微内核
- 单体结构
- 嵌入式Linux、Jbed RTOS、µC/OS-II和PDOS都属于单体内核系统
- 中间件和设备驱动程序通常就集成在系统内核当中,整个系统通常只有一个可执行文件
- 通信开销比较小,系统高度集成和相互关联
- 分层结构
- 内部分为若干个层次(0~N),各个层次之间的调用关系是单向的
- 每个层次上都提供一组API接口函数
- 典型代表有MS-DOS
- 微内核结构
- 内核中只保留最核心的功能单元
- 大部分的系统功能都位于内核之外
- 核内组件与核外组件之间的通信方式是消息传递
- OS-9、C Executive、VxWorks,CMX-RTX、NucleusPlus和QNX,鸿蒙OS
- 单体结构
- 按系统的类型分类
嵌入式系统的任务管理
- 单道程序设计和多道程序设计
- 单道程序设计类型
- 任何时候只能有一个程序在运行
- 任何时候只能有一个程序在运行
- 多道程序设计类型
- 允许多个程序同时存在并运行
- 一个程序在访问I/O设备时,另一个使用CPU,实现了多个程序的并行
- 单道程序设计类型
进程、线程和任务
进程(process)
- 进程是一次执行过程,它是暂时的,是动态地产生和终止的
- 一个程序主要由代码和数据两部分内容组成。而进程是正在执行的程序,有相应程序的代码和数据
- 它是由程序和该程序的运行上下文两部分内容组成
- 程序是静态的,而进程是一个动态的,变化的
- 一个进程在运行的时候可以启动一个或多个程序,同一个程序也可能由多个进程同时执行
- 程序可以以文件的形式存放在硬盘或光盘上,作为一种软件资源长期保存。进程是暂时的,是动态地产生和终止的
- CPU上下文:
- 程序在运行时,CPU中含有PC(程序计数器)、程序状态字、通用寄存器、段寄存器、栈指针寄存器等各种寄存器的当前值内容
- 系统资源:操作系统用来管理进程的数据结构、进程的内存地址空间、进程正在使用的文件等
- 进程具有独立性,一个进程是一个独立的实体,占有计算机的系统资源,每个进程都有自己的运行上下文和内部状态,在它运行的时候独立于其他的进程
- 进程具有并发性,在系统中同时有多个进程存在,它们相互独立地运行
线程
- 线程(thread)是一个比进程更小的能独立运行的基本单位。所谓的线程,就是进程当中的一条执行流程
- 从资源组合的角度来看,进程把一组相关的资源组合起来,构成了一个资源平台(资源环境)
- 可以把进程看成是程序代码在这个资源平台上的一条执行流程(线程),也就是可以认为
进程等于线程加上资源平台
- 在一个进程当中,或者说在一个资源平台上,可以同时存在多个线程。可以用线程来作为CPU的基本调度单位,使得各个线程之间可以并发执行
- 对于同一个进程当中的各个线程来说,运行在相同的资源平台上,可以共享该进程的大部分资源。但也有一小部分资源是不能共享的,
每个线程都必须拥有各自独立的一份
(如CPU运行上下文)
任务
- 在一些嵌入式系统中,把
能够独立运行的实体
称为“任务”(task) - 在任务创建过程中定义的主要参数有任务优先级、栈空间的大小和任务名
- 任务具有独立的优先级和栈空间,CPU上下文一般也是存放在栈空间中
- 在VxWorks、µC/OS-II、 Jbed、嵌入式Linux等嵌入式操作系统中
- 任务的层次结构
- 在多道程序的嵌入式操作系统中,同时存在着多个任务
- 嵌入式内核启动时,只有一个任务存在
- 然后由该任务派生出其他所有任务
- 这些任务采用层状结构,存在着父子关系
- 任务的创建
- 系统初始化、任务运行过程中、人机交互等过程中都可以创建任务
- 在系统初始化时,一般都会创建系统与用户进行交互的一些前台任务,以及完成键盘扫描、系统状态检测、时间统计等一些特定功能的后台任务
- 在任务运行过程中,也能够使用相应的系统调用来创建新的任务,以帮助它完成自己的工作
- 在一些具有交互功能的嵌入式系统中,用户可以通过输入命令或单击图标的方式,让系统启动一个新的任务
- 创建基本方法:是在一个已经存在的任务当中,通过调用相应的系统函数来创建一个新的任务
- 任务的创建主要采用fork/exec和spawn两种模型
- fork/exec模型源于IEEE/ISO POSIX 1003.1标准
- spawn模型是从它派生出来的
- 系统初始化、任务运行过程中、人机交互等过程中都可以创建任务
- 创建过程
- 为新任务分配相应的数据结构,存放各种管理信息,分配内存空间,存放任务的代码和数据
- 当新任务准备就绪后,就可以运行它
- 任务的终止
- 原因:
- 正常退出:当一个任务完成了所有的工作,需要结束运行,提出退出要求
- 错误退出:当一个任务在执行过程中,出现了致命的错误,系统强制性地终止该任务
- 被其它任务踢出:操作系统中可以提供一些系统调用函数,用来把一个任务从系统中清除出局,称为被其它任务踢出
- 在一些嵌入式系统中,某些任务被设计为“死循环”的模式,任务不会自行终止
- 原因:
- 任务的状态:运行(running)、就绪(ready)和阻塞(blocked)
- 运行状态,占有CPU,并在CPU上运行,在任何一个时刻,处于运行状态的任务个数必须小于或等于CPU的数目
- 就绪状态,当一个任务已具备运行条件,但由于CPU正在运行其他的任务,暂时不能运行该任务
- 阻塞状态,也叫等待状态(waiting),任务因为正在等待某种事件的发生而暂时不能运行
- 在一定条件下,任务会在不同的状态之间相互转换
- 运行→阻塞、运行→就绪、就绪→运行、阻塞→就绪四种转换关系
- 运行→阻塞、运行→就绪、就绪→运行、阻塞→就绪四种转换关系
- 任务控制块(TCB,Task Control Block)
- TCB是在操作系统当中用来描述和管理一个任务的数据结构
- TCB看成
是任务存在的唯一标志
- 当需要创建一个新任务的时候,就为它生成一个TCB,并初始化这个TCB的内容
- 当需要终止一个任务的时候,只要回收它的TCB即可
- TCB包括
任务的管理信息、CPU上下文信息、资源管理信息
- 任务的管理信息:任务的标识ID、任务的状态、任务的优先级、任务的调度信息、任务的时间统计信息、各种队列指针
- CPU上下文信息:通用寄存器、PC寄存器、程序状态字、栈指针等各种CPU寄存器的当前值。
- 资源管理信息:资源管理方面的信息,如段表地址、页表地址、根目录、文件描述字
- 任务切换
- 任务切换(context switching)是指一个任务正在CPU上运行,由于某种原因,系统需要调度另一个任务去运行
- 保存当前任务的运行上下文,并设置新任务的上下文,这一过程称为任务切换
- 任务切换通常包含有以下几个基本步骤:
- 将处理器的运行上下文保存在当前任务的TCB中
- 更新当前任务的状态,运行状态变为就绪或阻塞状态
- 按照一定策略,
从就绪任务中
选择一个任务运行 - 修改新任务的状态,从就绪状态变成运行状态
- 根据新任务的TCB的内容,恢复它的运行上下文环境
- 任务队列:
- 运行队列
- 阻塞队列
- 就绪队列
- 系统中的每个任务,根据它的状态把它的TCB放到相应的队列中
多速率系统
- 实时系统
- 完成一次计算需要遵守的时间约束
- 截止时限(deadline)的频率
- 周期的
- 非周期的
- 运行周期性任务
- 代码控制执行时间
- 单计时器控制
- 多计时器
- 单计时器控制整倍数差异的多速率
- 举例:循环控制进程的执行
- 简单的实现只有一个循环
- 没有控制各个进程的执行速率
- 所有进程以相同的速率执行
- 简单的实现只有一个循环
while (TRUE) {
p1();
p2();
}
- 精心设计代码控制执行时间
- 在循环体内插入空操作得到期望的周期
- 20世纪70年代,电视游戏的设计使用了上述方法
- 缺点:若程序发生变化,则整个调度时间需要重新评估
- 举例:单计时器控制
- 计时器产生周期性中断,调用计时器中断处理程序
void pall(){
p1();
p2();
}
- 问题:
- 没法控制单个任务的执行时间
- 若一个进程运行过长时间,计时器中断被屏蔽,则下一次迭代被延迟
- 举例:多计时器控制
- 若干计时器,不同速率设置不同的计时器
void pA(){ /* rate A */
p1();
p3();
}
void B(){ /* rate B */
p2();
p4();
p5();
}
- 问题:系统没有足够的计时器实现所有速率
- 举例:单计时器控制整倍数差异的多速率
- 实现有整数倍差异的多进程
- 计时器+计数器
- 通过软件划分速率
int p2count = 0;
void pall(){
p1();
if (p2count >= 2) {
p2();
p2count = 0;
}
else p2count++;
p3();
}
- 任务调度
- 调度器(scheduler)
从就绪队列
中选择一个任务去运行,调度器是CPU这个资源的管理者 - 选择适当的调度策略保证满足所有时限要求
- 调度器在决策过程中采用的算法称为调度算法(调度策略)
- 会对CPU的利用率产生很大影响。
- 调度器(scheduler)
- 调度时机
- 新的任务被创建时
- 一个任务运行结束时
- 一个任务由于I/O操作、信号量或其他原因被阻塞时
- 一个I/O中断发生时
- 一个时钟中断发生时
- 评估调度策略的度量:
CPU利用率=用于有效工作的CPU时间/总的CPU时间
- 调度开销:选择下一个要执行任务所需的计算时间
- 任务调度方式:
- 可抢占调度(preemptive):当一个任务正在运行的时候,出现调度时机当中的五种情况之一,都有可能会发生调度
- 不可抢占调度(nonpreemptive):一个任务长时间地占用着CPU系统也不会强制它中止
- 新任务创建、任务运行结束及任务被阻塞的调度时机时,才可调度
可抢占的实时操作系统
- 可抢占调度解决了协同多任务系统的若干问题
- 准备满足时限需求
- 使用
优先级控制
在任意时刻运行哪个进程
- 内核:
- 确定在CPU下一个运行的任务
- 上下文切换: 一个进程的寄存器切换到另一个进程
- 上下文:一组寄存器
- 上下文切换:一个进程的寄存器切换到另一个进程的寄存器
- 原来进程的寄存器存储到记录(TCB)里
- 取出要执行的进程记录(TCB)中的数据放到寄存器中
- 代码通常是汇编写的
- 恢复上下文要特别快捷
- 调度算法:先来先服务,短作业优先,时间片轮转,优先级算法
- 先来先服务算法(FCFS)
- 按照任务到达的先后次序来进行调度,它是一种不可抢占的调度方式
- 短作业优先算法(SJF)
- 调度算法根据事先预计的时间,安排执行时间较短的任务优先执行
- SJF算法有不可抢占和可抢占方式两种实现方案
- 时间片轮转算法(RR)
- 按照轮转的方法,为每个任务分配一小段CPU执行时间(time slice,时间片)
- 优先级算法(priority)
- 给每一个任务都设置一个优先级,在队列中选择优先级最高的那个任务去运行
- 优先级算法可以分为可抢占和不可抢占两种方式
- 优先级的确定:静态方式和动态方式
- 在优先级算法中,通常是把任务按照不同的优先级进行分组,然后在不同组的任务之间使用优先级算法,而在同一组的各个任务之间使用时间片轮转法
- 先来先服务算法(FCFS)
基于优先级的调度
- 每个进程有一个优先级
- CPU选择优先级最高的就绪进程执行
- 该进程一直执行,直至执行完毕或者被更高优先级的进程抢占
- 优先级的确定
- 固定优先级
- 随时间变化的优先级
- 例:三个进程(P1的优先级最高)
- P1:优先级1, 执行时间10
- P2:优先级2,执行时间30
- P3:优先级3,执行时间20
- 假定P2在系统一启动就准备运行,P1和P3分别在时刻15和时刻18到达
- 实时系统调度
- 实时系统的调度要求实时性,RTOS调度器要让每个任务都在其最终时间期限(deadline)之前完成
- 多采用基于优先级的可抢占调度算法
- RTOS任务模型
- 每一个任务用一个三元组来表示(执行时间、周期、时间期限)
- 执行时间:E(i)是指第i个任务在CPU上执行的最长时间
- 周期:P(i)是第i个任务连续两次运行之间的最小时间间隔
- 时间期限:D(i)是指第i个任务所允许的最大响应时间。一般来说,
P(i)=D(i)
- 启动时间t(i) :第i个任务在CPU上开始执行的时间
- 因此,又表示成(执行时间、启动时间、时间期限)
- RTOS调度算法:单一速率调度算法,最早截止时限优先算法
单一速率调度算法(RMS)
- 静态优先级调度算法
- RMS算法假设:
- 所有的任务都是周期性任务
- 任务的时间期限等于它的周期
- 任务在每个周期内的执行时间是一个常量
- 任务之间不进行通信,也不需要同步
- 任务可以在任何位置被抢占,不存在临界区的问题
- 优先级的设定:
任务的周期越短,优先级越高
- RMS算法是按照静态优先级来调度任务
周期长度:所有进程周期长度的最小公倍数
- 例
- 进程p1,执行时间1,周期4;
- 进程p2,执行时间2,周期6;
- 进程p3,执行时间3,周期12
- 优先级:p1最高,p2次之,p3最低
- 例:没有可行的调度
- 一组进程
- 进程p1,执行时间2,周期4
- 进程p2,执行时间3,周期6
- 进程p3,执行时间3,周期12
- 优先级:p1最高,p2次之,p3最低
- 无调度保证
- 长度12,p1运行3次;p2运行2次;p3运行1次;
- CPU使用时间:32+23+1*3=15,超出周期长度
CPU的利用率超过100%,不可行!
- 一组进程
- 例:利用率的计算
- 进程p1,周期4,执行时间2
- 进程p2,周期12,执行时间1
- 周期长度:最小公倍数12;
- 利用率:
[(2*3)+1*1]/12=58.33%
共享资源
- 资源
- 内存
- I/O设备
- 共享资源
- 为多个进程所访问,如共享内存,共享I/O设备
信号量机制
- 例:两个任务访问一个I/O设备,通过I/O设备的一个标志来测试该设备是否有空,但当以错误的顺序操作该设备,可能会导致错误
- 任务1读标志位,发现其值为0;
- 任务2读标志位,发现其值为0;
- 任务1置标志位为1,并向I/O设备的数据寄存器写入数据;
- 任务2置标志位为1,并向I/O设备的数据寄存器写入数据;
任务一的写操作被覆盖,无法完成写操作!
- 信号量保护共享资源的访问
- 调用信号量函数,为共享资源加锁,禁止其它任务访问;
- 该任务访问共享资源;
- 调用信号量函数,为共享资源解锁,允许其它任务访问;
- 通过P( ) 操作和V( )操作完成对共享资源的保护
- P( ) 操作和V( )是原子操作
- P( )操作获得共享资源的访问权;
- V( )操作释放该资源
优先级反转
- 共享资源引发一个问题:优先级反转
- 低优先级进程由于
获得了临界资源会阻塞较高优先级进程的执行
- 低优先级进程由于
- 例:一个包含3个进程的系统,p1 优先级最高,p3优先级最低,p1和p3使用相同的共享资源,按照p3,p2,p1的顺序依次进入就绪状态,这时就会出现优先级反转
- p3就绪,进入其临界区,访问共享资源;
- p2就绪,抢占p3;
- p1就绪,抢占p2,一旦要进入临界资源,因该资源被p3占有,p1停止执行;
- p2执行,执行完后p3执行,执行完后,释放共享资源,p1才能执行,出现优先级低的在优先级高的进程前执行。
- 优先级反转的解决办法
- 优先级继承
- 为系统资源设置优先级,比所有共享该资源的进程的优先级都高;
- 任何进程从OS请求该共享资源时提升其优先级为该资源的优先级;
- 该进程执行完后,将该资源返还给OS,并恢复它的优先级为原有优先级。
- 优先级继承
最早截止时限优先调度(EDF)
- 动态优先级调度算法
- EDF算法的基本思路是:
根据任务的截止时间
来确定其优先级,对于时间期限最近的任务,分配最高的优先级 - EDF算法可调度上限为100%,但可能会错过一个截止时限
- 其花费很大,在实践中很少使用
- EDF实现:
- 每个计时器中断完成:
- 计算每个进程的截止时限;
- 选择最近截止时限的进程执行
- 示例
- 考虑下述进程
进程 | 执行时间 | 周期 |
---|---|---|
P1 | 1 | 3 |
P2 | 1 | 4 |
P3 | 2 | 5 |
- 进程周期的最小公倍数值为60,其利用率为: 1 / 3 + 1 / 4 + 2 / 5 = 0.98333 1/3+1/4+2/5=0.98333 1/3+1/4+2/5=0.98333
- 相应调度表如下:
模型化的假设的介绍
- 单一速率调度假定进程间不存在数据相关
- 示例:数据相关与调度
- 数据相关意味着一些特定进程组合永远不会出现
- 三个进程p1, p2 和p3,CPU执行时间分别是2,1,4,其任务图为
- 进程p1和p2不能同时运行
- 进程p3可以抢占p1或p2,但不能同时抢占p1和p2
- 必须从精确执行的角度来仔细分析零耗时上下文切换的影响,以保证理想调度策略的预估是足够准确的
- 示例:调度与上下文切换的开销
- 上下文切换的存在导致系统错过截止时限
- 考虑以下进程
- 若上下文切换时间为0,调度可以实现
- 若上下文切换时间为1,则需要: 2 ∗ ( 3 + 1 ) + ( 1 + 3 ) = 12 2*(3+1)+(1+3)=12 2∗(3+1)+(1+3)=12个时间单元,调度无法实现。
进程间通信机制
- OS提供一种机制使得进程间可以传递数据
- 进程间通讯的方式:
- 共享内存:共享一块内存,应避免消息的丢失和销毁
- 消息传递:沿通道发送消息
- 进程间发送消息有2种:
- 阻塞:发送消息,并等待响应;
- 非阻塞:允许进程连续发送消息
共享内存
- cpu上的软件知道共享单元的地址,并且共享单元也被装载到I/O设备的相应寄存器中。
- 弹性缓冲区作为共享内存
信息传递
- 消息传递通信补充内存共享模型
- 每一个通信实体都有自己的信息接收/发送单元。
- 通过网络发送消息
- 队列是消息传递的通用形式
信号
- 只发送信号,不传递数据
- 类似于中断,
- 改变控制流,但不传递参数
- 可以允许有几个类型的信号
实时操作系统的性能评估
- 在调度策略分析时,有下列假设
- 上下文切换时间为0;
- 中断不干涉调度;
- 进程执行时间是已知、固定的
- 进程的执行时间并不相互影响
- 上下文切换时间
- 非零的上下文切换时间对一个紧调度是有限制的
- 很难计算其影响,因为它依赖于上下文的顺序
- 在实践中,上下文切换开销是很小的,大约是几百个时钟周期,相对于许多一般的周期性任务,是 m s ms ms 与 μ s \mu s μs 的关系
- 中断延迟
- 当中断未被响应,数据可能被丢失。
- 影响中断延迟的因素
- 处理器中断延迟;
- 中断处理程序的执行时间;
- RTOS调度的延迟。
- 在关键代码中的中断延迟
- 关键代码(原子操作)中,中断被关闭
- 长的原子操作将增加软件延迟而导致中断延迟
- 通用操作系统可能有长的原子操作
- 中断处理
- 中断服务程序(ISH)
- 执行设备所需最少的操作
- 中断服务例程(ISR)
- 被ISH调用,完成绝大部分设备的处理
- 中断服务程序(ISH)
- 高速缓存上的调度效果
- 考虑一个包含如下三个进程的系统:
进程 | 最坏情况下CPU时间 | 平均CPU时间 |
---|---|---|
P1 | 8 | 6 |
P2 | 4 | 3 |
P3 | 4 | 3 |
- 每一个进程都使用cache的一半,因此在cache中只能同时存在两个进程
- 调度方法一:采用LRU(最近最少使用)替换方法,cache没有预留
- 在第一次迭代中,必须填满cache,在随后的迭代中,三个进程之间的竞争使得
没有一个进程可以从执行开始就一直待在cache中
,最终不得不使用最坏情况下的执行时间 - 调度方法二:将cache一半预留给p1,其余的给p2和p3
- 这种情况下,P2和P3存在竞争,而P1是就绪的,在第一次迭代之后可以对P1使用平均执行时间,也使得我们获得了一些空闲CPU时间用于执行其他操作