实时系统概念

任务优先级分配

给任务定(分配)优先级不是件简单的事,因为实时系统相当复杂。许多系统中,并非所有的任务都至关重要。

实时系统大多结合了软实时和硬实时2种需求。

软实时系统只是要求任务执行得尽量快,并不要求在某一特定时间内完成;

硬实时系统中,任务不但要执行无误,还要准时完成。


互斥条件

实现任务间通信最简便的办法是使用共享数据结果。

特别是当所有的任务都在一个单一地址空间下,这种处理特别简便。

虽然共享数据区法简化了任务间的信息交换,但是必须保证每个任务在处理共享数据时的排他性,以避免竞争和数据的破坏。

与共享资源打交道时,使之满足互斥条件最一般的方法有:

1、关中断

2、使用测试并置位指令

3、禁止做任务切换

4、利用信号量

01 关中断和开中断

处理共享数据时保证互斥,最简单快捷的方法就是关中断和开中断。

Disable interrupts;/*关中断*/

Access the resource(read /write from /to variables);/*读、写变量*/

Reenable interrupt ;/*开中断*/

uC/OS-II 在处理内部变量和数据结构时,使用的就是这种方法,即使不是全部,也是绝大部分过程都采用了这种方法。

02测试并置位操作

如果不使用实时内核,那么当2个任务共享一个资源时,须约定好,先测试一个全局变量,如果该变量为0,允许该任务与共享资源打交道。为防止另一个任务也要使用该资源,第一个得到资源的任务只需简单地将全程变量置为1,这通常称为测试并置位TAS(Test -and -Set)

利用测试并置位处理共享资源

Disable interrupts;/*关中断*/

if(‘Access Variable’ is 0)/*如果资源未占用,标志为0*/

Set variable to 1;/*置资源已占用,标志为1*/

Reenable interrupts;/*开中断*/

Access the resource;/*处理该资源*/

Disable interrupts;/*关中断*/

Set the 'Access Variable' back to 0;/*恢复资源为未占用,标志为0*/

Reenable interrupts;/*开中断*/

}else{

Reenable interrupts/*开中断*/

/*资源不可用,以后再试*/

}

03 禁止,然后允许任务切换

如果任务不与中断服务子程序共享变量或数据结构,可以使用“禁止,然后允许任务切换”操作。(也就是给调度器上锁和开锁)

04 信号量

信号量实际是一种约定机制,在多任务内核中普遍使用。

信号量用于:

1、控制共享资源的使用权(满足互斥条件)

2、标志某事件的发生

3、使2个任务的行为同步

信号量就像是一把钥匙,任务要运行下去,需拿到这把钥匙。如果信号量已被别的任务占用,那么该任务只得被挂起,直到信号量被当前使用者释放。换句话说,申请信号量的任务是在说:“把钥匙给我。如果谁正在使用,我只好等!”

一般地说,对信号量只能实施3种操作:初始化,也可称作建立;等信号,也可称作挂起;给信号或发信号。

信号量初始化时,要给信号量赋初值,等信号量的任务表应清为空。

收到信号量的任务可能是以下两者之一:

1、等待信号量任务中优先级最高的

2、最早可是等待信号量的任务,即按先进先出FIFO原则。

uC/OS-II 只支持优先级法

你可能感兴趣的:(uCOS-II,实时系统概念)