高效实时操作系统原理以及实践-软件定时器
raw os提供了定时器给用户去使用。软件定时器的代码在raw_timer.c里面。使用的时候需要打开raw_config.h中的CONFIG_RAW_TIMER。软件定时器类似于硬件定时器,当内部计数器达到某一值时会触发用户的自定义函数,这个函数也叫回调函数。这个函数可以用在各个场合,尤其是在一些协议栈中当做超时重发的定时器去使用,也可以用做去轮询一些外设的状态等。
用户可以创建任意多个软件定时器,只要内存足够大。
定时器的精度有raw_config.h 里的RAW_TIMER_RATE去定义使用,具体的软件定时器的频率可以有公式RAW_TICKS_PER_SECOND /RAW_TIMER_RATE算出来。举一个例子,假设RAW_TICKS_PER_SECOND 为100, RAW_TIMER_RATE为10,那说明软件定时器的频率是一秒10次,即一次是100ms。
软件定时器的实现有一个系统开启的任务去实现,这个任务就是timer_task,此任务的优先级可以配置,具体的在raw_config.h里的TIMER_TASK_PRIORITY去配置。
对于软件定时器的精度是有一定的时间误差的,误差时间一般在上下一个tick
时间,有的人把系统定时器的频率开得很大,比如1000Hz, 这样对于系统损耗
很大,对于100MHz以下的cpu, 推荐50Hz或者更小。如果系统中不存在超时机
制,甚至可以不使用系统定时器,用来节约功耗和最大提升系统运行效率。
如果你一定要精度准的定时,怎么办?请使用硬件定时器。
raw os 的软件定时器有以下特点:
1 支持一次定时器触发用户的回调函数。
2 周期性的定时器触发用户的回调函数。
3周期性的定时器触发用户的回调函数,但是第一次回调用户的函数的时间可以
设置不同的时间。
对于软件定时器唯一需要特别注意的是因为软件定时器的回调函数是关了系统
抢占运行的,所以需要回调函数运行时间要尽可能的短,否则系统的最大任务延
迟会急剧增加,对系统的实时性损害太大。
Raw timer api 应用
1 RAW_U16 raw_timer_create(RAW_TIMER *timer_ptr, RAW_U8*name_ptr,
RAW_VOID (*expiration_function)(RAW_VOID *),
RAW_VOID *expiration_input, RAW_U32 initial_ticks,
RAW_U32 reschedule_ticks, RAW_U8 auto_activate)
函数功能:
创建一个软件定时器。
此函数的参数有7个,含义如下:
timer_ptr为软件定时器实体控制块的地址。
name_ptr为此软件定时器的名字。
expiration_function是用户的回调函数,此回调函数有一个参数为void *的指针。
initial_ticks是定时器第一次发生定时中断的时间,如果参数reschedule_ticks为0的话,则实现一次性定时器。
reschedule_ticks是定时器周期性发生中断的的时间。
auto_activate 为1的话,则自动启动定时器。否则需要调用raw_timer_activate去激活这个创建的软件定时器。
函数的返回值:
RAW_SUCCESS: 成功创建该软件定时器。
2 RAW_U16 raw_timer_activate(RAW_TIMER *timer_ptr, RAW_VOID *expiration_input)
函数功能:
激活一个软件定时器
此函数的参数有2个,含义如下:
timer_ptr为软件定时器实体控制块的地址。
expiration_input 为用户回调函数超时传入的参数。
函数的返回值:
RAW_TIMER_STATE_INVALID:定时器的状态不对,对于要激活的定时器的状态必须要是非激活状态的或者是非删除状态的定时器。
RAW_SUCCESS:成功激活该软件定时器。
3 RAW_U16 raw_timer_deactivate(RAW_TIMER *timer_ptr)
函数功能:
反激活一个软件定时器。
此函数的参数有1个,含义如下:
timer_ptr为软件定时器实体控制块的地址。
函数的返回值:
RAW_TIMER_STATE_INVALID:定时器的状态不对,对于要反激活的定时器的状态必须要是激活状态的或者是非删除状态的定时器。
RAW_SUCCESS: 成功反激活该软件定时器。
4 RAW_U16 raw_timer_delete(RAW_TIMER *timer_ptr)
函数功能:
删除这个软件定时器
此函数的参数有1个,含义如下:
timer_ptr为软件定时器实体控制块的地址。
函数的返回值:
RAW_TIMER_STATE_INVALID:定时器的状态不对,对于要反激活的定时器的状态必须要是非删除状态的定时器。
RAW_SUCCESS:成功删除该软件定时器
raw timer内部API
1 static void timer_task(void *pa)
函数功能:
软件定时器内部任务。是完成控制软件定时器的主体函数。
此函数的参数有1个,含义如下:
pa 为无效参数。
函数的返回值:
无
2 void call_timer_task()
函数功能:
此函数主要被系统的定时器中断调用,会根据定时器的频率去发信号量唤醒
定时器处理任务。
此函数的参数没有。
函数的返回值:
无
3 void raw_timer_init()
函数功能:
此函数系统初始化的时候会被调用。
此函数的参数没有。
函数的返回值:
无
raw os官网地址:www.raw-os.org 顶楼主
页:
[1]