FreeRTOS学习
以下内容根据刀哥的文档,进行学习和总结。
FreeRTOS概述
- 如图,是我们从官网下载的FreeRTOS的文件及其每个文件的讲解。
- 移植到工程中,暂时不在这里讲,其他地方有讲,可以进行搜索。
- 主要的文件是:
- Demo
- 存在着,在不同系统上的示例工程。
- source
- 根目录的和兴文件。
- Demo
编程规范
TickType_t:
TickType_t是一个无符号整数类型,用于系统节拍(tick)的计数。
在FreeRTOS中配置着一个周期性的中断:Tick Interrupt。
每次发生中断,中断有一个TICK_Count计数累加。FreeRTOS 启动以来发生的系统时钟节拍的总数。
TICK_Count变量的类型是TickType_t类型的。
TickType_t可能是uint16-t或者uint32-t的。
1
2
3
4
5
6
7
8
9
10
11
12在32位架构中,我们一般设置为uint32-t。
FreeRTOSConfig.h
#define configUSE_16_BIT_TICKS 0 //系统节拍计数器变量数据类型,
portmacro.h
#if( configUSE_16_BIT_TICKS == 1 )
typedef uint16_t TickType_t;
#define portMAX_DELAY ( TickType_t ) 0xffff
#else
typedef uint32_t TickType_t;
#define portMAX_DELAY ( TickType_t ) 0xffffffffUL时间单位:每个系统节拍维持时间由configTICK_RATE_HZ这个宏来定义。
1
2
3
4
5
6
7
8
FreeRTOSConfig.h
#define configTICK_RATE_HZ (1000) //时钟节拍频率,也就是每秒的时钟节拍数,这里设置为1000,周期就是1ms,1秒钟中1000次节拍,1ms一次节拍
portmacro.h
#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ )
1000表示1000ms
1000 / configTICK_RATE_HZ:表示每个节拍维持的时间为1ms。
BaseType_t
一个基本整数类型,通常用于布尔值或者函数的调用状态。
在32位架构中,他是uint32-t类型。
1
2portmacro.h
typedef long BaseType_t;
变量名前缀:
函数名前缀
宏的前缀
内存管理
- task、queue、semaphores、event group等,通常使用的是动态分配:用时分配,不用时释放。
- 在C语言库函数中,由malloc、free函数,但是在FreeRTOS中不适用:
- 不适合用在资源紧缺的嵌入式系统中。
- 可能会造成内存碎片化
- 函数实现过于复杂,占用太多代码空间。
- 在FreeRTOS由专门的内存管理文件:
- heap_1.c文件
- 只分配,不释放:在代码中只实现了pvPortMalloc函数,没有实现vPortFree函数。
- 原理:先定义一个大数组,调用pvPortMalloc时,在数组中分配空间。
- heap_2.c文件
- 可分配,可释放:在函数中实现了pvPortMalloc和vPortFree。
- 采用了最佳匹配算法来分配空间。
- 碎片化:他不会合并空闲相邻的内存,会造成严重的碎片化问题。
- 速度:比heap1分配速度要慢,但是比C库函数malloc、free速度要快。
- heap_3.c文件
- 直接使用C库中malloc、free函数。
- 不是线程安全的。标准库的
malloc()
和free()
通常不是为多任务环境设计的,可能存在竞态条件。因此,FreeRTOS 会在调用这些函数时禁用调度器,以确保线程安全,但这可能会影响实时性。
- heap_4.c文件
- 同样使用大数组分配内存。
- 合并空闲内存:heap4使用first fit来分配内存,并且可以将相邻的空闲内存块合并。
- heap_5.c文件
- heap_5: 分配内存、释放内存的算法跟heap_4相同。
- heap_5不在局限于在一个大的数组中进行内存管理。允许从多个不连续的内存区域分配内存。
- heap_1.c文件