
定时器,看起来简单,但用错了地方,要么功耗下不去,要么定时不准,调试起来还挺头疼。
JL杰理AC696N的SDK里给了两套定时器:sys_timer和usr_timer。刚接触的时候容易搞混——什么时候用哪个?为什么我的定时器进了休眠就不准了?回调里能不能干活?
这些问题之前在AC696N开发板上调低功耗方案的时候都踩过,把区别和选型逻辑整理一下,方便以后写代码的时候直接对号入座。
芯片产品介绍
一、系统定时器 (sys_timer) - “软件定时器”特点: 由systimer线程管理,同步接口。在哪个线程添加,回调就在哪个线程执行。
低功耗: 系统可休眠,定时到期会唤醒系统,节拍不丢失。
用途: 适用于需要周期执行、且允许微小延迟的通用任务。
接口: sys_timer_add, sys_timer_del, sys_timeout_add (一次性)
二、用户定时器 (usr_timer) - “硬件定时器”特点: 由硬件定时器驱动,异步接口,回调在中断上下文执行。
优先级影响:
priority=1:系统无法进入低功耗,定时精确priority=0:系统可休眠,但定时周期可能因休眠而变长用途: 适用于需要精确、快速响应的定时任务,或一次性超时。
接口: usr_timer_add, usr_timer_del, usr_timeout_add
选择指南
需要低功耗且对实时性要求不高 → 用 sys_timer需要精确计时或快速响应,且功耗非首要考虑 → 用 usr_timer(priority=1)需要一次性超时功能 → 用 sys_timeout_add 或 usr_timeout_add总结简单说,平时写代码优先用sys_timer,它不影响休眠,功耗友好,大部分场景够用了。如果遇到那种必须精确到毫秒级的定时,或者回调里需要干比较紧急的活,再用usr_timer,但记得priority=1的时候系统睡不了,功耗会上去,别在产品里长期开着。一次性超时两边都支持,习惯用哪个都行。建议在AC696N开发板上把两种定时器都跑一下,串口打印看看回调线程和休眠行为,直观感受区别,后面选型就不会纠结了。
盛多网提示:文章来自网络,不代表本站观点。