嵌入式实时操作系统ucosii——实时系统概念

1、前/后台系统
后台行为:无限循环的应用程序,也可以叫做 任务级
前台行为:中断服务程序处理异步事件,也可以叫做 中断级


2、代码的临界段
临界区: 指处理时不可分割的代码(为了确保临界段代码的执行不被中断,在进入临界段之前必须关中断,而临界段代码执行完后,须马上打开中断)
3、资源
任何为任务所占用的实体都可称为资源。资源可以使输入、输出设备,也可以是一个变量、一个结构或一个数组
4、共享资源
可以被 一个以上的任务使用的资源叫做共享资源。为了防止数据被破坏,每个任务在与共享资源打交道时,必须独占该资源。
5、多任务
多任务运行的实现实际上靠CPU在需多任务之间 转换和调度。CPU只有一个,轮番服务于一系列任务中的某一个。

6、任务
一个任务,即一个线程,是一个简单的程序,该程序可以认为CPU完全只属于该程序自己,每个任务都被赋予一定的优先级, 有自己的一套CPU寄存器和栈空间
每个任务都是无线循环的,都可能处于以下5种状态之一
休眠态:任务驻留在内存中,但并不被多任务内核所调度
就绪态:任务已经准备好,可以运行,但因为优先级比正在运行任务的优先级低,暂时还不能运行
运行态:该任务掌握了CPU使用权,正在运行
挂起态(等待某一事件发生):任务正在等待,等待某一事件的发生(如中断,等待某共享资源的使用权,等待定时脉冲,等待超时信号,等等)
被中断态:发生中断,原来正在运行的任务暂时不能运行

7、任务切换
CPU寄存器内容切换。当多任务内核决定运行另外的任务时,它保存正在运行任务的当前状态,这些内容保存在任务的当前状况保护区(即任务自己的栈区之中),入栈工作完成后,将下一个要运行的任务重新装入CPU寄存器,开始任务的运行。
任务切换所欲要的时间取决于CPU有多少寄存器要入栈。
8、内核
内核(kernel)负责管理各个任务,为每个任务分配CPU时间,并且负责任务间的通信。实时内核允许将应用分成若干个任务,由实时内核来管理它们。
注:单片机一般不能运行实时内核,因为单片机的RAM很有限,通过提供必不可少的系统服务,诸如信号量管理、邮箱、信息队列及时间延时等,实时内核使得CPU的利用更为有效,用 实时内核做过系统设计以后,将绝不会再想回到以前的 前后台系统
9、调度
内核的主要职责之一:决定该轮到哪个任务运行了。多数实时内核是基于 优先级调度法(CPU总是让处于就绪态、优先级最高的任务先运行)
基于优先级的内核有2种类型: 不可剥夺型可剥夺型
10、不可剥夺型内核
不可剥夺型内核要求每个任务 主动放弃CPU的使用权。
中断服务可使一个高优先级的任务由挂起态转为就绪态,但中断服务以后,CPU的使用权还是回到原来被中断了的那个任务。
优点:响应中断快,允许使用不可重入函数,完全不用担心其他任务正在使用不可重入函数(不得有放弃CPU使用权的企图),造成数据的破坏

11、可剥夺型内核
系统响应时间很重要时,须使用可剥夺型内核。最高级优先级任务一旦就绪,总能得到CPU的使用权
优点:响应时间最优化

