STM32Cube-FreeRTOS任务调度与任务管理-笔记

STM32Cube-FreeRTOS任务调度与任务管理-笔记

    • 一、任务调度机制
      • 1.1 调度算法类型
    • 二、抢占式调度实现与分析
      • 2.1 时间片轮转机制
      • 2.2 调度触发条件
      • 2.3 抢占式调度例子
    • 三、合作式调度实现
      • 3.1 核心逻辑
      • 3.1 合作式调度例子
    • 四、任务管理函数详解
      • 4.1 任务创建
        • 4.1.1 动态创建任务
        • 4.1.2 静态创建任务(手动分配资源)
      • 4.2 任务删除
      • 4.3 挂起与恢复任务
        • 4.3.1 挂起任务
        • 4.3.2 恢复任务
      • 4.4 调度器控制
        • 4.4.1 开启调度器
        • 4.4.2 暂停调度器
        • 4.4.3 恢复调度器
      • 4.5 延时与阻塞
        • 4.5.1 基础延时
        • 4.5.2 周期性精确延时
        • 4.5.3 终止延时
      • 4.6 时间相关函数
        • 4.6.1 获取当前Tick值
        • 4.6.2 终止任务延时
    • 五、配置与优化建议
      • 5.1 调度算法选择
      • 5.2 优先级与时间片配置
      • 5.3 低功耗优化
    • 六、常见问题与注意事项


一、任务调度机制

1.1 调度算法类型

在这里插入图片描述

FreeRTOS支持两种调度算法:

  1. 抢占式调度(Preemptive Scheduling)

    • 特点:高优先级任务可抢占低优先级任务的CPU使用权。
    • 时间片轮转
      • 启用时间片:相同优先级任务间按时间片(默认1ms)轮转。
      • 禁用时间片:仅在更高优先级任务就绪或当前任务主动让出CPU时切换。
    • 配置方式:在STM32CubeMX中设置 USE_PREEMPTIONEnable
      在这里插入图片描述
  2. 合作式调度(Cooperative Scheduling)

    • 特点:任务需主动让出CPU(如调用 taskYIELD()),否则不会被抢占。
    • 配置方式:在STM32CubeMX中设置 USE_PREEMPTIONDisable

二、抢占式调度实现与分析

2.1 时间片轮转机制

  • 基础时钟(Tick)

    • FreeRTOS基础时钟的一个定时周期称为一个时间片(timeslice),默认值为1ms。当使用时间片时,在基础时钟的每次中断里会要求进行一次上下文切换(contextswitching),函数xPortSysTickHandler()就是SysTick定时中断的处理函数。
    • 时间片长度可通过 configTICK_RATE_HZ 宏调整(如设置为100Hz即10ms/次)。 在这里插入图片描述
  • 中断优先级配置
    在这里插入图片描述

    • 优先级分组:默认将全部4位用于抢占优先级(如 configPRIO_BITS=4),系统中断优先级设为最低(15),确保RTOS任务优先级高于中断。

2.2 调度触发条件

  • 使用时间片时
    • 每个时间片(默认1ms)触发一次任务切换。
  • 不使用时间片时
    • 仅在以下情况切换任务:
      1. 更高优先级任务进入就绪态。
      2. 当前任务进入阻塞态或挂起态。
    • 优点:减少上下文切换频率,降低CPU负担。
    • 缺点:同优先级任务可能因时间分配不均导致不公平。

2.3 抢占式调度例子

在这里插入图片描述

这张图可以说明带时间片的抢占式任务优先级的特点。

假设task2具有高优先级,task1具有正常优先级,且这两个任务的优先级都高于空闲任务的优先级。那么首先T1时刻是空闲任务在运行,在这一段时间里面系统里面没有其他任务处于就绪状态。在T2时刻进行了调度,task一抢占CPU开始运行,这是因为task1的优先级高于空闲任务。我们在task 3时刻,task1就进入了阻塞态,就让出了CPU的使用权。空闲任务又进入了运行状态。

在T4时刻task1又进入了运行态,在T5时刻更高优先级的task2抢占了CPU的运行。那么这个时候,task1就进入了就绪态,在T6时刻task2进入了阻塞状态,让出了CPU使用权。那么task1就可以从就绪态变为运行态。在T7时刻task一进入了阻塞状态,主动让出了CPU使用权,空闲任务就又进入了运行状态。


