任务优先级分配
给任务定(分配)优先级不是件简单的事,因为实时系统相当复杂。许多系统中,并非所有的任务都至关重要。
实时系统大多结合了软实时和硬实时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 只支持优先级法