RTOS系统 -- FreeRTOS之任务调度

FreeRTOS中的任务调度

背景介绍

FreeRTOS是一种轻量级的实时操作系统,被广泛应用于嵌入式系统中。它提供了多任务管理功能,包括任务创建、任务调度和任务切换。FreeRTOS的调度器根据任务的优先级和状态自动调度任务,确保系统资源的有效利用和实时性。

在M4处理器上,FreeRTOS能够实现任务间的自动调度。调度器采用基于优先级的抢占式调度算法,确保系统总是运行最高优先级且处于就绪状态的任务。如果有多个任务具有相同的优先级,调度器会采用时间片轮转的方法在这些任务之间切换。

主动调度

尽管FreeRTOS的调度器通常会自动管理任务的调度,但有时我们需要手动干预任务调度。这可以通过以下几种方式实现:

1. 任务切换

通过调用任务切换函数,可以强制调度器立即进行任务切换。

taskYIELD();  // 手动触发任务切换

2. 优先级调整

通过调整任务的优先级,可以影响调度器的行为,立即切换到新的最高优先级任务。

vTaskPrioritySet(xTaskHandle, uxNewPriority);  // 改变任务优先级

3. 任务通知

通过任务通知机制,可以实现任务之间的同步和通信,从而影响调度器的行为。

xTaskNotifyGive(xTaskHandle);  // 通知任务

4. 中断服务例程(ISR)中的调度

在中断服务例程中,可以通过设置上下文切换请求标志来强制任务调度。

portYIELD_FROM_ISR(xHigherPriorityTaskWoken);  // 在ISR中触发任务调度

示例代码

以下是一些示例代码,展示如何通过上述方法主动调度任务。

任务切换