三、合作式调度实现

3.1 核心逻辑

  • 特点
    • 使用合作式任务调度方法时,FreeRTOS不主动进行上下文切换,而是运行状态的任务进入阻塞状态,或显式地调用taskYIELD()函数让出CPU使用权时才进行上下文切换。
    • 任务不会发生抢占,所以也不使用时间片,函数taskYIELD()的作用就是主动申请进行一次上下文切换
  • 典型场景
    • 需精确控制任务执行顺序(如调试阶段)。
    • 任务间无优先级差异,需按需轮询。

3.1 合作式调度例子

在这里插入图片描述


四、任务管理函数详解

4.1 任务创建

4.1.1 动态创建任务
BaseType_t xTaskCreate(TaskFunction_t pxTaskCode,      // 任务函数指针const char * const pcName,      // 任务名称(调试用)configSTACK_DEPTH_TYPE usStackDepth, // 栈大小(单位:字)void * const pvParameters,      // 任务参数UBaseType_t uxPriority,         // 优先级(数值越小优先级越低)TaskHandle_t * const pxCreatedTask // 返回任务句柄
);

在这里插入图片描述

  • 特点:RTOS自动分配栈和TCB空间。
4.1.2 静态创建任务(手动分配资源)
TaskHandle_t xTaskCreateStatic(TaskFunction_t pxTaskCode,      // 任务函数指针const char * const pcName,      // 任务名称const uint32_t ulStackDepth,    // 栈大小(单位:字)void * const pvParameters,      // 任务参数UBaseType_t uxPriority,         // 优先级StackType_t * const puxStackBuffer, // 静态分配的栈空间StaticTask_t * const pxTaskBuffer // 静态分配的任务控制块
);

在这里插入图片描述

  • 特点:适用于内存有限的场景,需手动分配栈和TCB空间。

4.2 任务删除

void vTaskDelete(TaskHandle_t xTaskToDelete);
  • 功能
    • 删除指定任务(传入 NULL 表示删除自身)。
    • 自动释放RTOS分配的栈和TCB,但需手动释放任务内动态分配的内存。
    • 需要说明该函数它需要传入的参数是需要删除的任务的句柄。但需要注意,如果要删除的是任务,自己必须在跳出任务死循环之后,在退出任务函数之前执行vTaskDelete删除任务时,自动释放系统自动分配的内存,如动态分配的占空间和任务控制块。但是在任务内,用户自己分配的内存需要在删除任务之前手工释放。

4.3 挂起与恢复任务

4.3.1 挂起任务
void vTaskSuspend(TaskHandle_t xTaskToSuspend);
  • 功能
    • 挂起指定任务(传入 NULL 表示挂起自身)。
    • 挂起的任务不参与调度,需其他任务调用 vTaskResume() 恢复。
4.3.2 恢复任务
void vTaskResume(TaskHandle_t xTaskToResume);
  • 功能
    • 恢复被挂起的任务,使其进入就绪态。
    • 注意:只能在其他任务中调用(不可恢复自身)。

4.4 调度器控制

4.4.1 开启调度器
void vTaskStartScheduler();
  • 功能:启动RTOS调度器,开始任务调度。
4.4.2 暂停调度器
void vTaskSuspendAll();
  • 功能:暂停所有任务调度,进入临界区。
4.4.3 恢复调度器
BaseType_t xTaskResumeAll();
  • 功能:恢复调度器并返回暂停前的就绪任务状态。

4.5 延时与阻塞

4.5.1 基础延时
void vTaskDelay(TickType_t xTicksToDelay);
  • 功能:将任务阻塞指定Tick数(如 vTaskDelay(100) 阻塞100ms)。
4.5.2 周期性精确延时

在这里插入图片描述

BaseType_t xTaskDelayUntil(TickType_t * const pxPreviousWakeTime, // 上次唤醒时间const TickType_t xTimeIncrement        // 周期间隔(单位:Tick)
);
  • 功能:用于周期性任务,确保任务以固定间隔执行。
4.5.3 终止延时
void vTaskDelayUntil( /* ... */ );
  • 功能:可配合 xTaskDelayUntil() 实现精确周期任务。

4.6 时间相关函数

