1.1. FreeRTOS目录结构
以Keil工具下的STM32F103芯片为例子,它的FreeRTOS的目录如下:
主要涉及两个目录:
- Demo
- Demo目录下是工程文件,以芯片和编译器组合成一个名字
- 比如:CORTEX_STM32F103Keil
- Source
- 根目录下是核心文件,这些文件是通用的
- portable目录下是移植时需要实现的文件
- 目录名:[complier] /[architecture]
- 比如:RVDS/ARM_CM3,这表示cortexM3架构在RVDS工具上的移植文件
1.2. 核心文件
FreeRTOS的最核心的文件只有两个:
- FreeRTOS/Source/task.c
- FreeRTOS/Source/list.c
其他文件的作用如下:
FreeRTOS/Source/下的文件 | 作用 |
task.c list.c queue.c timer.c event_group.c croutine.c | 必需,任务操作 必需,列表 基本必需,提供队列操作、信号量(semaphore)操作 可选,software timer 可选,提供event_group功能 可选,过时了 |
1.3. 移植时涉及的文件
移植FreeRTOS时涉及的文件放在
FreeRTOS/Source/portable/[compiler]/[architecture]目录下:
比如:RVDS/ARM_CM3,这表示cortexM3架构在RVDS或Keil工具上的移植文件。
里面有两个文件
port.c
portmacro.h
1.4.. 头文件相关
1.4.1 头文件相关
FreeRTOS需要3个头文件目录:
FreeRTOS本身的头文件:FreeRTOS/Source/include
移植时用到的头文件:FreeRTOS/Source/include/[compiler]/[architecture]
含有配置文件FreeRTOSConfig.h的目录
1.4.2 头文件
列表如下:
头文件 | 作用 |
FreeRTOSConfig.h FreeRTOS.h | FreeRTOS的配置文件,比如 选择调度算法,configUSE_PREEMPTION每个demo都必定含有FreeRTOSConfig.h,建议去修改demo中的FreeRTOSConfig.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.c基础上支持分隔的内存块 | 可解决碎片问题,时间不定 |
1.6 数据类型和编程规范
1.6.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/pdFALSE
1.6.2 变量名
变量名有前缀
变量名前缀 | 含义 |
c s l x u p uc pc | char int16_t, short int32_t, long BaseType_t,其他非标准的类型:结构体、task_handle、queue_handle等 unsigned 指针 uint8_t、unsigned char char指针 |
1.6.3 函数名
函数名的前缀有两部分,返回值类型和在哪个文件定义
通用的宏如下;
注:逻辑分析仪只能观察全局变量