分类:
2010-01-06 09:35:57
μC/OS需要用户提供周期性信号源,用于实现时间延时和确认超时。节拍率应在每秒10次到100次之间,或者说10到100Hz。时钟节拍率越高,系统的额外负荷就越重。时钟节拍的实际频率取决于用户应用程序的精度。时钟节拍源可以是专门的硬件定时器,也可以是来自50/60Hz交流电源的信号。
用户必须在多任务系统启动以后再开启时钟节拍器,也就是在调用OSStart()之后。换句话说,在调用OSStart()之后做的第一件事是初始化定时器中断。通常,容易犯的错误是将允许时钟节拍器中断放在系统初始化函数OSInit()之后,在调启动多任务系统启动函数OSStart()之前,如程序清单L3.19所示。
程序清单 L3.19 启动时钟就节拍器的不正确做法. |
void main(void) |
{ |
. |
. |
OSInit(); /* 初始化uC/OS-II */ |
. |
. |
/* 应用程序初始化代码 ... */ |
/* ... 通过调用OSTaskCreate()创建至少一个任务 */ |
. |
. |
允许时钟节拍(TICKER)中断; /* 千万不要在这里允许时钟节拍中断!!! */ |
. |
. |
OSStart(); /* 开始多任务调度 */ |
} |
这里潜在地危险是,时钟节拍中断有可能在μC/OS-Ⅱ启动第一个任务之前发生,此时μC/OS-Ⅱ是处在一种不确定的状态之中,用户应用程序有可能会崩溃。
μC/OS-Ⅱ中的时钟节拍服务是通过在中断服务子程序中调用OSTimeTick()实现的。时钟节拍中断服从所有前面章节中描述的规则。时钟节拍中断服务子程序的示意代码如程序清单L3.20所示。这段代码必须用汇编语言编写,因为在C语言里不能直接处理CPU的寄存器。
程序清单 L3.20 时钟节拍中断服务子程序的示意代码 |
void OSTickISR(void) |
{ |
保存处理器寄存器的值; |
调用OSIntEnter()或是将OSIntNesting加1; |
调用OSTimeTick(); |
|
调用OSIntExit(); |
恢复处理器寄存器的值; |
执行中断返回指令; |
} |