4.6.1 获取当前Tick值
TickType_t xTaskGetTickCount();
  • 功能:返回自系统启动以来的Tick总数。
4.6.2 终止任务延时
BaseType_t xTaskCheckForTimeOut( /* ... */ );
  • 功能:检查任务是否超时,用于手动处理延时逻辑。

五、配置与优化建议

5.1 调度算法选择

  • 抢占式调度
    • 适用场景:实时性要求高的系统(如工业控制)。
    • 配置:STM32CubeMX中启用 USE_PREEMPTION
  • 合作式调度
    • 适用场景:资源受限或需严格控制任务切换的场景。

5.2 优先级与时间片配置

  • 优先级分组
    • 通过 configPRIO_BITS 宏配置抢占优先级与子优先级分配(如 configPRIO_BITS=4 表示4位抢占优先级)。
  • 时间片调整
    • 通过 configTICK_RATE_HZ 修改Tick频率(如设置为100Hz降低中断频率)。

5.3 低功耗优化

  • Tickless模式
    • 配置 configUSE_TICKLESS_IDLE=1,在空闲时关闭SysTick,降低功耗。

六、常见问题与注意事项

  1. 任务栈大小
    • 动态任务需合理设置栈大小,避免栈溢出。
    • 静态任务需手动分配足够内存。
  2. 内存管理
    • 删除任务前需手动释放动态分配的内存。
  3. 中断优先级
    • 确保RTOS任务优先级低于系统中断(如 configMAX_SYSCALL_INTERRUPT_PRIORITY)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/79662.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

对称加密算法(AES、ChaCha20和SM4)Python实现——密码学基础(Python出现No module named “Crypto” 解决方案)

文章目录 一、对称加密算法基础1.1 对称加密算法的基本原理1.2 对称加密的主要工作模式 二、AES加密算法详解2.1 AES基本介绍2.2 AES加密过程2.3 Python中实现AES加密Python出现No module named “Crypto” 解决方案 2.4 AES的安全考量 三、ChaCha20加密算法3.1 ChaCha20基本介…

MATLAB图像加密案例

下面是一个使用 MATLAB 编写的简单图像块置乱加密/解密程序,主要利用了函数来组织代码。 这个程序通过将图像分割成小块,然后根据一个密钥(用于随机数生成器种子)打乱这些块的顺序来实现加密。解密过程则使用相同的密钥恢复原始块顺序。 核心思想: 分块: 将图像划分为 …

阿里云服务器全栈技术指导手册(2025版)

阿里云服务器全栈技术指导手册(2025版) 一、基础配置与核心架构设计 1. 精准实例选型策略 • 通用计算场景:选择ECS通用型(如ecs.g7)实例,搭载第三代Intel Xeon处理器,适合Web应用、中小型数…

word批量转pdf工具

word批量转pdf工具 图片 说到了办公,怎能不提PDF转换哦? 这是一款一键就可以批量word转换为PDF的小工具,简直是VB界的一股清流。 图片 操作简单到不行,只要把需要转换的word文件和这个工具放在同一个文件夹里,双击…

C++类_协变返回类型

协变返回类型定义 在 C11 中,协变返回类型是指在基类和派生类的虚函数重写时,派生类中重写的虚函数的返回类型可以是基类中对应虚函数返回类型的派生类型。也就是说,当基类的虚函数返回一个基类指针或引用时,派生类中重写该虚函数…

补充:建立实体类与数据表的映射关系

目录 前言 1 成员变量数据类型和字段类型 保持对应 2 成员变量的变量名,应采用小驼峰命名法 3 数据表中的主键如id 应采用自增方式 4 数据表中的时间类型数据与实体类中的时间类型的变量无法实现自动映射可以使用JsonFormat 注解 4.1 配置全局时间处理器&#x…

HTML/CSS 魔法第二弹:会逃跑的调皮按钮(悬停自动闪避)

引言 在网页设计中,交互性是吸引用户的关键因素之一。普通的按钮在用户悬停时可能只是颜色或样式发生改变,但今天我们要创造一个 “调皮” 的按钮,当用户鼠标悬停在上面时,它会自动闪避,仿佛在和用户玩游戏。本文将详…

**Java面试:技术大比拼**

互联网大厂Java面试:一场严肃与搞笑交织的技术拷问 场景:互联网大厂面试间 面试官(严肃):请坐。马小帅,我们今天主要考察一下你在Java技术栈上的掌握程度,以及如何将这些技术应用于实际业务场景…

