微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 关于ucos中os_tmr.c中的代码分析

关于ucos中os_tmr.c中的代码分析

时间:11-24 来源:互联网 点击:

信号量
九、从定时器池中得到一个结构体。在建构函数中用
static OS_TMR *OSTmr_Alloc (void);
十、释放定时器,中删除函数中用
static void OSTmr_Free (OS_TMR *ptmr)
十一、OSTmr_Init(void),在OSInit()中用。
十二、static void OSTmr_InitTask (void)在OSTmr_Init中使用。用来建立一个任务OSTmr_Task()
十三、OSTmr_Task()这个是调度你建立的定时器用的,一但定时时间到就调用回调函数。
我们建立的定时器都进入定时器轮盘里OSTmrWheelTbl[],
十四、static void OSTmr_Link (OS_TMR *ptmr, //OSTmrState = OS_TMR_STATE_RUNNING
INT8U type)
Ptmr->OSTmrMatch的确定方法
if (type == OS_TMR_LINK_PERIODIC) {
ptmr->OSTmrMatch = ptmr->OSTmrPeriod + OSTmrTime;
} else {
if (ptmr->OSTmrDly == 0) {
ptmr->OSTmrMatch = ptmr->OSTmrPeriod + OSTmrTime;
} else {
ptmr->OSTmrMatch = ptmr->OSTmrDly + OSTmrTime;
}
}
挂载定时器时spoke = (INT16U)(ptmr->OSTmrMatch % OS_TMR_CFG_WHEEL_SIZE);
pspoke = &OSTmrWheelTbl[spoke];这样确定的置位,当OSTmrTime加到和OSTmrMatch相等时一定会来以这个spoke为下标的数组里找该定时器。至于定义一个OSTmrWheelTbl[]而不是把你所有建立的定时器串成一串是怕一起处理浪费时间吧,这样可以一次少处理几个定时器。
我想看了OSTmr_Task (void *p_arg)这个函数的人可能会好奇为什么用那种方法挂载定时器,当定时时间到了时会找到OSTmrWheelTbl[]正确的下标,并在那个OSTmrWheelTbl[ok]里找到该定时器吧。其实你可以算一下,定义OS_TMR_CFG_WHEEL_SIZE=8,然后在OSTmrTime=6时建立一个定时器(假如定时器只工作一次),OSTmrDly=12,那个这个定时器会挂到OSTmrWheelTbl[2]中,当OSTmrTime加到18时它就会去
OSTmrWheelTbl[2]找该定时器。
十五、static void OSTmr_Unlink (OS_TMR *ptmr)释放定时器结构体用它把该定时器从定时器轮中卸下。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top