一文看懂学会—— freertos

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]:在创建任务时赋予任务的描述性名称。仅用于便于调试

任务调度机制

其实就是一种任务调度的策略

  1. 创建空闲任务
  2. 如果使能软件定时器,则创建定时器任务
  3. 关闭中断,防止调度器开启之前或过程中,受中断干扰,会在运行第一个任务时打开中断
  4. 初始化全局变量,并将任务调度器的运行标志设置为已运行
  5. 初始化任务运行时间统计功能的时基定时器
  6. 调用函数 xPortStartScheduler()
    其实就是做了如下事情:
    优先级配置
    初始化timer中断
    启动第一个任务
    任务上下文切换

它具体的调度策略是这样的

  1. 任务优先级:每个任务都有一个唯一的优先级,优先级值越高,表示任务优先级越高。在任务创建时,可以指定任务的优先级。
  2. 任务就绪列表:FreeRTOS 会维护一个就绪列表,其中包含所有就绪(可执行)状态的任务。就绪列表按照任务的优先级进行排序。
  3. 调度器:FreeRTOS 调度器负责根据任务的优先级选择下
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值