Ucosiii中hello world中的定时器(二)

2015-06-15 20:39 阅读 423 次 评论 0 条

在上一日志中,明白了ucosiii中hello world中定时任务是如何产生的?但在定义了定时器之后,在OSTimeDlyHMSM函数中调用OSSched切换任务,使最低优先级的OS_IdleTask任务可以执行,那么程序又是如何从OS_IdleTask返回到MainTask任务中,执行10s的周期任务的呢?

首先定义了private timer的中断,中断id为29,可以在ucos_int_impl.c文件中设置断点,当定时器中断响应时,会跳转到这里,如下图所示。

zynq中ucos中断函数调用过程

这里的中断服务函数也是BSP中定义好的UCOS_TmrTickHandler,完成主要功能是给“ucos tick task”发送信号。

ucosiii的中定时器tick任务

后面就运行OS_TickTask任务,此任务中调用OS_TickListUpdateDly任务,更新定时器计时,当计时满后,计数变为0时,将MainTask设置为ready状态。为ready状态的任务可以并ucos恢复执行。

更新TCB中计数变量的值,并改变任务状态为ready

后面就可以恢复到MainTask任务运行。注意此时private timer仍然在运行,还是1ms产生一个中断。

在vivado SDK中跟踪BSP代码调试,比较费劲,因为BSP用02优化编译,所以有些代码已经不是原始的顺序执行的,而有些变量的值也不能直接查看了。加上遍地的宏条件预编译,而且sdk中分析的编译代码可能已经与实际编译的情况不同。只能耐心慢慢看。

版权声明:本文著作权归原作者所有,欢迎分享本文,谢谢支持!
转载请注明:Ucosiii中hello world中的定时器(二) | 起点博客
分类:应用笔记 标签:, , , , ,

发表评论


表情