tags: [source-summary] type: source source: "尚硅谷嵌入式技术之FreeRTOS实时操作系统 V1.0.3 — 数据类型 + 命名规范 + FreeRTOSConfig.h" author: "尚硅谷研究院" date: 2026-07-17
用生活理解:数据类型是 FreeRTOS 定义的标准"容器"规格,命名规范是像快递单号一样——通过前缀就知道包裹类型。FreeRTOSConfig.h 就像系统的 BIOS 设置界面,你可以开关功能、分配资源大小。
FreeRTOS 针对每个移植平台定义了四种核心数据类型,保证代码在不同架构间可移植。
| 类型 | 说明 | 默认定义(Cortex-M3) | 相关配置 |
|---|---|---|---|
TickType_t |
滴答计数值类型,记录系统节拍次数 | uint32_t |
configUSE_16_BIT_TICKS——设为非零时变为 uint16_t |
BaseType_t |
架构最自然类型,有符号 | uint32_t(Cortex-M3 32位) |
架构自动决定 |
UBaseType_t |
BaseType_t 的无符号版本 |
uint32_t |
架构自动决定 |
StackType_t |
堆栈存储单元类型 | uint32_t(Cortex-M3 32位) |
架构自动决定,供 FreeRTOS 内部使用 |
TickType_t:系统滴答中断每次发生时递增的计数器类型。如果定义了 configUSE_16_BIT_TICKS,则为 16 位无符号整数(最大计数值 65535),否则为 32 位无符号整数。对于长时间运行的系统,建议保持默认的 32 位,避免溢出。
BaseType_t:定义为架构中最有效率的类型。在 32 位架构上是 32 位,16 位架构上是 16 位。FreeRTOS 的很多 API 返回值使用此类型。
StackType_t:堆栈的基本单位,在 32 位架构上是 32 位。所有任务栈的分配和管理都以此类型为单位。
FreeRTOS 采用匈牙利命名法与驼峰命名法的结合。通过变量或函数的前缀就可以推测出返回类型和所属模块。
| 前缀 | 含义 | 示例 |
|---|---|---|
c |
char(仅 ASCII 字符) |
cError |
s |
int16_t(short) |
sValue |
l |
int32_t(long) |
lCount |
x |
BaseType_t、TickType_t 或结构体 |
xQueueCreate 返回值 |
ux |
UBaseType_t |
uxTaskGetNumberOfTasks() |
ul |
uint32_t |
ulCounter |
us |
uint16_t |
usADCValue |
uc |
uint8_t(unsigned char) |
ucParameter |
e |
枚举 | eTaskState |
p |
指针(追加在其他前缀前) | pucBuffer(uint8_t*) |
pc |
char*(指向 ASCII 字符串) |
pcTaskName |
函数命名格式:{返回类型前缀}{文件名}{功能}
| 前缀 | 返回类型 | 示例 |
|---|---|---|
v |
void |
vTaskDelay |
x |
BaseType_t 或结构体 |
xQueueCreate |
ux |
UBaseType_t |
uxTaskGetNumberOfTasks |
pv |
void* |
pvPortMalloc |
prv |
void(私有/static 函数) |
prvIdleTask |
例如 vTaskDelay:v → 返回 void,Task → 定义在 tasks.c,Delay → 功能是延时。
| 规则 | 说明 | 示例 |
|---|---|---|
| 以小写文件名为前缀 | 对应定义所在文件 | configUSE_PREEMPTION(FreeRTOSConfig.h) |
| 大写 + 下划线 | 可读性 | pdTRUE、pdPASS、portMAX_DELAY |
pd 前缀 |
Protocol Define(协议定义) | pdTRUE、pdFALSE、pdPASS、pdFAIL |
| 后缀 | 含义 | 示例 |
|---|---|---|
_t |
typedef 类型 | TickType_t、TaskHandle_t |
_handler |
任务或中断句柄 | task1_handler |
FreeRTOSConfig.h 是 FreeRTOS 的工程配置文件。它是一个纯头文件,在编译阶段确定内核行为。用户通过修改宏定义来裁剪内核功能,减少 ROM/RAM 占用。
配置项分为三类:
INCLUDE_ 开头:API 函数使能,1=可用,0=禁用config 开头:功能配置,包括基础、内存、钩子、中断等| 宏 | 课程值 | 默认值 | 说明 |
|---|---|---|---|
configUSE_PREEMPTION |
1 | 无默认 | 1=抢占式调度,0=协程式调度 |
configUSE_PORT_OPTIMISED_TASK_SELECTION |
1 | 0 | 1=硬件计算下一个任务,0=软件算法 |
configUSE_TICKLESS_IDLE |
0 | 0 | 1=使能 tickless 低功耗模式 |
configCPU_CLOCK_HZ |
SystemCoreClock |
无默认 | CPU 主频(Hz) |
configTICK_RATE_HZ |
1000 | 无默认 | 系统节拍频率(Hz),即每秒滴答次数 |
configMAX_PRIORITIES |
32 | 无默认 | 最大优先级数(0 ~ configMAX_PRIORITIES-1) |
configMINIMAL_STACK_SIZE |
128 | 无默认 | 空闲任务栈大小(单位:Word) |
configMAX_TASK_NAME_LEN |
16 | 16 | 任务名最大字符数 |
configUSE_16_BIT_TICKS |
0 | 无默认 | 1=滴答计数器为 16 位,0=32 位 |
configIDLE_SHOULD_YIELD |
1 | 1 | 同优先级任务能否抢占空闲任务 |
configUSE_TASK_NOTIFICATIONS |
1 | 1 | 使能任务通知 |
configTASK_NOTIFICATION_ARRAY_ENTRIES |
1 | 1 | 任务通知数组大小 |
configUSE_MUTEXES |
1 | 0 | 使能互斥信号量 |
configUSE_RECURSIVE_MUTEXES |
1 | 0 | 使能递归互斥信号量 |
configUSE_COUNTING_SEMAPHORES |
1 | 0 | 使能计数信号量 |
configQUEUE_REGISTRY_SIZE |
8 | 0 | 可注册的队列/信号量个数 |
configUSE_QUEUE_SETS |
1 | 0 | 使能队列集 |
configUSE_TIME_SLICING |
1 | 1 | 使能时间片调度 |
| 宏 | 课程值 | 默认值 | 说明 |
|---|---|---|---|
configSUPPORT_STATIC_ALLOCATION |
0 | 0 | 支持静态内存分配 |
configSUPPORT_DYNAMIC_ALLOCATION |
1 | 1 | 支持动态内存分配 |
configTOTAL_HEAP_SIZE |
10*1024 | 无默认 | FreeRTOS 堆总大小(Byte) |
configAPPLICATION_ALLOCATED_HEAP |
0 | 0 | 用户手动分配堆空间 |
| 宏 | 课程值 | 默认值 | 说明 |
|---|---|---|---|
configUSE_IDLE_HOOK |
0 | 无默认 | 空闲任务钩子 |
configUSE_TICK_HOOK |
0 | 无默认 | 滴答中断钩子 |
configCHECK_FOR_STACK_OVERFLOW |
0 | 0 | 栈溢出检测(1=方法1,2=方法2) |
configUSE_MALLOC_FAILED_HOOK |
0 | 0 | 内存分配失败钩子 |
| 宏 | 课程值 | 默认值 | 说明 |
|---|---|---|---|
configUSE_TIMERS |
1 | 0 | 使能软件定时器 |
configTIMER_TASK_PRIORITY |
configMAX_PRIORITIES - 1 |
无默认 | 定时器服务任务优先级 |
configTIMER_QUEUE_LENGTH |
5 | 无默认 | 定时器命令队列长度 |
configTIMER_TASK_STACK_DEPTH |
configMINIMAL_STACK_SIZE * 2 |
无默认 | 定时器服务任务栈大小 |
| 宏 | 课程值 | 说明 |
|---|---|---|
configPRIO_BITS |
__NVIC_PRIO_BITS |
优先级位数(STM32F103 为 4) |
configLIBRARY_LOWEST_INTERRUPT_PRIORITY |
15 | 中断最低优先级 |
configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY |
5 | FreeRTOS 可管理的最高中断优先级 |
configKERNEL_INTERRUPT_PRIORITY |
15 << (8-4) = 240 | 内核自身中断优先级 |
configMAX_SYSCALL_INTERRUPT_PRIORITY |
5 << (8-4) = 80 | 可安全调用 API 的最高中断优先级 |
| 宏 | 课程值 | 说明 |
|---|---|---|
INCLUDE_vTaskPrioritySet |
1 | 设置任务优先级 |
INCLUDE_uxTaskPriorityGet |
1 | 获取任务优先级 |
INCLUDE_vTaskDelete |
1 | 删除任务 |
INCLUDE_vTaskSuspend |
1 | 挂起任务 |
INCLUDE_xResumeFromISR |
1 | 中断中恢复任务 |
INCLUDE_vTaskDelayUntil |
1 | 任务绝对延时 |
INCLUDE_vTaskDelay |
1 | 任务延时 |
INCLUDE_xTaskGetSchedulerState |
1 | 获取调度器状态 |
INCLUDE_xTaskGetCurrentTaskHandle |
1 | 获取当前任务句柄 |
INCLUDE_uxTaskGetStackHighWaterMark |
1 | 获取堆栈历史最低水位 |
INCLUDE_xTaskGetIdleTaskHandle |
1 | 获取空闲任务句柄 |
INCLUDE_eTaskGetState |
1 | 获取任务状态 |
INCLUDE_xTaskGetHandle |
1 | 通过名称获取任务句柄 |
#define xPortPendSVHandler PendSV_Handler
#define vPortSVCHandler SVC_Handler
这两个宏将 FreeRTOS 的 PendSV/SVC 中断处理函数重映射为标准的中断入口名,必须定义。
#define vAssertCalled(char, int) printf("Error: %s, %d\r\n", char, int)
#define configASSERT(x) if ((x) == 0) vAssertCalled(__FILE__, __LINE__)
调试阶段建议开启 configASSERT,在参数错误时能快速定位问题。发布版本可关闭以减小代码体积。
| API 类型 | 使能宏 | 功能 |
|---|---|---|
vTaskDelay |
INCLUDE_vTaskDelay |
任务相对延时 |
vTaskDelayUntil |
INCLUDE_vTaskDelayUntil |
任务绝对延时 |
vTaskDelete |
INCLUDE_vTaskDelete |
删除任务 |
vTaskSuspend |
INCLUDE_vTaskSuspend |
挂起任务 |
vTaskResume |
INCLUDE_vTaskSuspend |
恢复任务 |
eTaskGetState |
INCLUDE_eTaskGetState |
获取任务状态 |
INCLUDE_ 宏未定义导致链接错误:调用某个 API 函数但对应的 INCLUDE_ 宏为 0 或未定义时,编译可通过但链接会报 undefined reference。先确认 FreeRTOSConfig.h 中的使能配置。configASSERT 在发布版中应关闭:断言会增加代码体积和运行开销,调试完功能后记得改为 0 或注释掉。configTOTAL_HEAP_SIZE 设太大:STM32F103C8T6 只有 20KB RAM,设为 10KB 左右比较安全。设太大会导致 pvPortMalloc 分配失败。configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 设置错误:如果某个中断的优先级比这个值低(数值更大),该 ISR 中不能调用 FreeRTOS API。设得太高可能导致临界区无法正确嵌套。