嵌入式 - 实时操作系统导论
实时操作系统real-time-operating-system
任务和任务状态
概念
任务
所谓任务,是指在一个RTOS中所写的软件的基本构造块,也就是通常所说的子程序。
有关任务是如何调用、它与ROTS是如何配合工作的等问题稍后再讨论。
任务状态
在RTOS中一个任务总是处在下列三种状态之一:
1)运行 —— 表示微处理器正在执行组成这个任务的指令。
2)就绪 —— 表示其它的任务在运行,一旦微处理器处空闲状态,这个任务就能够运行。
3)阻塞 —— 表示任务目前还没有获得运行所需的资源,即使微处理器空闲也不能运行。
至于暂停、挂起、等待、睡眠和延迟等状态,前面所描述的就绪和阻塞状态的不同子范畴。
调度
ROTS的调度程序记录每个任务的状态,决定哪一个任务可以进入运行状态。其方法是通过查看分配给任务的优先级和没有处于阻塞状态的任务,决定拥有最高优先级的任务先运行,剩下的任务则在就绪状态中等待。
调度程序不会自行改变优先级,这就可能使得低优先级的任务长时间地等待,这是不合理的。
任务和数据
从图中可以看出:私有数据对于其它任务是不可用的。而共享数据可以通过共享变量很容易地将数据从一个任务转移到另一个任务。具体实现方法有两个
可重入性
什么是可重入函数?
可重入函数是指能够被多个任务调用的函数,即使 RTOS 在一个任务执行这个函数的期间进行了任务的切换,这个函数也能正确地运行。
可重入函数的判断规则
(1)一个可重入的函数一般用原子的方法使用变量,除非这些变量存储在调用这个函数的堆栈中或这些变量是任务的私有变量;
(2)一个可重入函数一般不调用其它的不可重入的函数;
(3)一个可重入函数一般不用非原子的方法使用硬件。
信号量和共享数据
实时操作系统信号量
二元信号量工作方式:
任务可以调用两个 RTOS 的函数 TakeSemaphore 和 ReleaseSemaphore,在某一时刻只能有一个任务拥有信号量。
可重入性和信号量
可以利用信号量使不可重入的函数变为可重入的函数。
多个信号量
大多数 RTOS 都允许拥有多个信号量,但要求每个调用都必须指明操作的是哪一个信号量。
信号量作为信号设备
信号量的另一个用途:作为任务或中断程序和另一个任务之间进行简单通信。
使用信号量的易出现问题
信号量并不是解决所有共享数据问题的最好方法,因为信号量使用次数越少,系统可能运行的越好。特别要注意的是信号量必须正确地使用,而对于一个初学者,往往容易出现以下错误:
忘记获取信号量
忘记释放信号量
获取了错误的信号量
持有信号量太长
引起死锁
信号量变量
计数信号量
资源信号量
互斥信号量