12、可重入函数
可重入函数:可以被一个以上的任务调度,不用担心数据被破坏
不可重入函数:相反
13、时间片轮番调度法
当2个及以上任务有相同优先级时,内核运行1个任务运行实现确定的一段时间( 叫做时间额度),然后切换给另一个任务(这过程叫做 时间片轮番调度
条件:(1)当前任务已空闲;
(2)当前任务在时间片还没结束时已经完成;
(3)时间片结束;
14、任务优先级
每个任务都有其优先级。任务 越重要,赋予的优先级应 越高。就大多数内核而言,每个任务的优先级是 由用户决定的。
15、静态优先级
应用程序执行过程中诸任务 优先级不变
16、动态优先级
应用程序执行过程中,任务的 优先级是可变的。注:实时内核应当避免出现优先级反转问题
17、优先级反转
任务1优先级高于任务3,但任务3得到信号量,导致任务1无法得到信号量,所以任务1被挂起,任务2优先级高于任务3,所以得等任务2运行完,运行任务3,等任务3释放信号量,最后才能运行任务1.

解决办法:将当任务3的优先级提升到跟任务1优先级相同,以避免出现优先级反转现象

18、任务优先级分配
单调执行率调度法(RMS),用于分配任务优先级
假设:
(1)所有任务都是周期性的;
(2)任务间不需要同步,没有共享资源,没有任务间数据交换等问题;
(3)CPU必须总是执行优先级最高且处于就绪态的任务(使用可剥夺型调度法)
19、互斥条件
实现任务间通信最简单的办法是使用共享数据结构,虽然共享数据区法简化了任务间的信息交换,但是必须保证每个任务在处理共享数据时的排他性,以避免竞争和数据的破坏,与共享资源打交道时,使之满足互斥条件一般方法有:
(1)关中断和开中断
(2)测试并置位操作
(3)禁止,然后允许任务切换
(4)信号量
a.控制共享资源的使用权
b.标志某事件的发生
c.使2个任务的行为同步
20、死锁
抱死:指2个任务无限期地等待对方控制着的资源
最简单的解决办法,让每个任务都:
(1)先得到全部需要的资源,再做下一步的工作;
(2)用同样的顺序申请多个资源
(3)释放资源时,用相反的顺序
21、同步

利用信号量使某任务与中断服务同步(或者与另一个任务同步),某一事件的发生(这里的信号量不再是一把用来保证互斥条件的钥匙),用来实现同步机制的信号量初始化为0,信号量用与这种类型的同步,叫做 单向同步

2个任务可以用2个信号量同步他们的行为,这叫做 双向同步
22、事件标志
当某任务要与多个事件同步时,须用 事件标注(event flag)

若任务需要与任何事件之一发生同步,可称为 独立型同步

若任务也可以与若干事件都发生了同步,称之为 关联型同步
23、任务间通信
有时很需要任务间或中断服务与任务间的通信,这种信息传递称为 任务间的通信
途径有2个:通过全程变量,或发消息给另一个任务。
24、消息邮箱(先进先出)
通过内核服务可以给任务发送消息。消息邮箱也称交换消息。把一则消息(一个指针)放到邮箱里去,同样一个或多个通过内核服务,可以接收这则消息。

内核一般提供以下邮箱服务:
(1)邮箱内消息内容的初始化,邮箱里最初可以有,也可以没有消息
(2)将消息放入邮箱(POST)
(3)等待消息进入邮箱(PEND)
(4)从邮箱中得到消息。如果邮箱里没有消息,则任务并不被挂起;如果油箱内有消息,就接收这则消息
注:消息邮箱也可以当作只取2个值的信号量来用。邮箱里有消息,表示资源可以使用,而空邮箱表示资源已被其他任务占用。
25、消息队列(先进先出,ucosii也运行后进先出)
消息队列用于给任务发消息。消息队列实际上是邮箱陈列。通过内核提供的服务, 任务或中断服务子程序可以将一则消息放入消息队列。同样,一个或多个任务可以通过内核服务从消息队列中得到消息。

内核提供的消息队列服务如下:
(1)消息队列初始化,队列初始化时总是清为空
(2)放一则消息到队列中去(POST)
(3)等待一则消息的到来(PEND)
(4)如果队列中有消息,则任务可以得到消息,但如果此时队列为空,内核并不将该任务挂起。如果有消息,则消息从队列中取走。
26、中断
中断是一种硬件机制,用于通知CPU“有异步事件发生”,中断一旦被识别,CPU保存部分或全部现场,称为 中断服务子程序
中断服务子程序做事件处理,处理完成后,程序回到:
(1)在前/后台系统中,系统回到后台程序;
(2)对不可剥夺型内核而言,程序回到被中断了的任务
(3)对于可剥夺型内核而言,让进入就绪态的优先级最高的任务开始运行
优点:不比让微处理器连续不断地查询是否有事件发生

27、中断延迟
实时内核最重要的指标可能就是关中断的时间的长短。所有实时系统在进入临界区代码段之前,都要关中断;执行完临界代码之后,再开中断。
中断延迟 = 关中断的最长时间 + 开始执行中断服务子程序第1条指令的时间
28、中断响应
中断响应的定义:从中断发生到开始执行用户的中断服务子程序代码来处理这个中断的时间
对于前后台系统: 中断响应 = 中断延迟 + 保存CPU内部寄存器的时间
对于不可剥夺型内核: 中断响应 = 中断延迟 + 保存CPU内部寄存器的时间
对于可剥夺型内核; 中断响应 = 中断延迟 + 保存CPU内部寄存器的时间 + 内核进入中断服务函数的执行时间
29、中断恢复时间
(1)可剥夺型内核,中断恢复时间定义为:微处理器返回到被中断了的程序代码所需要的时间,或返回到更高级优先级任务的时间。
中断恢复时间 = 判断是否有优先级更高的任务进入了就绪态的时间 + 恢复优先级更高的任务的CPU内部寄存器的时间 + 执行中断返回指令的时间
(2)前后台系统中,中断恢复时间只包括恢复CPU内部寄存器值的时间和执行中断返回指令的时间
中断恢复时间 = 恢复CPU内部寄存器值的时间 + 执行中断返回指令的时间
(3)不可剥夺型内核,中断恢复时间与前后台系统一样
中断恢复时间 = 恢复CPU内部寄存器值的时间 + 执行中断返回指令的时间
30、中断延迟、响应及恢复





31、中断处理时间
中断服务子程序代码是应用程序中最重要的代码,则中断服务需要多长时间,就应该给它多长时间,然而大多书情况下,中断服务子程序应识别中断来源,从请求中断的设备取得数据或状态,并通知做该事件的任务。
此时该考虑, 通知的时间是否大于处理的时间。如果事件处理需要花的时间短于任务通知时间,就应该考虑在中断服务子程序中做事件处理,并在中断服务子程序中开中断,以允许优先级更高的中断打入并优先得到服务。
32、非屏蔽中断(NMI)
(1)绝大多数微处理器具有非屏蔽中断功能。通常非屏蔽中断留做紧急处理用, 非屏蔽中断可用于时间要求最苛刻的中断服务。
如何确定中断延迟时间、中断响应时间及中断恢复时间
中断延迟时间 = 指令执行时间中最长的时间 + 开始做非屏蔽中断服务的时间
中断响应时间 = 中断延迟时间 + 保存CPU寄存器的时间
中断恢复时间 = 恢复CPU寄存器的时间 + 执行中断返回指令的时间
(2)非屏蔽中断可以用增加外部电路的方法禁止

(3)非屏蔽中断产生普通可屏蔽中断

33、时钟节拍
34、对存储器的需求
前/后台系统:存储器容量的需求仅仅取决于应用程序代码
使用多任务内核: 总代码量 = 应用程序代码 + 内核代码
所有内核都需要额外的栈空间,以保证内部变量、数据结构及队列等的需求
(1)如果内核不支持单独的中断用栈,则总的RAM需求表达式
RAM总需求 = 应用程序的RAM需求 + (任务栈需求 + 最多中断嵌套栈需求)*任务数
(2)如果内核支持中断用栈分离,总RAM需求表达式
RAM总需求 = 应用程序的RAM需求 + 内核数据区的RAM需求 + 各任务栈需求之总和 + 最多中断嵌套栈需求
注:栈空间的分配和使用需要非常谨慎
a.定义函数和中断服务子程序中的局部变量,特别是定义大型数组和数据结构;
b.函数(子程序)的嵌套;
c.中断嵌套;
d.库函数需要的栈空间;
e.多变元的函数调用;
额外的代码空间取决于内核的大小,而RAM的用量取决于系统中的任务数
35、使用实时内核的优、缺点
实时内核(RTOS或者实时操作系统)使实时应用程序的设计和扩在容易
36、实时系统小结

猜你喜欢

转载自blog.csdn.net/weixin_37661634/article/details/80919395