29、【OS】【Nuttx】最小系统初始化分析(4):定时器(三)
背景
接前两篇定时器分析的wiki
27、【OS】【Nuttx】最小系统初始化分析(4):定时器(一)
28、【OS】【Nuttx】最小系统初始化分析(4):定时器(二)
这里对最小系统所用定时器做一个补充
报警器与定时器
在初始化时,有个细节,所初始化的定时器为 up_alarm_set_lowerhalf,而不是 up_timer_set_lowerhalf,up_alarm是报警器,本质也属于定时器,属于更专用的定时器,而 up_timer属于通用的定时器
- up_timer:较为通用的定时器,适用于多种类型的需求,包括但不限于报警(alarm)、延时操作、周期性任务等
- up_alarm:专门用于报警机制的定时器,通常是为了在未来的某个时间点触发一个事件(如发送信号给进程)
观察对比 up_timer(timer_callback)的回调函数,和 up_alarm(oneshot_callback) 的回调函数,没太大区别,最后都是用 nxsched_process_timer 处理定时器,之前wiki分析过 nxsched_process_timer,要求调用间隔为1个tick,会使用看门狗定时器来监控信号有没有超时,若超时则执行信号超时函数,且这俩函数都属于静态函数,不对外开放,可以理解只给Nuttx服务使用的
TICKLESS模式
在分析定时器时,可以经常看到 CONFIG_SCHED_TICKLESS 配置项,CONFIG_SCHED_TICKLESS 通常出现在支持可配置内核的实时操作系统(RTOS)或者类Unix操作系统中,比如Linux,用于启用TICKLESS模式,以优化CPU功耗和提高系统效率。
对于传统OS,通常有个定时器(如up_alarm)会以固定的频率触发(如10ms一次的TICK),无论系统是否有需要处理的任务,该定时器称为系统TICK。当启用了 CONFIG_SCHED_TICKLESS 选项后,系统将不会执行TICK任务。此时如果系统中没有任务需要执行,CPU可以保持在空闲状态下,而不必周期被TICK任务唤醒,以降低CPU功耗。
-
TICK模式
-
TICKLESS模式
TICK模式:
- 计时:TICK任务可以提供时间基准
- 实时性保障:对于需要满足严格实时要求的系统来说,TICK任务确保OS能够在预定的时间间隔内检查并响应事件,确保系统对外部事件的及时反应
- 资源管理:TICK任务可以帮助OS跟踪和管理各种资源,如CPU使用率、内存占用等
TICKLESS模式:
- 节能:TICK模式下,CPU即使在空闲时也会定期被TICK任务中断唤醒以检查是否有任务需要执行。而在 TICKLESS 模式中,CPU可以在没有待处理任务的情况下保持在空闲状态更长时间,直到下一个实际需要的时间点或事件发生
- 复杂度增加:TICKLESS设计和实现更复杂,增加了代码维护难度(没了周期调度的保障,需要在各关键执行点插入对调度任务(如信号事件,Ready队列)的处理),需要考虑如何正确处理长时间间隔场景
- 调试困难:系统行为将变得更加动态和难以预测,出现问题时,定位调试变得更加复杂