木子剑
生命不熄,学习不止!

本来在搞哪个contiki-3.0\core\dev\button-sensor,这个按键传感器接口函数的,

但是里面出现了rtimer的应用。所以只能先跟rtimer干一架了,才能继续下去!!

CONTIKI OS操作系统,rtimer位置,core-->sys-->的抽象层接口函rtimer.h和rtimer.c。

低层的实现函数是rtimer-arch.c   rtimer-arch.h,要用户实现后才能使用rtimer相关功能的。

 至于什么是CONTIKI的rtimer?大哥 你自己去百度,这里就不介绍了。


RTIMER-arch.c大多 都明明白白了,只有俩个函数有点迷糊。

它们就是void rtimer_arch_schedule(rtimer_clock_t t)和rtimer中断服务

这个rtimer问题, 也困惑我几天了。可能我学识有限,换做其他人早就搞定了。。。

不管了,  先干起来再说吧!!

 

 

看网上查到的一些代码例程,主要是看看网友对rtimer的理解和用法:
http://bbs.eeworld.com.cn/thread-453318-1-1.html里面有些相关信息,如下
void rtimer_arch_schedule(rtimer_clock_t t)
{
PRINTF("rtimer_arch_schedule time %u\n", t);
CONF_TC_MODULE->COUNT32.CC[0].reg = t;
}

void rtimer_isr_hook(void)

{
ENERGEST_ON(ENERGEST_TYPE_IRQ);
rtimer_run_next();
if (process_nevents() > 0) {

/*

* 退出低功耗

* 如果之前进入了的话

*/
}
ENERGEST_OFF(ENERGEST_TYPE_IRQ);
}

 

 

 

https://www.cnblogs.com/liu13526825661/p/6135780.html里面有些相关信息,如下
void rtimer_arch_schedule(rtimer_clock_t t)
{
/* Sets the TIM2 Capture Compare1 Register value */
TIM_SetCompare1(RTIMER_TIM,t);
PRINTF("进入rtimer_arch_schedule\r\n");
PRINTF("%d\r\n",rtimer_arch_now());

/* MUST clear the remained flag of TIM2 compare */
TIM_ClearFlag(RTIMER_TIM,TIM_FLAG_CC1);

/* Enable interrupt of Capture compare 1 */
TIM_ITConfig(RTIMER_TIM,TIM_IT_CC1, ENABLE);

return;
}

void rtimer_irq_handler(void)
{
/* Clear interrupt pending bit */
TIM_ClearITPendingBit(RTIMER_TIM,TIM_IT_CC1);


/* Do interrupt only once! */
/*中断到来后需要将中断禁止,避免多次产生中断*/
rtimer_arch_disable_irq();

//ENERGEST_ON(ENERGEST_TYPE_IRQ);//开启了节能中断
rtimer_run_next();
//ENERGEST_OFF(ENERGEST_TYPE_IRQ);
return;
}

 

 


http://blog.sina.com.cn/s/blog_686ee2910102vxce.html里面有些相关信息
这个网址,对于rtimer_arch_schedule只是文字描述,也是无语了:

实现rtimer_arch_schedule函数
在此函数中,需要确定定时器的计数时间,同时使能定时器,并配置CCR1的值,开启定时器中断,等待中断调度
rtimer_arch_schedule函数实际在rtimer_set中被调用,当设置rtimer相关回调时配置,但是一次仅仅能够配置一个rtimer

对于rtimer也是文字描述,也是无语了:
中断调度处理
if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_CC1);
rtimer_arch_disable_irq();
rtimer_run_next();
}
中断到来后,需要将中断禁止,避免多次调用中断。 

 


好了,网上的查阅到资料太概就上面这些了。
其实他们之间都有异取同工之处,接下来让我们看看,CONTIKI 3.0官方自带的例程吧。这个比较有权威、说服力

位置contiki-3.0\cpu\stm32w108里有例程,关于void rtimer_arch_schedule(rtimer_clock_t t)和rtime用到的r定时器中断函数

void//为方便查看,我把printf打印去掉
rtimer_arch_schedule(rtimer_clock_t t)
{
   rtimer_clock_t now, clock_to_wait;
   (uint32_t)t);
 
   next_rtimer_time = t;
   now = rtimer_arch_now();
   clock_to_wait = t - now;

   if(clock_to_wait <= 0x10000) {
/* We must now set the Timer Compare Register. */
   TIM1_CCR1 = (uint16_t)now + (uint16_t)clock_to_wait;
   INT_TIM1FLAG = INT_TIMCC1IF;
   INT_TIM1CFG |= INT_TIMCC1IF; /* Compare 1 interrupt enable. */
}
/* else compare register will be set at overflow interrupt closer to  the rtimer event. */
}
 
 
void
halTimer1Isr(void)
{
   if(INT_TIM1FLAG & INT_TIMUIF) {
   rtimer_clock_t now, clock_to_wait;
/* Overflow event. */
 
   time_msb++;
   now = ((rtimer_clock_t) time_msb << 16) | TIM1_CNT;
   clock_to_wait = next_rtimer_time - now;

   if(clock_to_wait <= 0x10000 && clock_to_wait > 0) {
/* We must now set the Timer Compare Register. */
   TIM1_CCR1 = (uint16_t) clock_to_wait;
   INT_TIM1FLAG = INT_TIMCC1IF;
   INT_TIM1CFG |= INT_TIMCC1IF; /* Compare 1 interrupt enable. */
}
   INT_TIM1FLAG = INT_TIMUIF;
} else {
   if(INT_TIM1FLAG & INT_TIMCC1IF) {
/* Compare event. */
   INT_TIM1CFG &= ~INT_TIMCC1IF; /* Disable the next compare interrupt */
   ENERGEST_ON(ENERGEST_TYPE_IRQ);
   rtimer_run_next();
   ENERGEST_OFF(ENERGEST_TYPE_IRQ);
   INT_TIM1FLAG = INT_TIMCC1IF;
}
}
}
 
 
位置contiki-3.0\cpu\arm\stm32l152\rtimer-arch.c,关于void rtimer_arch_schedule(rtimer_clock_t t)和rtime用到的r定时器中断函数
void
rtimer_arch_schedule(rtimer_clock_t t)
{
     
}
竟然是空的,不知道什么原因?
 
 
 
/*---------------------------------------------------------------------------*/
volatile uint32_t rtimer_clock = 0uL;
/*---------------------------------------------------------------------------*/
st_lib_tim_handle_typedef htim2;
/*---------------------------------------------------------------------------*/
void
st_lib_tim2_irq_handler(void)
{
/* clear interrupt pending flag */
st_lib_hal_tim_clear_it(&htim2, TIM_IT_UPDATE);

rtimer_clock++;
}
只是简单的rtimer_clock++处理,这个是官方的,想不通了。
 
 
通过查看完网友发的例子,和CONTIKI官方例子,发现了什么没? 关键字眼rtimer_run_next()和CCR1  
其实我们要搞清楚俩个问题就OK了,
 
第一个就是rtimer_arch_schedule(rtimer_clock_t t)和rtimer中断服务,它们的目地是什么?
第二个就是它们是通过控制哪个寄存器值,来达到它们的目地?
 
今天就到这里了吧,rtimer之战,未完待继续。。。。

 

posted on 2019-07-18 18:57  木子剑  阅读(383)  评论(0编辑  收藏  举报