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

2015-06-11 20:29 阅读 439 次 评论 0 条

在vivado sdk中运行ucos的hello world工程,正常情况下会出现每10s循环执行的一次任务,如下图。

clip_image001

那么这个定时器任务是如何产生的呢?

在app.c中的main函数已经简化到之后只有一个函数UCOSStartup(MainTask);,在创建了StartupTask任务。第4个参数(void*)initial_func实际是从主函数传递的app.c中的voidMainTask (void *p_arg)函数指针。在StartupTask执行完一系列初始化工作后,通过函数指针调用MainTask,从而执行周期的输出任务。

创建主任务MianTask函数

static void StartupTask (void *p_arg)函数中,初始化了定时器。这个定时器采用的是arm核的private timer,这个定时器属于arm核本身,所以zynq中每核一个,不需要在vivado配置中额外的设置即可以使用。且与上日志中,vivado的中添加的两个timer没有关系。这个定时器的计数时钟频率为cpu时钟的1/2,本教程中为666666687/2,然后分频到1KHz,即1次计数时间为1ms。

MainTask中调用了OSTimeDlyHMSM定时延时,在配置好定时器间隔(10s)后,调用void OSSched (void)函数,该函数为任务调度函数,即这是将cpu空出来,让给其它任务执行。由于程序中没有其它任务,所以此时应该执行void OS_IdleTask (void *p_arg),通过设置断点,确实执行到了此函数中。

空闲任务OS_IdleTask执行过程

在OS_IdleTask中设置断点,程序停下来了,证明确实执行此函数了。

下一日志研究一下任务是如何从OS_IdleTask跳出到主任务中执行的

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

发表评论


表情