4.5 时间管理
4.5 时间管理
📚 本节导读
学习时长: 约 120 分钟(含所有子节)
难度级别: ⭐⭐⭐☆☆
前置知识: 实时操作系统基本概念、C 语言指针与回调函数、中断处理基础
🎯 学习目标
- 理解 OneOS 中系统时钟(SysTick)的工作原理
- 掌握哈希桶定时器和单链表定时器两种定时器实现方案的区别与适用场景
- 熟悉定时器相关 API 的使用方法
- 了解时间管理模块的配置选项
一、时间管理概述
时间管理是 OneOS 内核的基础组件之一,为整个系统提供时间基准和定时功能。时间管理模块由以下核心部分组成:
- 系统时钟(SysTick):系统的"心跳",通过硬件定时器产生周期性中断,驱动整个系统的时序逻辑
- 定时器(Timer):基于系统时钟的软件定时器,支持单次触发和周期性触发两种模式
- 延时服务:为任务提供精确的延时阻塞功能(
os_task_tsleep/os_task_msleep)
所有时间管理相关的 API 在 kernel/include/os_timer.h 中声明,系统时钟实现在 kernel/source/os_clock.c 中。
二、两种定时器实现方案
OneOS 提供了两种定时器实现方案,用户可以根据应用场景选择:
| 特性 | 哈希桶定时器 | 单链表定时器 |
|---|---|---|
| 插入时间复杂度 | O(1) | O(n) |
| 定时器数量 | 适合大量定时器 | 适合少量定时器 |
| 硬件定时器支持 | 不支持 | 支持 |
| 软件定时器支持 | 支持 | 支持 |
| 配置宏 | OS_USING_HASH_TIMER | OS_USING_SINGLE_LIST_TIMER |
| 排序方式 | 哈希桶分散存储 | 按剩余时间升序链表 |
2.1 哈希桶定时器
哈希桶定时器将定时器按超时时间的哈希值分布到不同的桶中,每个桶维护一个定时器链表。插入操作只需计算哈希值并插入对应桶,时间复杂度为 O(1),非常适合定时器数量较多的场景。
2.2 单链表定时器
单链表定时器将所有定时器维护在一个按剩余时间排序的链表中。每次插入都需要遍历链表找到合适的位置,时间复杂度为 O(n)。单链表定时器额外支持硬件定时器(在 ISR 上下文中执行回调)和软件定时器(在定时器任务上下文中执行回调)。
三、系统时钟(SysTick)
系统时钟是 OneOS 的心脏,通过硬件定时器(通常为 Cortex-M 的 SysTick)产生固定频率的时钟中断。每个时钟中断称为一个"系统节拍(tick)",系统节拍频率由 OS_TICK_PER_SECOND 配置。
系统时钟驱动以下核心功能:
- 任务延时:
os_task_tsleep(tick)和os_task_msleep(ms)基于系统时钟实现任务阻塞延时 - 定时器计时:所有软件定时器的计时基于系统时钟
- 时间片轮转:同优先级任务的时间片由系统时钟驱动
- Tick 队列:内核维护一个 tick 队列,用于管理所有延时阻塞的任务
四、定时器类型
OneOS 定时器支持以下两种工作模式:
| 模式 | 标志 | 说明 |
|---|---|---|
| 单次触发 | OS_TIMER_FLAG_ONE_SHOT | 定时器到期后只执行一次回调,然后自动停止 |
| 周期性触发 | OS_TIMER_FLAG_PERIODIC | 定时器到期后执行回调并自动重新启动,循环往复 |
对于单链表定时器,还额外支持以下分类:
| 类型 | 标志 | 说明 |
|---|---|---|
| 硬件定时器 | OS_TIMER_FLAG_HARD_TIMER | 回调在 tick ISR 中执行,要求回调函数极短且不能阻塞 |
| 软件定时器 | OS_TIMER_FLAG_SOFT_TIMER | 回调在定时器任务上下文中执行,可以执行较复杂操作 |
五、配置选项
时间管理相关的配置宏定义在 oneos_config.h 中:
#define OS_TICK_PER_SECOND 100 /* 系统节拍频率,每秒 tick 数 */
#define OS_USING_KERNEL_TIMER /* 启用内核定时器功能 */
#define OS_USING_HASH_TIMER /* 启用哈希桶定时器(二选一) */
// #define OS_USING_SINGLE_LIST_TIMER /* 启用单链表定时器(二选一) */
// #define OS_HARD_SINGLE_LIST_TIMER /* 启用硬件单链表定时器 */
// #define OS_SOFT_SINGLE_LIST_TIMER /* 启用软件单链表定时器 */注意:
OS_USING_HASH_TIMER和OS_USING_SINGLE_LIST_TIMER互斥,只能二选一。OS_HARD_SINGLE_LIST_TIMER和OS_SOFT_SINGLE_LIST_TIMER可以同时启用。
六、子节导航
| 子节 | 标题 | 内容 |
|---|---|---|
| 4.5.1 | 系统时钟 | SysTick 概念、tick 中断处理、频率配置、tick 队列 |
| 4.5.2 | 哈希桶定时器 | O(1) 插入、哈希桶原理、内部数据结构、适用场景 |
| 4.5.3 | 单链表定时器 | 排序链表、硬/软定时器、周期性补偿、与哈希桶对比 |
| 4.5.4 | 定时器 API | 创建/销毁/启动/停止/查询等完整 API 参考及代码示例 |
📝 本节小结
时间管理是 OneOS 的基础组件,系统时钟为整个系统提供统一的时间基准,驱动任务延时、定时器计时和时间片轮转。OneOS 提供了哈希桶定时器和单链表定时器两种实现方案,分别适用于大量定时器和需要硬件定时器支持的不同场景。用户应根据实际需求选择合适的定时器方案。
🔗 相关链接
- 4.5.1 系统时钟
- 4.5.2 哈希桶定时器
- 4.5.3 单链表定时器
- 4.5.4 定时器 API
- 4.2 任务管理(任务延时相关)
- 4.6 错误处理机制(错误码与安全机制)