25考频高的前端面试题

请求失败会弹出一个toast,如何保证批量请求失败,只弹出一个toast 设置全局标志位,定义一个全局变量(如isToastShown)来表示是否已经弹出过toast。在请求失败的处理逻辑中,首先检查该标志位。如果尚未弹出toast&#xf…

命令模式(Command Pattern)详解

文章目录 1. 什么是命令模式?2. 为什么需要命令模式?3. 命令模式的核心概念4. 命令模式的结构5. 命令模式的基本实现5.1 简单的灯光控制示例5.2 家电控制示例6. 带有撤销功能的命令模式6.1 修改命令接口6.2 实现可撤销的灯光命令6.3 实现可撤销的风扇命令6.4 修改调用者,支持…

《Vue3学习手记8》

vue3中的一些API shallowRef ( ) 和shallowReactive ( ) shallowRef (浅层响应式) 1.作用:创建一个响应式数据,但只对顶层属性进行响应式处理。 2.用法: const originalref(...) const original2shallowRef(original) 3.特点:只跟踪引用值的变化,不关心…

双列集合——map集合和三种遍历方式

双列集合的特点 键和值一一对应,每个键只能对应自己的值 一个键和值整体称为键值对或键值对对象,java中叫做entry对象。 map常见的api map接口中定义了双列集合所有的共性方法,下面三个实现类就没有什么额外新的方法要学习了。 map接口…

Linux安装部署Postgresql数据库

联网安装方案 Linux能在线安装依赖组件的前提下,可以快速安装部署PG数据库,安装过程使用root管理员帐号: 首先,使用如下命令自动下载Postgresql组件: # 在openEuler、Fedora或CentOS 8上,你可能会使用&a…

供应链算法整理(二)--- 智能补货

供应链业务的目标价值是:优化货品的供给、销售提供支撑,以降低成本,提高时效、收益,最终提升用户体验。基于目标价值,整体的算法模块分为:智能选品、智能预测、品仓铺货、智能补货、智能调拨、仓网路由、快…

vscode 个性化

vscode 个性化 设置 吸顶效果 使用前使用后 设置方法 VS Code 的粘性滚动预览 - 类似于 Excel 的冻结首行 插件 代码片段分享 - CodeSnap 使用方式 CtrlShiftP输入CodeSnap 唤起插件选择代码 行内报错提示 - Error Lens 使用前使用后 VSCode Error Lens插件介绍&…

Rockermq的部署与使用(0-1)

​RocketMQ​ 是阿里巴巴开源的一款 ​分布式消息中间件,具有高吞吐、低延迟、高可用等特点,广泛应用于多个领域,包括异步通信解耦、企业解决方案、金融支付、电信、电子商务、快递物流、广告营销、社交、即时通信、移动应用、手游、视频、物…

软件测试报告机构如何保障软件质量并维护其安全性?

软件测试报告机构在软件开发流程里起着十分关键的作用,它可以保障软件的质量,它还能够维护软件的安全性。下面,我们就来深入了解一下这类机构。 机构作用 软件测试报告机构是软件质量的“把关者”,能对软件进行全面评估&#xf…

4个纯CSS自定义的简单而优雅的滚动条样式

今天发现 uni-app 项目的滚动条不显示,查了下原来是设置了 ::-webkit-scrollbar {display: none; } 那么怎么用 css 设置滚动条样式呢? 定义滚动条整体样式‌ ::-webkit-scrollbar 定义滚动条滑块样式 ::-webkit-scrollbar-thumb 定义滚动条轨道样式‌…

ES6入门---第二单元 模块五:模块化

js不支持模块化 注意: 需要放到服务器环境 1、如何定义模块? export 东西 例:1.js文件中 console.log(1模块加载了);//显示是否加载了 export const a 12; export const b 5; export let c 101; const a12; const b5; const c101;ex…

14.Excel:排序和筛选

一 位置 两个位置。 二 排序:如何使用 1.常规使用 补充:不弹出排序提醒排序。 选中要排序列中的任意一个单元格,然后排序。 2.根据要求进行排序 1.根据姓名笔画进行降序排序 要勾选上数据包含标题,默认是勾选了。 2.根据运营部、…