00_实时系统的概念

实时系统分为软实时和硬实时,前者任务尽可能快执行但非严格时间限制,后者则需严格按时完成。系统常采用前后台结构,中断服务例程处理异步事件。多任务通过调度器管理,上下文切换在任务间进行。非抢占式内核中,高优先级任务需等待低优先级任务释放CPU,适合对中断延迟要求高的场景,但可能导致响应时间不确定。

实时系统的特点是,如果不能满足系统的逻辑和时间正确属性,就会导致严重的后果。

有2种类型的实时系统:软实时,硬实时。

软实时系统种,任务尽可能快地被系统执行,但不必在确定地时间执行完毕。

硬实时系统中,任务必须正确并且确定时间内被完成。

大多数实时系统都是软实时和硬实时的结合体。

前后台系统

低复杂性的小系统通常被设计成下图所示的结构,这种系统被叫做前后台系统或超级大循环结构。

 应用程序是一个无限循环,里面顺序执行相应的模块对应的函数,这被叫做后台。

中断服务例程处理异步事件(叫做前台)。

前台叫做中断级,后台叫做任务级。关键的操作必须被中断服务例程处理,这样可以确保被及时处理。因此中断有一种更需要被长时间执行的趋势,对于中断后面的后台处理程序会被不及时处理。

这就叫任务级响应,最坏的情况下,任务级响应时间取决于后台循环所需要的时间。

因为执行的代码的时间是不确定的,所以循环的时间也是不确定的,如果更改了代码那么大循环的时间也会受到影响。

临界区代码(Critical section of code)

一旦临界区代码在执行,它一定不能被中断打乱,为了确保这样,在临界区代码执行前需要关中断,在临界区代码执行快完毕的时候又要使能中断。

资源(Resource)

资源是被任务使用的实体,资源可能是,I/O设备,比如打印机、键盘、显示器或者一个变量、一个结构体或者一个数组。

共享资源(Shared Resource)

共享资源是可以被多个任务使用的一种资源。每个任务都排他性的访问共享资源来防止资源被破环,这种属性叫做互斥。

多任务(Multitasking)

多任务是处理器在调度器的调度下,在多个任务之间进行切换。

多任务有点像有多个后台的前后台系统,可以最大程度地榨干处理器地处理性能,同时也提供了一种对应用程序的模块化构建。如果使用多任务处理,应用程序通常更容易设计和维护。

任务(Task)

任务,也称为线程,是一个简单的程序,傻傻地认为自己完全拥有CPU。

实时应用程序地设计过程中,需要把完成地工作分解为完成相应功能地任务。

每个任务都有一个优先级,它自己地CPU寄存器和自己地堆栈区域。

每个任务都是一个无限大循环,任务处于5个状态变化中:

DORMANT: 休眠状态的任务驻留在内存中,但还没有被多任务的内核使用;

READY: 就绪任务是任务可以被执行,但其任务的优先级小于当前被执行任务的优先级;

RUNNING: 当前正在执行的任务(控制着CPU的使用);

WAITING: 等待状态,该任务在等待事件的发生(比如IO操作的完成),共享资源的可以获得,时序脉冲的发生或者定时时间的带来等;

ISR: 任务处于中断发生的中断服务例程中;

多任务切换的示意图如下:

任务状态切换如下图:

上下文切换(Context Switch or Task Switch)

当多任务内核决定执行一个新的任务时,内核会简单地保存当前任务的上下文(CPU寄存器)到当前任务的栈中。一旦要恢复执行上个任务,就会把任务的帧中保存的上下文恢复到CPU寄存器中;然后执行这个任务。这个过程就叫做上下文切换或任务切换。

主要就2个部分:上下文保存到栈中,从栈中恢复到CPU寄存器中。

内核(kernel)

多任务系统的内核负责管理任务(分配CPU的时间),负责任务之间的通信。

内核的基础服务就是任务之间的上下文切换。

实时内核简化了系统设计,允许应用程序分解成多个任务,任务的管理就是内核负责的。

一个好的应用程序的设计,内核只占2%到5%的CPU时间。

因为内核本身也是软件,添加到应用程序中,也是需要代码空间和内核数据结构的内存空间的。

每个任务还有它自己的栈空间,有一种趋势,吃内存越来越快。

调度器(Scheduler)

调度器也叫任务分发器,负责决定运行哪个任务,目前大多数的实时内核都是基于优先级来进行任务调度的。

非抢占式内核(Non-Preemptive Kernel)

非抢占式内核每个任务执行时需要,显示地放弃CPU地控制权,这样才能释放CPU。

为了实现并发性地场景,这些任务需要快速执行。

非抢占式内核的调度也称为协作多任务处理;任务相互协作,共享CPU。异步事件仍然由isr处理。ISR可以使更高优先级的任务准备好运行,但是ISR总是返回到被中断的任务。只有当当前任务放弃CPU时,新的更高优先级的任务才会获得对CPU的控制。

这种内核的优势之一,便是中断延迟很低。在任务级,非抢占式内核,可以使用非重入函数。

非重入函数可以被每个任务使用,不用担心数据被破坏。因为每个任务都会在任务函数中执行完毕,直到主动放弃CPU。

非抢占式内核的执行配置文件如下图所示,并在下面进行了描述。

 (1) A task is executing but gets interrupted.

 (2) If interrupts are enabled, the CPU vectors (jumps) to the ISR.

 (3) The ISR handles the event F2.4(3) and makes a higher priority task ready to run.
 (4) Upon completion of the ISR, a Return From Interrupt instruction is executed, and the
      CPU returns to the interrupted task

 (5) The task code resumes at the instruction following the interrupted instruction.

 (6) When the task code completes, it calls a service provided by the kernel to relinquish the
      CPU to another task.
(7) The kernel sees that a higher priority task has been made ready-to-run (it doesn’t
      necessarily knows that it was from an ISR nor does it care) and thus, the kernel performs
      a context switch so that it can run (i.e. execute) the higher priority task to handle the
      event signaled by the ISR.
非抢占式内核最大的缺点是,高优先级的任务可能要等低优先级的任务主动放弃CPU,才能获得CPU,这个等待的时间具有不确定性,取决于应用程序什么时候放弃CPU。
总结:非抢占式内核的任务一直运行,直到自己主动释放CPU。中断抢占任务,直到中断函数完成,返回被抢占的任务函数。
任务级的响应由于前后台系统但时间依然是不确定的,很少有商业内核使用非抢占式内核。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值