--- type: concept title: FreeRTOS 系统服务 tags: [freertos, rtos, timer, tickless, memory, heap, concept] created: 2026-07-12 --- # FreeRTOS 系统服务 ## 软件定时器 轻量级时间管理工具,基于内核 Tick 实现。 ### 与硬件定时器的区别 | 特性 | 软件定时器 | 硬件定时器 | |------|-----------|-----------| | 实现方式 | 依赖任务调度器 | 独立于 CPU | | 精度 | 可能受调度影响 | 高精度 | | 资源 | 无额外硬件需求 | 占用硬件资源 | ### 类型 - **一次性定时器**:触发一次后停止 - **周期性定时器**:每个超时周期触发一次 ### API | 函数 | 描述 | |------|------| | `xTimerCreate()` | 创建定时器(周期、回调函数) | | `xTimerStart()` | 启动定时器 | | `xTimerStop()` | 停止定时器 | | `xTimerReset()` | 复位定时器 | | `xTimerChangePeriod()` | 更改超时时间 | **注意**:定时器回调函数在定时器服务任务上下文中执行,不能调用导致阻塞的 API 函数。 ## Tickless 低功耗模式 最小化时钟中断频率以降低功耗。系统无任务时进入休眠,有需要时启动中断唤醒。 ### 原理 1. 空闲任务检测系统是否无任务执行 2. 无任务时进入休眠(`__WFI` 指令),关闭时钟中断 3. 有任务时唤醒,校正滴答计数值 主要使用 STM32 的睡眠模式(任何中断/事件可唤醒)。 ![STM32 low power modes](../raw/FreeRTOS/尚硅谷FreeRTOS教程/assets/stm32_low_power_modes.png) ### 配置项 | 配置项 | 说明 | |--------|------| | `configUSE_TICKLESS_IDLE` | 使能 Tickless 模式 | | `configPRE_SLEEP_PROCESSING(x)` | 睡前处理(如关闭外设时钟) | | `configPOST_SLEEP_PROCESSING(x)` | 醒来处理(如开启外设时钟) | ## 内存管理 FreeRTOS 提供 5 种内存分配算法(heap_1 ~ heap_5): | 算法 | 特点 | 适用场景 | |------|------|---------| | **heap_1** | 最简单,不允许释放内存 | 系统启动时一次性创建所有对象 | | **heap_2** | 最佳适应算法,允许释放,不合并相邻块 | 动态创建/删除,堆栈大小固定 | | **heap_3** | 包装标准 malloc/free,线程安全 | 标准库可用时 | | **heap_4** | 第一适应算法,合并相邻空闲块 | 最常用(推荐),减少碎片 | | **heap_5** | 同 heap_4,支持跨越不连续内存区域 | 复杂内存布局 | ![heap_1](../raw/FreeRTOS/尚硅谷FreeRTOS教程/assets/freertos_heap1.png) ![heap_2 best fit](../raw/FreeRTOS/尚硅谷FreeRTOS教程/assets/freertos_heap2_best_fit.png) ![heap_4 first fit](../raw/FreeRTOS/尚硅谷FreeRTOS教程/assets/freertos_heap4_first_fit.png) ### 内存 API | 函数 | 描述 | |------|------| | `pvPortMalloc(size_t)` | 申请内存 | | `vPortFree(void*)` | 释放内存 | | `xPortGetFreeHeapSize()` | 获取剩余堆大小 | ## 相关页面 - [[source-freertos|尚硅谷 FreeRTOS 教程 - 资料页]] - [[freertos-ipc|任务间通信(IPC)]] - [[freertos-porting|FreeRTOS 移植指南]]