rtimer可以满足精准定时的需要,但是没有常见的next指针来挂接后续节点, 为了减少rtimer中断挂接一个rtimer结构是不错的做法,大多数定时器位宽为16位,因此rtimer的频率必须小于30khz。
一.rtimer用途
contiki系统引入rtimer可以满足精准定时的需要,一些对时间极为敏感的模块(如mac协议)依赖于rtimer。和etimer的粗粒度(常见为100hz)不同,rtimer是细粒度(常见为10khz)定时器。根据经验,细粒度定时器如果中断频繁特别容易消耗cpu资源,为此contiki设计rtimer时尽可能地减少中断,大部分应用场合为读取定时器计数值。
二.数据结构
rtimer的数据结构如图1所示,time赋值为下一次定时器超时中断的时刻点,func是定时器超时中断的回调函数,ptr是传递给回调函数的数据指针。
从图1发现,rtimer没有常见的next指针来挂接后续节点,确实,contiki为了减少rtimer中断的爆发只能挂接一个rtimer结构,如图2所示。如果同时挂接2个或以上的rtimer结构,那么最新挂接的有效,其它的rtimer结构将丢失,即图3的解释。
这种只能挂接1个rtimer的机制使设计很简单,并且硬件定时器中断只在需要的时候才爆发,极大降低了cpu负荷。当然,它也带来一个限制,只能串行使用rtimer定时器的中断回调功能,即不具备排队功能。
三.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()非法。
四.rtimer移植
有了上述rtimer的理论,再来移植rtimer就比较容易了,即,基于mcu实现rtimer-arch.c和rtimer-arch.h。
需要特别注意,大多数定时器(尤其是8位mcu)位宽为16位,即max=65535,而mac协议往往需要1秒以上的定时周期,因此rtimer的频率必须小于30khz。一个比较好的数值是10khz,它既可以保证比较好的精度(间隔为100us),又具备6.5秒的满量程,这可以适应大多数的应用需要。
另外,大多数应用需要随机撤销和重启动rtimer,它可以通过添加2个函数来实现:rtimer_arch_disable_irq()和rtimer_arch_enable_irq()。
恩智浦广播功率放大器实现DVB-T效率新突破
医疗设备健康档案系统设计及应用
中国工业互联网平台落地的提供数字化解决方案
突发,全球第二大汽车传感器龙头计划裁员900人!
鸿蒙系统和安卓的区别是什么,官方回应质疑
浅谈rtimer定时器原理和rtimer移植
电子产业专业认证机构
光峰科技采用ALPD激光显示技术将“冰墩墩”送上高空
泰凌微电子三元组认证功能实现
Energous/Dialog增持无线充电 已通过FCC的认证
使用外部 PLL 改善 FPGA 通信接口时钟抖动
AI技术在数据安全中的起到的作用
关于瞬态平面导热系数测定仪的介绍
将存储纳入未来自动驾驶汽车全面的整体格局中 使自动驾驶市场成为现实
集成电路产业利好!国家大基金二期募资完成,规模2000亿左右
灵动微电子低功耗单片机MM32L0130开发板申请
1-18号原子结构示意图
STM32单片机UART发送配置的步骤及方法
迪士尼在 VR 中绘制真实移动物体的地图,向我们展示如何正确接球
三星Exynos 1080处理器拍照升级:2亿像素+6摄、可看见毛细血管