一、基本配置 1.1 数据类型
FreeRTOS 使用的数据类型主要分为 stdint.h 文件中定义的和自己定义的两种
FreeRTOS 主要自定义了以下四种数据类型:
TickType_t----32 位无符号数( 32位MCU,配置configUSE_16_BIT_TICKS = 0)
BaseType_t----32 位有符号数(32位MCU)
UBaseType_t---32 位无符号数(BaseType_t类型无符号版本)
StackType_t----32 位变量(栈变量数据类型定义,32位MCU)
uint32_t 定义的变量都加上前缀 ul。u 代表 unsigned 无符号,l 代表 long 长整型。
uint16_t 定义的变量都加上前缀 us。u 代表 unsigned 无符号,s 代表 short 短整型。
uint8_t 定义的变量都加上前缀 uc。u 代表 unsigned 无符号,c 代表 char 字符型。
stdint.h 文件中未定义的变量类型,在定义变量时需要加上前缀 x,比如 BaseType_t 和
TickType_t 定义的变量。
stdint.h 文件中未定义的无符号变量类型,在定义变量时要加上前缀 u,比如 UBaseType_t 定义
的变量要加上前缀 ux。
size_t 定义的变量也要加上前缀 ux。
枚举变量会加上前缀 e。
指针变量会加上前缀 p,比如 uint16_t 定义的指针变量会加上前缀 pus。
根据 MISRA 代码规则,char 定义的变量只能用于 ASCII 字符,前缀使用 c。
根据 MISRA 代码规则,char *定义的指针变量只能用于 ASCII 字符串,前缀使用 pc。
函数加上了 static 声明的函数,定义时要加上前缀 prv,这个是单词 private 的缩写。
带有返回值的函数,根据返回值的数据类型,加上相应的前缀,如果没有返回值,即 void 类型
,函数的前缀加上字母 v。
根据文件名,文件中相应的函数定义时也将文件名加到函数命名中,比如 tasks.c 文件中函数
vTaskDelete,函数中的 task 就是文件名中的 task。
根据宏定义所在的文件,文件中的宏定义声明时也将文件名加到宏定义中,比如宏定义
configUSE_PREEMPTION 是定义在文件 FreeRTOSConfig.h 里面。宏定义中的 config 就是文
件名中的 config。另外注意,前缀要小写。
除了前缀,其余部分全部大写,同时用下划线分开。
排版和注释缩进
Tab 制表符用于缩进,Tab 一次缩进 4 个字符空间。
注释
FreeRTOS 中注释不会超过 80 个字符宽度,除非对函数的参数进行注释时。源码中主要是采用/* */
的形式进行注释,不采用 C++中的双斜杠风格来注释。
1,局部变量,函数调用时的现场保护和返回地址,函数的形参,进入中断函数前和中断嵌套等都需要栈空间,栈空间定义小了会造成系统崩溃
2,实际分配的栈大小可以在最小栈需求的基础上乘以一个安全系数,一般取 1.5-2
3,栈生长方向从高地址向低地址生长(M4 和 M3 是这种方式)
任务栈不使用系统栈控件,中断函数和中断嵌套使用
Cortex-M3 和 M4 内核具有双堆栈指针,MSP 主堆栈指针和 PSP 进程堆栈指针
在 FreeRTOS 操作系统中,主堆栈指针 MSP 是给系统栈空间使用的,进
程堆栈指针 PSP 是给任务栈使用的
对于 Cortex-M3 内核和未使用 FPU(浮点运算单元)功能的 Cortex-M4 内核,需要64字节
对于具有 FPU(浮点运算单元)功能的 Cortex-M4 内核,需要200字节
FreeRTOS 中任务的最高优先级是通过 FreeRTOSConfig.h 文件中的 configMAX_PRIORITIES 进行配置的,用户实际可以使用的优先级范围是 0 到 configMAX_PRIORITIES – 1
用户配置任务的优先级数值越小,那么此任务的优先级越低,空闲任务的优先级是 0
建议用户配置宏定义 configMAX_PRIORITIES 的最大值不要超过 32
FreeRTOS 中处于运行状态的任务永远是当前能够运行的最高优先级任务
2.3.1 任务优先级分配IRQ 任务:IRQ 任务是指通过中断服务程序进行触发的任务,此类任务应该设置为所有任务里面优先级最高的