Contiki rtimer原理与移

[+]
  1. rtimer原理与移植
    1. 一rtimer用途
    2. 二数据结构
    3. 三rtimer中断时序
    4. 四rtimer移植

rtimer原理与移植

一.rtimer用途

Contiki系统引入rtimer可以满足精准定时的需要,一些对时间极为敏感的模块(如MAC协议)依赖于rtimer。和etimer的粗粒度(常见为100Hz)不同,rtimer是细粒度(常见为10kHz)定时器。根据经验,细粒度定时器如果中断频繁特别容易消耗CPU资源,为此contiki设计rtimer时尽可能地减少中断,大部分应用场合为读取定时器计数值。

二.数据结构

Rtimer的数据结构如图1所示,time赋值为下一次定时器超时中断的时刻点,func是定时器超时中断的回调函数,ptr是传递给回调函数的数据指针。

Contiki rtimer原理与移_第1张图片

1  rtimer数据结构

从图1发现,rtimer没有常见的next指针来挂接后续节点,确实,contiki为了减少rtimer中断的爆发只能挂接一个rtimer结构,如图2所示。如果同时挂接2个或以上的rtimer结构,那么最新挂接的有效,其它的rtimer结构将丢失,即图3的解释。

这种只能挂接1rtimer的机制使设计很简单,并且硬件定时器中断只在需要的时候才爆发,极大降低了CPU负荷。当然,它也带来一个限制,只能串行使用rtimer定时器的中断回调功能,即不具备排队功能

Contiki rtimer原理与移_第2张图片

2只能插入一个rtimer

Contiki rtimer原理与移_第3张图片

3挂接2rtimer时有1个丢失

三.rtimer中断时序

4展示了rtimer的中断时序,当调用rtimer_arch_schedule()时,它设置rtimer定时器的中断间隔时长timeout,中断服务程序rtimer_irq_handler会调用rtimer->callback()回调函数。

需要特别注意2点:中断只允许发生一次,即rtimer_arch_schedule()使能中断,而rtimer_irq_handler()禁止中断;rtimer->callback()是在中断状态下运行,特别注意防止竞态错误,例如,调用process_poll()合法,调用process_post()非法。

Contiki rtimer原理与移_第4张图片

4  rtimer中断时序

四.rtimer移植

有了上述rtimer的理论,再来移植rtimer就比较容易了,即,基于MCU实现rtimer-arch.crtimer-arch.h

需要特别注意,大多数定时器(尤其是8MCU)位宽为16位,即MAX=65535,而MAC协议往往需要1秒以上的定时周期,因此rtimer的频率必须小于30kHz。一个比较好的数值是10kHz,它既可以保证比较好的精度(间隔为100us),又具备6.5秒的满量程,这可以适应大多数的应用需要。

另外,大多数应用需要随机撤销和重启动rtimer,它可以通过添加2个函数来实现:rtimer_arch_disable_irq()rtimer_arch_enable_irq()

 


作者简介:

蒋俊,男,硕士研究生,现任长沙市锐米通信科技有限公司CEO。

从事通信研究与嵌入式开发10年,主攻微功率无线网络。

精通LoRa无线扩频通信,无线星型/树型/MESH网络设计;

通晓Contiki,Linux,uC/OS-II,OSAL等操作系统;

熟悉ARM,DSP,STM8,PIC,PC104等处理器;

擅长AD,RF等集成IC开发。

Web: www.rimelink.com

EMail: [email protected]

QQ群:35212129

 

你可能感兴趣的:(contiki)