文章目录
FreeRTOS内部源码命名规范
1. 数据类型命名规范

每个移植的freertos都有自己的portmacro.h文件,里面定义了两个数据类型
BaseType_t:
相当于系统的"通用返回值类型"
用于函数返回值或逻辑判断(真/假)
自动适配当前硬件最高效的整数类型
32位CPU → uint32_t
16位CPU → uint16_t
8位CPU →uint8_t
TickType_t:
系统的"心跳计数器"类型
freertos配置了一个周期性的时钟中断,每次中断累加被称为tick_count,记录时钟中断次数
如果freertosConfig.h中配置为configUse_16_bit,那就是16位,否则32位
2. 变量命名规则


3.函数命名规则

命名模式:[返回值前缀][模块名][功能描述]

这样看函数的前缀,就能够得知返回值类型,模块名,功能
4. 宏定义规则


对于一些宏定义,看前缀就能得知其来自于哪里,属于系统配置,还是硬件配置,任务相关,通用逻辑值还是错误状态码
前缀表示来源模块
freertos具体的任务创建删除逻辑设计
任务操作

创建任务的参数详解
xTaskCreate(
led_task, // 任务函数 → 你要执行的操作(比如控制LED)
"LED_Control", // 任务昵称 → 方便调试识别
128, // 栈空间大小 → 类似工作台面积(单位:字)
3, // 优先级 → 数值越大越优先(0最低)
&led_handle // 任务句柄 → 任务的身份证
);
动态创建任务
检查配置 → 确保FreeRTOS.h里configSUPPORT_DYNAMIC_ALLOCATION=1(默认就是)
写任务函数 → 像写普通函数一样
void led_task(void *param) {
while(1) {
GPIO_Write(GPIOD, GPIO_PIN_8, 1); // 点亮PD8
vTaskDelay(500); // 等500ms
}
}
调用创建函数 → 用xTaskCreate生成任务
动态 vs 静态任务

任务调度
优先级数字越大越优先(3>2>1)
空闲任务永远是优先级0
同优先级任务会轮流执行(时间片轮转)
//2.开始调度任务
vTaskStartScheduler();
任务操作
删除任务:
vTaskDelete(led_handle); // 注销LED任务
暂停/恢复任务
// 按下按键暂停
vTaskSuspend(led_handle);
// 再按按键恢复
vTaskResume(led_handle);
freertos内部的任务调度块
任务控制块(TCB)
相当于任务的"身份证",存储任务的所有关键信息
typedef struct tskTaskControlBlock {
volatile StackType_t *pxTopOfStack; // 栈顶指针(必须放在首位)
ListItem_t xStateListItem; // 任务状态(就绪/阻塞/挂起)
ListItem_t xEventListItem; // 事件关联项
UBaseType_t uxPriority; // 优先级(0=最低)
StackType_t *pxStack; // 栈起始位置
char pcTaskName[configMAX_TASK_NAME_LEN]; // 任务名称(调试用)
... // 其他字段
} tskTCB;
为每个任务分配一个任务控制块,存储任务状态信息,包括指向任务上下文的指针(任务的运行时环境,包括寄存器值)。
该结构体包括以下成员:
● volatile StackType_t * pxTopOfStack:指向任务堆栈上最后一个放置的项目的位置。这必须是 TCB 结构体的第一个成员。
● ListItem_t xStateListItem:任务状态列表项所引用的列表表示任务的状态(就绪、阻塞、挂起)。
● ListItem_t xEventListItem:用于从事件列表中引用任务。
● UBaseType_t uxPriority:任务的优先级。0 是最低优先级。
● StackType_t * pxStack:指向堆栈的起始位置。
● char pcTaskName[configMAX_TASK_NAME_LEN]:在创建任务时赋予任务的描述性名称。仅用于便于调试
任务调度机制
其实就是一种任务调度的策略
- 创建空闲任务
- 如果使能软件定时器,则创建定时器任务
- 关闭中断,防止调度器开启之前或过程中,受中断干扰,会在运行第一个任务时打开中断
- 初始化全局变量,并将任务调度器的运行标志设置为已运行
- 初始化任务运行时间统计功能的时基定时器
- 调用函数 xPortStartScheduler()
其实就是做了如下事情:
优先级配置
初始化timer中断
启动第一个任务
任务上下文切换
它具体的调度策略是这样的
- 任务优先级:每个任务都有一个唯一的优先级,优先级值越高,表示任务优先级越高。在任务创建时,可以指定任务的优先级。
- 任务就绪列表:FreeRTOS 会维护一个就绪列表,其中包含所有就绪(可执行)状态的任务。就绪列表按照任务的优先级进行排序。
- 调度器:FreeRTOS 调度器负责根据任务的优先级选择下


2万+

被折叠的 条评论
为什么被折叠?



