7.28. SYSTEM_TIMER
Overview
提供系统定时器使用示例方法和常见问题。
7.28.1. 应用示例
示例演示:
sys_timer、sys_timeout、usr_timer、usr_timeout四种定时函数使用示例
example:
1.使用sys_timer例子在
apps/demo/demo_DevKitBoard/include/demo_config.h
,开启宏USE_SYS_TIMER_TEST_DEMO
。2.使用sys_timeout例子在
apps/demo/demo_DevKitBoard/include/demo_config.h
,开启宏USE_SYS_TIMEROUT_TEST_DEMO
。3.使用usr_timer例子在
apps/demo/demo_DevKitBoard/include/demo_config.h
,开启宏USE_USR_TIMER_TEST_DEMO
。4.使用usr_timeout例子在
apps/demo/demo_DevKitBoard/include/demo_config.h
,开启宏USE_USR_TIMEROUT_TEST_DEMO
。
代码流程:
1. sys_timer_test()入口: - A)timer_id = sys_timer_add(NULL, callback_example, 5 * 1000);//注册一个定时器timer,定时时间5秒,并返回id - B) #if 0 //条件0执行修改后的定时时间2秒,条件1继续执行定时时间5秒 printf("timer_id = %d\r\n", timer_id); //打印分配的timer id #else if(timer_id) { printf("timer_id = %d\r\n", timer_id); sys_timer_modify(timer_id, 2 * 1000); //修改timer的定时时间为2秒 } #endif - C)每隔2秒的定时时间,则回调一次callback_example() - D)回调3次callback_example()后,执行sys_timer_del(timer_id);//删除timer,回调3次即删除timer 2. sys_timeout_test()入口: - A)timeout_id = sys_timeout_add(NULL, callback_example, 5 * 1000);//注册一个timeout,并返回id,定时时间到了自动删除timeout - B)#if 0 //条件0执行修改后的定时时间2秒;条件1删除定时时间为5秒的timeout printf("timeout_id = %d\r\n", timeout_id); sys_timeout_del(timeout_id); //删除timeout,会自动删除,实际用不到该函数。 #else if(timeout_id) { printf("timeout_id = %d\r\n", timeout_id); //sys_timeout_modify(timeout_id, 2 * 1000); //库里暂时没有该函数,仍执行5秒定时 } #endif - C)一旦5秒的定时时间到,仅回调一次callback_example(),自动删除timeout 3. usr_timer_test()入口: - A) timer_id = usr_timer_add((void* )1, callback_example, 2*1000, 1); //注册一个高精度timer,传参为1,定时时间2秒,并返回id - B) #if 0 //条件0执行修改后的定时时间500毫秒,条件1执行定时时间2秒 printf("timer_id = %d\r\n", timer_id); #else if(timer_id) { printf("timer_id = %d\r\n", timer_id); usr_timer_modify(timer_id, 500); //修改timer的定时时间为500毫秒 } #endif - C ) 每隔500毫秒的定时时间,则回调一次callback_example(1) - D)回调3次callback_example(1)后,执行sys_timer_del(timer_id); //删除timer,回调3次即删除timer 4. usr_timeout_test()入口: - A)timeout_id = usr_timeout_add((void* )1, callback_example, 2*1000, 1); //注册一个高精度timeout,定时时间2秒,并返回id,只回调一次 - B)#if 0 //条件0执行修改后的定时时间500毫秒;条件1删除定时时间为2秒的timeout printf("timeout_id = %d\r\n", timeout_id); usr_timeout_del(timeout_id); //删除timeout #else if(timeout_id) { printf("timeout_id = %d\r\n", timeout_id); usr_timeout_modify(timeout_id, 500); //修改timeout的定时时间为500毫秒 } #endif - C)一旦500毫秒的定时时间到,仅回调一次callback_example()
7.28.2. 常见问题
sys_timer/sys_timeout与usr_timer/usr_timeout分别适用于哪些应用?
答:sys_timer 和sys_timeout适用于在任务中执行,对时间精度要求不高的应用,usr_timer 和usr_timeout 适用于对时间精度要求高的应用。
sys_timer/usr_timer 与 sys_timerout/usr_timerout 接口的区别?
答:sys_timer/usr_timer 与 sys_timerout/usr_timerout 接口区别在于 timeout 接口的回调只会被调一次,也就是设定一个未来的时间, 时间到了响应之后便结束这个定时器的生命周期。
sys_timer 与usr_timer同步异步问题
答:sys_timer 由 systimer 线程提供时基,属于同步接口,也就是说在哪个线程 add 的 sys_timer,定时时基到了 systimer 线程会发事件通知对应 的 add 线程响应(回调函数被执行);usr_timer 属于异步接口, add 的时候注册的回调函数将在硬件定时器中时基到时候被调用。
函数
usr_timer_add(void *priv, void (*func)(void *priv), u32 msec, u8 priority)
中参数 priority(优先级)的问题答:usr_timer 的参数 priority(优先级)为 1,系统无法进入低功耗,参数 priority(优先级)为 0,系统低功耗会忽略该节拍,节拍不会丢失,但是周期会变。
sys_hi_timer/sys_s_hi_timer与usr_timer等同问题
答:sys_hi_timer 等同为 priority 为 1 的 usr_timer, 在 ``include_lib/system/timer.h ``被宏定义
sys_s_hi_timer 等同为 priority 为 0 的 usr_timer,在 ``include_lib/system/timer.h ``被宏定义
7.28.3. API Reference
Functions
-
u16 sys_timer_add(void *priv, void (*func)(void *priv), u32 msec)
sys_timer定时扫描增加接口
Note
timer使用说明
系统会进入低功耗,节拍不会丢失
sys_timer由systimer线程提供时基,属于同步接口,也就是说在哪个线程add的sys_timer,定时时基到了,systimer线程会发事件通知对应的add线程响应(回调函数被执行)
与sys_timer_del成对使用
- Parameters
priv – 私有参数
func – 定时扫描回调函数
msec – 定时时间, 单位:毫秒
- Returns
定时器分配的id号
-
u16 sys_timer_add_to_task(const char *task_name, void *priv, void (*func)(void *priv), u32 msec)
sys_timer定时扫描增加接口
Note
timer使用说明
系统会进入低功耗,节拍不会丢失
sys_timer由systimer线程提供时基,属于同步接口,也就是说在哪个线程add的sys_timer,定时时基到了,systimer线程会发事件通知对应的add线程响应(回调函数被执行)
与sys_timer_del成对使用
- Parameters
task_name – 指定任务名称
priv – 私有参数
func – 定时回调函数
msec – 定时时间, 单位:毫秒
- Returns
定时器分配的id号
-
void sys_timer_del(u16 id)
sys_timer定时扫描删除接口
Note
与sys_timer_add成对使用
- Parameters
id – sys_timer_add分配的id号
-
u16 sys_timeout_add(void *priv, void (*func)(void *priv), u32 msec)
sys_timer超时增加接口
Note
timer使用说明
系统会进入低功耗,节拍不会丢失
sys_timeout由systimer线程提供时基,属于同步接口,也就是说在哪个线程add的sys_timeout,定时时基到了,systimer线程会发事件通知对应的add线程响应(回调函数被执行)
timeout回调只会被执行一次
与sys_timeout_del成对使用
- Parameters
priv – 私有参数
func – 超时扫描回调函数
msec – 超时时间, 单位:毫秒
- Returns
定时器分配的id号
-
u16 sys_timeout_add_to_task(const char *task_name, void *priv, void (*func)(void *priv), u32 msec)
sys_timer超时增加接口
Note
timer使用说明
系统会进入低功耗,节拍不会丢失
sys_timeout由systimer线程提供时基,属于同步接口,也就是说在哪个线程add的sys_timeout,定时时基到了,systimer线程会发事件通知对应的add线程响应(回调函数被执行)
timeout回调只会被执行一次
与sys_timeout_del成对使用
- Parameters
task_name – 指定任务名称
priv – 私有参数
func – 超时回调函数
msec – 超时时间, 单位:毫秒
- Returns
定时器分配的id号
-
void sys_timeout_del(u16 id)
sys_timer超时删除接口
Note
与sys_timeout_add成对使用
- Parameters
id – sys_timeout_add分配的id号
-
void sys_timer_re_run(u16 id)
sys_timer定时器重置
Note
重置之后重新计时
- Parameters
id – sys_timer和分sys_timeout配的id号
-
void sys_timer_set_user_data(u16 id, void *priv)
sys_timer定时器设置私有参数
- Parameters
id – sys_timer分配的id号
priv – 私有参数
-
void *sys_timer_get_user_data(u16 id)
sys_timer定时器获取私有参数
Note
如果有通过sys_timer_set_user_data重新设置私有参数,则返回的是设置后的私有参数
- Parameters
id – sys_timer分配的id号
- Returns
返回add时的私有参数
-
int sys_timer_modify(u16 id, u32 msec)
sys_timer修改定时扫描时间接口
- Parameters
id – sys_timer_add和sys_timeout_add分配的id号
msec – 定时时间, 单位:毫秒
- Returns
0
-
u16 usr_timer_add(void *priv, void (*func)(void *priv), u32 msec, u8 priority)
usr_timer定时扫描增加接口
Note
timer使用说明
usr_timer的参数priority(优先级)为1,使用该类定时器,系统无法进入低功耗
usr_timer的参数priority(优先级)为0,使用该类定时器,系统低功耗会忽略该节拍,节拍不会丢失,但是周期会变
usr_timer属于异步接口, add的时候注册的扫描函数将在硬件定时器中时基到时候被调用。
对应释放接口usr_timer_del
- Parameters
priv – 私有参数
func – 定时扫描回调函数
msec – 定时时间, 单位:毫秒
priority – 优先级,范围:0/1
- Returns
定时器分配的id号
-
u16 usr_timeout_add(void *priv, void (*func)(void *priv), u32 msec, u8 priority)
usr_timer超时增加接口
Note
timer使用说明
usr_timeout的参数priority(优先级)为1,使用该类定时器,系统无法进入低功耗
usr_timeout的参数priority(优先级)为0,使用该类定时器,系统低功耗会忽略该节拍,节拍不会丢失,但是周期会变
usr_timeout属于异步接口, add的时候注册的扫描函数将在硬件定时器中时基到时候被调用。
对应释放接口usr_timerout_del
timeout回调只会被执行一次
- Parameters
priv – 私有参数
func – 超时回调函数
msec – 超时时间, 单位:毫秒
priority – 优先级,范围:0/1
- Returns
定时器分配的id号
-
int usr_timer_modify(u16 id, u32 msec)
usr_timer修改定时扫描时间接口
- Parameters
id – usr_timer_add时分配的id号
msec – 定时时间, 单位:毫秒
- Returns
0
-
int usr_timeout_modify(u16 id, u32 msec)
usr_timeout修改超时时间接口
- Parameters
id – usr_timeout_add时分配的id号
msec – 超时时间, 单位:毫秒
- Returns
0
-
void usr_timer_del(u16 id)
usr_timer删除接口
Note
注意与usr_timer_add成对使用
- Parameters
id – usr_timer_add时分配的id号
-
void usr_timeout_del(u16 id)
usr_timeout删除接口
Note
注意与usr_timeout_add成对使用
- Parameters
id – usr_timerout_add时分配的id号
-
void usr_timer_dump(void)
usr_time输出调试信息
Note
调试时可用,将输出所有被add定时器的id及其时间(msec)