1.1FreeRTOS目录
1.2核心文件
FreeRTOS 的最核心文件只有 2 个:
✈ FreeRTOS/Source/tasks.c
✈ FreeRTOS/Source/list.c
其他文件的作用也一起列表如下:
FreeRTOS/Source/下的文件 | 作用 |
tasks.c | 必需,任务操作 |
list.c | 必须,列表 |
queue.c | 基本必需,提供队列操作、信号量(semaphore)操作 |
timer.c | 可选,software timer |
event_groups.c | 可选,提供 event group 功能 |
1.3移植时涉及的文件
移植 FreeRTOS 时涉及的文件放在
FreeRTOS/Source/portable/[compiler]/[architecture]目录下,
比如:RVDS/ARM_CM3,这表示 cortexM3 架构在 RVDS 或 Keil 工具上的移植文件。
里面有 2 个文件:
✈ port.c
✈ portmacro.h
1.4 头文件相关
1.4.1 头文件目录 FreeRTOS 需要 3 个头文件目录:
✈ FreeRTOS 本身的头文件:FreeRTOS/Source/include
✈ 移植时用到的头文件:FreeRTOS/Source/portable/[compiler]/[architecture]
✈ 含有配置文件 FreeRTOSConfig.h 的目录
1.4.2 头文件
头文件 | 作用 |
FreeRTOSConfig.h | FreeRTOS 的配置文件,比如选择调度算法:configUSE_PREEMPTION 每个 demo 都必定含有 FreeRTOSConfig.h 建议去修改 demo 中FreeRTOSConfig.h,而不是从头写一个 |
FreeRTOS.h | 使用 FreeRTOS API 函数时,必须包含此文件。 在 FreeRTOS.h 之后,再去包含其他头文件,比如: task.h、queue.h、semphr.h、event_group.h |
1.5 内存管理
文件在 FreeRTOS/Source/portable/MemMang 下,它也是放在 portable 目录下,表 示你可以提供自己的函数。 源码中默认提供了 5 个文件,对应内存管理的 5 种方法。
文件 | 优点 | 缺点 |
heap_1.c | 分配简单,时间确定 | 只分配、不回收 |
heap_2.c | 动态分配、最佳匹配 | 碎片、时间不定 |
heap_3.c | 调用标准库函数 | 速度慢、时间不定 |
heap_4.c | 相邻空闲内存可合并 | 可解决碎片问题、时间不定 |
heap_5.c | 在 heap_4 基础上支持分隔的内存块 | 可解决碎片问题、时间不定 |
1.6 数据类型和编程规范
1.7.1 数据类型
每个移植的版本都含有自己的 portmacro.h 头文件,里面定义了 2 个数据类型:
▣ TickType_t:
✈ FreeRTOS 配置了一个周期性的时钟中断:Tick Interrupt
✈ 每发生一次中断,中断次数累加,这被称为 tick count
✈ tick count 这个变量的类型就是 TickType_t
✈ TickType_t 可以是 16 位的,也可以是 32 位的
✈ FreeRTOSConfig.h 中定义 configUSE_16_BIT_TICKS 时,TickType_t 就是 uint16_t
✈ 否则 TickType_t 就是 uint32_t
✈ 对于 32 位架构,建议把 TickType_t 配置为 uint32_t
▣ BaseType_t:
✈ 这是该架构最高效的数据类型 32 位架构中,它就是 uint32_t
✈ 16 位架构中,它就是 uint16_t
✈ 8 位架构中,它就是 uint8_t
✈ BaseType_t 通常用作简单的返回值的类型,还有逻辑值,比如 pdTRUE/pdFALS
1.7.2 变量名
变量名有前缀:
变量名前缀 | 含义 |
c | char |
s | int16_t,short |
l | int32_t,long |
x | BaseType_t, 其他非标准的类型:结构体、task handle、queue handle 等 |
u | unsigned |
p | 指针 |
uc | uint8_t,unsigned char |
pc | char 指针 |