void vTask1(void *pvParameters) {for(;;) {// 任务代码taskYIELD();  // 主动触发任务切换}
}void vTask2(void *pvParameters) {for(;;) {// 任务代码}
}

优先级调整

void vTask1(void *pvParameters) {for(;;) {// 任务代码vTaskPrioritySet(NULL, uxNewPriority);  // 改变自身优先级}
}void vTask2(void *pvParameters) {for(;;) {// 任务代码}
}

任务通知

void vTask1(void *pvParameters) {for(;;) {// 等待通知ulTaskNotifyTake(pdTRUE, portMAX_DELAY);// 被通知后继续执行}
}void vTask2(void *pvParameters) {for(;;) {// 任务代码xTaskNotifyGive(xTask1Handle);  // 通知任务1}
}

中断服务例程中的调度

void vISRHandler(void) {BaseType_t xHigherPriorityTaskWoken = pdFALSE;// 处理中断// ...// 触发任务调度portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
}

优先级说明

在FreeRTOS中,优先级的值越大,优先级越高。FreeRTOS使用整数值来表示任务的优先级,值越大表示优先级越高。任务的优先级决定了调度器选择哪个任务来运行。当有多个任务处于就绪状态时,调度器会选择优先级最高的任务来运行。

示例说明
例如,如果你创建了三个任务,并设置它们的优先级如下:

  • 任务A:优先级为1
  • 任务B:优先级为2
  • 任务C:优先级为3

在这种情况下,任务C的优先级最高,因此调度器会首先运行任务C。如果任务C阻塞或进入等待状态,调度器会选择下一个优先级最高的任务,即任务B来运行。

创建任务时设置优先级
在创建任务时,你可以通过uxPriority参数来设置任务的优先级。以下是一个示例代码:

#include "FreeRTOS.h"
#include "task.h"void vTaskA(void *pvParameters) {for(;;) {// 任务A的代码}
}void vTaskB(void *pvParameters) {for(;;) {// 任务B的代码}
}void vTaskC(void *pvParameters) {for(;;) {// 任务C的代码}
}int main(void) {// 创建任务A,优先级为1xTaskCreate(vTaskA, "Task A", 1000, NULL, 1, NULL);// 创建任务B,优先级为2xTaskCreate(vTaskB, "Task B", 1000, NULL, 2, NULL);// 创建任务C,优先级为3xTaskCreate(vTaskC, "Task C", 1000, NULL, 3, NULL);// 启动调度器vTaskStartScheduler();// 由于调度器已经启动,通常不会运行到这里for(;;);
}

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

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

相关文章

独立站优势及吸引力分析

随着全球化贸易的不断深入,越来越多的厂商开始寻求更广阔的市场和更高效的销售渠道。独立站作为企业自有的电商网站,正逐渐成为海外贸易的新宠。本文将分析独立站的优势及其对厂商的吸引力,鼓励厂商以建立独立站的方式出海。 一、独立站的定义…

el-image放大图片功能

1.需求&#xff1a;点击图片后放大图片 html代码&#xff1a; <el-imagestyle"width: 100px; height: 100px":src"baseUrl item.id":zoom-rate"1.2":max-scale"7":min-scale"0.2":preview-src-list"srcList"…

Xilinx FPGA UltraScale SelectIO 接口逻辑资源

目录 1. 简介 2. Bank Overview 2.1 Diagram 2.2 IOB 2.3 Slice 2.4 Byte Group 2.5 I/O bank 示例 2.6 Pin Definition 2.7 数字控制阻抗(DCI) 2.8 SelectIO 管脚供电电压 2.8.1 VCCO 2.8.2 VREF 2.8.3 VCCAUX 2.8.4 VCCAUX_IO 2.8.5 VCCINT_IO 3. 总结 1. 简介…

Vue利用递归的方法,根据id获取对应的字段名(树形数据)

树形数据源 options:[{ancestors: "0",code: "99",id: "99",name: "测试部门1",parentId: "0",children: [{ancestors: "0,99",code: "test",id: "1720269456426344449",name: "测试子部…

【国潮】软件本土化探索

文章目录 一、国产-操作系统银河麒麟&#xff08;Kylin&#xff09;操作系统华为鸿蒙系统&#xff08;HarmonyOS&#xff09;统信UOS深度Deepin 二、国产-服务器华为鲲鹏&#xff1a;飞腾&#xff1a;海光&#xff1a;兆芯&#xff1a;龙芯&#xff1a;申威&#xff1a; 三、国…

Redis学习 - 基础篇

Redis学习 - 基础篇 一. 简介 Redis 是一个高性能的key-value数据库&#xff0c;常用的数据类型如下&#xff1a;string&#xff0c;list&#xff0c;set&#xff0c;zset&#xff0c;hash 二. 安装 Widows和Linux下如何安装Redis-CSDN博客 三. 常用命令 配置及数据库操作…

《信息技术与信息化 》是什么级别的期刊?是正规期刊吗?能评职称吗?

问题解答 问&#xff1a;《信息技术与信息化 》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知网收录的第一批认定学术期刊。 问&#xff1a;《信息技术与信息化 》级别&#xff1f; 答&#xff1a;省级。主管单位&#xff1a;山东省科学技术协会 主办单…

国内磁性器件核心企业『云路新能源』携手企企通正式启动SRM项目,供应链竞争力再上新台阶

近日&#xff0c;珠海黎明云路新能源科技有限公司&#xff08;以下简称“云路新能源”&#xff09;携手企企通启动SRM数字化采购供应链管理项目&#xff0c;双方相关负责人与项目组成员出席本次启动会。 本次采购数字化项目建设&#xff0c;企企通将助力云路新能源实现采购全场…

智能无人数字直播间 打造24小时的无人直播间源码系统 带网站的安装代码包以及搭建教程

系统概述 智能无人数字直播间系统是一种基于人工智能技术的软件工具&#xff0c;它结合了高精度扫描建模、自动化控制、多模态生成等多项先进技术&#xff0c;能够实现对真实人物的高度仿真&#xff0c;并自主执行各类直播任务。该系统不仅支持24小时不间断直播&#xff0c;还…

微信小程序引入自定义子组件报错,在 C:/Users/***/WeChatProjects/miniprogram-1/components/路径下***

使用原生小程序开发时候&#xff0c;会报下面的错误&#xff0c; [ pages/button/button.json 文件内容错误] pages/button/button.json: [“usingComponents”][“second-component”]: “…/…/components/second-child/index”&#xff0c;在 C:/Users/***/WeChatProjects/m…

Windows 中修改 MySQL 密码

没想到这样一个简单的需求&#xff0c;愣是试了半天没试到有用的命令&#xff0c;最后终于找到一个有用的&#xff0c;在此做个记录&#xff1a; set password for rootlocalhost 你的新密码;

【C++与python】| splice语法对比列表切片

splice用法详解 C 中的 splice示例 1&#xff1a;将整个列表 lst2 插入到 lst1 中某个位置示例 2&#xff1a;将 lst2 的一个元素插入到 lst1 中某个位置 Python中的列表切片&#xff08;Slicing&#xff09;示例 1&#xff1a;获取列表的子列表示例 2&#xff1a;修改列表的子…

禅道二次开发——禅道zentaoPHP框架扩展机制——对视图层(view)扩展

视图文件的扩展分为两种方式&#xff0c;一种是完全覆盖&#xff0c;第二种是通过钩子机制来扩展。 一、完全覆盖 视图文件的覆盖可以通过完全覆盖的方式来重新定义。比如我对bug模块的create页面进行扩展。原来的视图文件是存放在module/bug/view/create.html.php。如果需要…

Android约束布局的概念与属性(2)

目录 3&#xff0e;链式约束4&#xff0e;辅助线 3&#xff0e;链式约束 如果两个或以上控件通过下图的方式约束在一起&#xff0c;就可以认为是他们是一条链&#xff08;如图5为横向的链&#xff0c;纵向同理&#xff09;。 图5 链示意图 如图5所示&#xff0c;在预览图中选…

解读网络安全公司F5:助企业高效简化多云和应用部署

伴随企业加速数字化转型工作、扩展到新的基础设施环境并采用微服务架构&#xff0c;企业正拥抱混合和多云基础设施所带来的灵活性。Ernst & Young调查数据显示&#xff0c;84%的企业正处于向现有网络安全解决方案套件添加多种新技术的早期阶段。企业同样意识到&#xff0c;…

nftables(3)表达式(1)数据类型

简介 前面文章主要介绍的是nftables的基本原理和基础的配置&#xff0c;如nftables基本的表、链、规则的创建和管理。本篇文章主要介绍的是表达式EXPRESSIONS。 在网络安全和数据处理中&#xff0c;表达式&#xff08;Expressions&#xff09;扮演着非常重要的角色。它们用于…

二. Linux内核

一. Linux内核源码目录分析 arch 包含与体系结构相关的代码&#xff0c;用于支持不同硬件体系结构的实现。这个目录下会根据不同的架构&#xff08;如x86、arm、mips等&#xff09;进一步细分。 block 用于处理块设备的子系统&#xff0c;包含与块设备驱动和I/O调度相关的代码。…

力扣--滑动窗口最大值

给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例 1&#xff1a; 输入&#xff1a;nums [1,3,-1,-3,5,3,6,7], k 3 输…

Vue核心 — Vue2响应式原理和核心源码解析(核心中的核心)

一、前置知识 1、Vue 核心概念 Vue 是什么? Vue 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建&#xff0c;并提供了一套声明式的、组件化的编程模型&#xff0c;帮助你高效地开发用户界面。 Vue 核心特点是什么? 响应式数据绑定:…

docker安装tomcat容器

docker安装tomcat容器 1、拉取镜像 docker pull tomcat:8.5.46-jdk8-openjdk2、运行 docker run -d --name tomcat tomcat:8.5.46-jdk8-openjdk ​ docker cp tomcat:/usr/local/tomcat/conf /data/tomcat/ ​ docker rm -f tomcat ​ docker run -d --name tomcat -p 8…