1. 有两种类型的实时系统:软实时系统和硬实时系统。在软实时系统中系统的宗旨是使各个任务运行得越快越好,并不要求限定某一任务必须在多长时间内完成。在硬实时系统中,各任务不仅要执行无误而且要做到准时。
2. 前后台系统: 应用程序是一个无限的循环,循环中调用相应的函数完成相应的操作,这部分可以看成后台行为(background)。中断服务程序处理异步事件,这部分可以看成前台行为(foreground)。后台也可以叫做任务级。前台也叫中断级。
3. 可重入型函数: 可重入型函数可以被一个以上的任务调用,而不必担心数据的破坏。可重入型函数任何时候都可以被中断,一段时间以后又可以运行,而相应数据不会丢失。可重入型函数或者只使用局部变量,即变量保存在CPU寄存器中或堆栈中。如果使用全局变量,则要对全局变量予以保护。以下技术之一即可使不可重入函数具有可重入性:
l 把变量定义为局部变量
l 调用函数之前关中断,调动后再开中断
l 用信号量禁止该函数在使用过程中被再次调用
4. 优先级反转: 应用程序执行过程中,任务的优先级是可变的,则称之为动态优先级。实时内核应当避免出现优先级反转问题。为防止发生优先级反转,内核能自动变换任务的优先级,这叫做优先级继承(Priority inheritance)
5. 互斥条件:实现任务间通讯最简便到办法是使用共享数据结构。特别是当所有到任务都在一个单一地址空间下,能使用全程变量、指针、缓冲区、链表、循环缓冲区等,使用共享数据结构通讯就更为容易。虽然共享数据区法简化了任务间的信息交换,但是必须保证每个任务在处理共享数据时的排它性,以避免竞争和数据的破坏。与共享资源打交道时,使之满足互斥条件最一般的方法有:
l 关中断(μC/OS-Ⅱ在处理内部变量和数据结构时就是使用的这种手段)
l 使用测试并置位指令
l 禁止做任务切换
l 利用信号量
6. 信号量:信号量用于:
l 控制共享资源的使用权(满足互斥条件)
l 标志某事件的发生
l 使两个任务的行为同步
对信号量只能实施三种操作:
l 初始化(INITIALIZE),也可称作建立(CREATE);
l 等信号(WAIT)也可称作挂起(PEND);
l 给信号(SIGNAL)或发信号(POST)。
这是我自己写的验证信号量的部分代码:
void task_one(void* pdata); |
void task_two(void* pdata); |
|
OS_EVENT *tasktwo; |
#include "includes.h" |
|
GUI_Init(); |
VCInit(); //初始化一些变量 |
OSInit(); |
timeSetEvent(OS_TICKS_PER_SEC, 0, OSTickISR, 0, TIME_PERIODIC); //产生节拍 |
tasktwo = OSSemCreate(0); |
|
OSTaskCreate(task_two, 0, &TaskStk[7][TASK_STK_SIZE-1], 1); |
OSTaskCreate(task_one, 0, &TaskStk[8][TASK_STK_SIZE-1], 2); |
|
OSStart(); |
|
7. 使用实时内核的优缺点: 实时内核也称为实时操作系统或RTOS。它的使用使得实时应用程序的设计和扩展变得容易,不需要大的改动就可以增加新的功能。通过将应用程序分割成若干独立的任务,RTOS使得应用程序的设计过程大为减化。使用可剥夺性内核时,所有时间要求苛刻的事件都得到了尽可能快捷、有效的处理。通过有效的服务,如信号量、邮箱、队列、延时、超时等,RTOS使得资源得到更好的利用。如果应用项目对额外的需求可以承受,应该考虑使用实时内核。这些额外的需求是:内核的价格,额外的ROM/RAM开销,2到4百分点的CPU额外负荷。