定时器分为硬件定时器和软件定时器。区别:硬件定时器的超时函数是在定时器中断中管理的(也就是时基中断systick中断)。而软件定时器的超时函数是在线程中管理的。
进中断的就是“硬的”,在线程里或任务里的是“软的”。
根据软硬分为2类定时器列表。
1.有两类定时器列表:
一是系统定时器列表,即硬件定时器列表,线程内置定时器或者用户自定义的硬件定时器就挂在这个列表中,以供每次滴答中断时基更新是查询有没有超时的定时器,有的话就执行定时器的超时函数——对于是线程的定时器执行的是固定的超时函数——恢复阻塞延时线程、执行调度,而对于是用户自定义的硬件定时器,则执行用户自定义的超时函数。
二是软件定时器列表。用户自定义的软件定时器挂在这里,同时是在定时器线程里来查询是否超时,但是是线程就有优先级,所以定时器线程被唤醒时不一定能立马执行,这就是其精度不高的原因。
2.定时器又分为两类:一类是属于线程内置的定时器,线程本身的属性、集合,属于硬件定时器。另一类是用户自定义的定时器,可设为硬件定时器或软件定时器,比较自由。
一片野火rtt原话:
在RT-Thread中,我们也可以在创建定时器时,把定时器指定成SOFT_TIMER的方式,这样可以使得定时器超时函数完全运行在timer系统线程上下文环境中。如果系统在初始化时需要使用SOFT_TIMER特性,需要在系统配置中打开RT_USING_TIMER_SOFT宏定义,那么调用rt_system_timer_thread_init函数就可以启动timer系统线程。这里值得注意的是,SOFT_TIMER定时器的精度由RT_TIMER_TICK_PER_SECOND定义的值所决定(每秒触发的timer tick次数是多少),这个值必须是OS tick的整数倍。