Chinaunix首页 | 论坛 | 博客
  • 博客访问: 278205
  • 博文数量: 54
  • 博客积分: 2756
  • 博客等级: 少校
  • 技术积分: 677
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-16 22:51
文章分类

全部博文(54)

文章存档

2011年(30)

2010年(22)

2009年(2)

我的朋友

分类:

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()或是将OSIntNesting1;

    调用OSTimeTick();

 

    调用OSIntExit();

    恢复处理器寄存器的值;

    执行中断返回指令;

}

阅读(2076) | 评论(0) | 转发(0) |
0

上一篇:BootLoader原理

下一篇:柯达--面试

给主人留下些什么吧!~~