上下文切换
使CPU从一个正在执行的进程转向另一个进程的机制称为上下文切换(又称文境切换)。文境切换必须是没有任何缺陷的,并且文境切换在CPU内能非常迅速地执行。
文境切换的形式主要有两种:
是一个结构性计划,用于描述系统由哪些元素组成、元素之间如何相互适应、协同工作以完成系统的需求目标。
简单循环控制系统,一种最简单的嵌入式实时软件体系结构模型。系统功能由多个函数完成,这些函数被循环调用执行,即它们按照一定的执行顺序构成一定单向的有序环,一次占用CPU,每个函数访问完成后,才将CPU移交给下一个函数使用
前后台系统又称中断驱动系统
前台中断后台轮询:后台,任务按照轮询方式访问CPU;前台,当有实时任务到达时首先提出中断,然后将任务转交给后台
前后台系统与多任务系统存在本质差异:
前后台系统中,中断事务由外部事件触发,多任务系统中任务是通过某种任务调度策略与机制来调度执行的,不直接由事件触发调度
前后台系统应用:计算机与单用户交互、实时I/O设备控制
不适合的场景:
1、高速信号处理,用轮询方式好
2、多设备或多用户请求CPU服务,应采用多任务系统
衡量前后台系统性能的一个重要指标是响应时间
中断延迟时间产生的主要原因:
1、同步信号
2、数据交互(互斥)
由多个CPU协同工作的系统。
与多任务系统的区别:
在单处理器系统中,多个任务在宏观上是并发的,在微观上是顺序执行的。
在多处理器系统中,多个任务是并行运行在不同的微处理器中的,在宏观上是并发的,微观上也是并发的。
所以,前者是伪并发,后者是真并发
多处理器系统的分类:
又称优先级反转,用信号量来控制资源共享和互斥,会出现高优先级任务被低优先级任务阻塞,并等待低优先级任务执行的现象。这种现象也会由于中断的使用而产生。
由于任务间资源共享,信号量及中断的引入,往往会导致高优先级任务被低优先级任务长时间阻塞(pend)或阻塞一段不确定时间的现象,即所谓的优先级反转(Priority Inversion)。优先级反转会造成任务调度的不确定性,严重时可能导致系统崩溃。
假设有两个任务分别为T1、T2:
(1)T1的优先级高于T2的优先级
(2)临界资源S为T1和T2的共享资源
(3)T2先执行,并占用资源S。若T1到达,则按优先级调度约定将抢占CPU,一直执行直到请求到临界资源S,由于T2没有放弃临界资源S,造成T1请求S失败,导致死锁产生,如下图所示
如图,假设3个任务task1、task2、task3的优先级分别为P1、P2、P3,且P1 > P2 > P3。假定task1、task2和task3通过互斥信号量mutex共享一个数据结构,并且在时刻T0,task3获得mutex,开始执行临界区代码;
在时刻T1,task3申请成功mutex并开始执行临界区代码;
在时刻T2,task1已经处于就绪状态,由于P1 > P3,抢占task3而获得MCU资源开始执行,并在时刻T3试图访问共享数据,但共享数据已被task3通过mutex加锁。task1申请mutex失败而处于等待状态;此刻,task3重新获得MCU继续执行。
在时刻T4,task2就绪,由于P2>P3,task2抢占MCU开始执行,task3处于等待状态,表现为较低优先级任务task2先于较高优先级任务task1执行。
在时刻T5,task2申请mutex失败而阻塞,task3获得MCU继续执行。
在时刻T6,tsak3退出临界区后释放mutex,具有最高优先级的task1才获得mutex而执行临界区代码。
在时刻T7,tsak1执行完毕并释放资源。task2开始执行临界区代码。在此过程中,如果具有多个类似P2的中等优先级的任务就绪,task1被延迟执行的时间将是无法确定的,极有可能超过其截止时间。例如,控制执行器的信息如果没有成功地传送到或超过时延限制,则可能使系统性能恶化或使系统不稳定,甚至造成事故。这就是优先级反转问题
解决优先级反转问题的常用协议有优先级继承协议(Priority Inheritance Protocol)和优先级天花板协议(Priority Ceiling Protocol)。
优先级继承协议的基本思想是:当一个任务阻塞了一个或多个高优先级任务时,该任务将不使用其原来的优先级,而使用被该任务所阻塞的所有任务的最高优先级作为其执行临界区的优先级。当该任务退出临界区时,又恢复到其最初的优先级。
例如,当任务T获得了MCU资源后首先以初始分配的优先级开始执行,在T进入其临界区Z之前,申请控制该资源的信号量S。若S已被其他任务上锁,则任务T在S上阻塞而挂起等待;否则,执行pend加1操作,进入临界区Z中执行,退出Z时,执行post减1操作。
如果T申请到了S资源并进入临界区Z,此时,如果有更多高优先级任务申请S,由于S已被任务T上锁,高优先级任务将被阻塞,而任务T将继承被其阻塞的高优先级任务中优先级最高的任务的优先级继续在临界区Z中执行,直到退出Z之后,释放S,同时恢复其初始优先级,并唤醒被其阻塞的具有最高优先级的任务。在此情况下,优先级反转的问题得以缓解;更重要的是,高优先级任务被延迟的时间可以确定,从而控制任务的执行时间,提高系统的稳定性和可靠性。
优先级继承协议的不足之处在于如果中间优先级任务比较多,优先级继承协议可能多次改变占有某临界资源的任务的优先级,会引起更多的额外开销,导致任务执行临界区的时间增加(即一个高优先级任务所需多个临界资源分别被不同的低优先级任务占有,则阻塞可能相当长)。
此外,当有多个临界资源被需要时,优先级继承协议还会引起死锁。因此,从程序执行的效率方面考虑,优先级继承协议的效率比较低。
由于优先级继承协议会产生死锁和阻塞链,因此使用优先级天花板协议的目的在于解决优先级继承协议中存在的死锁和阻塞链问题。
优先级天花板协议是指系统把每一个共享资源与一个天花板优先级相联系。任意资源的天花板优先级是所有请求该资源的任务的最高优先级。当一个任务获得了信号量而进入临界区执行时,系统便把这个天花板优先级传递给这个任务,使这个任务的优先级最高。当这个任务退出临界区后,系统立即把它的优先级恢复正常,从而保证系统不会出现优先级反转的情况。
优先级天花板协议的缺点是一旦任务获得某临界资源,其优先级就被提升到可能的最高程度,而不管此后在它使用该资源的时间里是否真的有高优先级任务申请该资源。这样就有可能影响某些中间优先级任务的完成时间。因此,在对任务执行流程的干扰方面,优先级天花板协议的破坏力比较大。
对比两种协议:
在Internet/Intranet中使用流式传输技术的连续时基媒体(时基媒体是指与绝对时间或时间顺序密切相关的媒体,如音频、视频、多媒体文件)在播放前并不下载整个文件,只将开始部分内容存入内存,其他的数据流随时传送随时播放,只是在开始播放有延迟。
流式传输的实现需要缓存。因为Internet以包传输为基础进行断续的异步传输,对一个实时A/V源或存储的A/V文件,在传输中它们要被分解为许多包,由于网络是动态变化的,各个包选择的路由可能不尽相同,故到达客户端的时间延迟也就不等,甚至先发的数据包还有可能后到。为此,使用缓存系统来弥补延迟和抖动的影响,并保证数据包的顺序正确,从而使媒体数据能连续输出,而不会因为网络暂时拥塞使播放出现停顿。
流式传输的实现需要合适的传输协议。由于TCP需要较多的开销,故不太适合传输实时数据。在流式传输的实现方案中,一般采用RTCP/TCP来传输控制信息,而用RTP/UDP来传输实时声音数据。
在系统运行过程中动态调整功率可管理部件(Power Manageable Component,PMC)工作状态,以优化部件空闲时间功耗的一种功耗管理技术。
按照采用的控制策略不同,DPM可分为:
动态电压调整,系统运行时可以通过设置可编程频率寄存器控制微处理器的工作频率。
利用DVS技术,在系统负荷较高时将微处理器设置为最高执行速度,保证系统计算能力;
在系统负荷较轻时动态降低微处理器的工作频率,降低微处理器的执行功耗。
动态频率调整(Dynamic Frequency Scaling,DFS)是指微处理器的时钟频率可在运行时动态调整的技术,DFS与DVS统称DVS
BSP是嵌入式系统的基础部分,也是实现系统可移植性的关键。它负责上电时硬件初始化、启动RTOS或应用程序模块、提供底层硬件驱动,为上层软件提供访问底层硬件的手段
驱动程序概念:
是连接操作系统内核和硬件设备的桥梁,屏蔽了硬件的细节,在应用程序看来硬件设备只是一个特殊的文件。
驱动程序的基本功能:
操作系统引导概念:将操作系统装入内存并开始执行的过程
在嵌入式系统的应用过程中,针对不同的应用环境,对时间效率和空间效率有不同的要求。时间限制主要包括:系统要求快速启动和系统启动后程序高速执行;空间效率主要包括:Flash等非易失性存储空间的限制和RAM等易失性空间有限
需要Boot Loader的引导模式:RAM空间有一定限制
不需要Boot Loader的引导模式:对于时间效率要求较高的系统,通常要求系统能快速启动
简单地说,Bootloader就是在操作系统内核运行之前运行的一段小程序,相当于PC机主板上的BIOS,是最底层的引导软件。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。
Bootloader(引导加载程序)是系统加电后运行的第一段代码。一般它只在系统启动时运行非常短的时间,但对于嵌入式系统来说,这是一个非常重要的系统组成部分。当我们使用单片机或者像μC/OS这样的操作系统时,一般只需要在初始化CPU和其他硬件设备后,直接加载程序即可,不需要单独构建一个引导加载程序。但构建或移植一个Bootloader,从某种意义上来说,对所有的Linux系统都是一个必不可少的任务。
一般情况下,计算机操作系统的启动都需要一个引导加载程序。其主要的原因在于现在计算机系统多采用“易失性”的半导体存储器作为内存,如PC系统中采用的EDO DRAM,SDRAM,DDR SDRAM等,一旦断电,内存中的操作系统映像就消失了,因此只能将操作系统存储在非易失性的存储介质上,在系统加电的时候才能将其中的操作系统映像装入内存中运行。
通常,Bootloader是严重地依赖于硬件而实现的,特别是在嵌入式系统中。因此,在嵌入式世界里建立一个通用的Bootloader几乎是不可能的。尽管如此,仍然可以对Bootloader归纳出一些通用的概念来,以指导用户特定的Bootloader设计与实现: