FreeRTOS学习之路,以STM32F103C8T6为实验MCU(2-3:任务切换)

news2024/11/15 23:31:03

学习之路主要为FreeRTOS操作系统在STM32F103(STM32F103C8T6)上的运用,采用的是标准库编程的方式,使用的IDE为KEIL5。

注意!!!本学习之路可以通过购买STM32最小系统板以及部分配件的方式进行学习,也可以通过Proteus仿真的方式进行学习。

后续文章会同时发表在个人博客(jason1016.club)、CSDN;

视频会发布在bilibili(UID:399951374)

RTOS 系统的核心是任务管理,而任务管理的核心是任务切换,任务切换决定了任务的执行顺序,任务切换效率的高低也决定了一款系统的性能

一、什么时候执行任务切换(啥时候切换)

  1. 可以执行一个系统调用

执行系统调用就是执行 FreeRTOS 系统提供的相关 API 函数,比如任务切换函数 taskYIELD(),FreeRTOS 有些 API 函数也会调用函数 taskYIELD(),这些 API 函数都会导致任务切换,这些 API 函数和任务切换函数 taskYIELD()都统称为系统调用。

  1. 系统滴答定时器(SysTick)中断

FreeRTOS 中滴答定时器(SysTick)中断服务函数中也会进行任务切换

例:vTaskDelay()

二、任务切换函数PendSV(怎么切换)

PendSV函数原理(优势)

将 PendSV 设置为最低的异常优先级,可以让 PendSV 异常处理在所有其他中断处理完成后执行,这对于上下文切换非常有用,也是各种 OS 设计中的关键。

因此,用PendSV作为任务切换函数的话,就把任务切换事件放在系统执行的最底层了,避免了任务切换会打断正在运行的中断事件这个问题

PendSV 异常将上下文切换请求延迟到所有其他 IRQ 处理都已经完成后,此时需要将 PendSV 设置为最低优先级。若 OS 需要执行上下文切换,他会设置 PendSV 的挂起壮态,并在 PendSV 异常内执行上下文切换

PendSV使用时机和方法(该切换时怎么切换)

    1. 在接收到上述系统调用的时候,通过SVC(中断控制和壮态寄存器 ICSR)  挂起PendSV,最后在空闲状态执行PendSV中执行任务切换操作
    2. 在接收到Systick中断后,由SVC(Systick)挂起PendSV,最后在空闲状态执行PendSV中执行任务切换操作

三、查找下一个要运行的任务(切换成什么?切换成某一优先级的任务列表

通用方法

任务添加时会根据优先级大小赋值给就绪任务列表数组( pxReadyTasksLists[]),一个优先级一个列表,同优先级的就绪任务都挂到相对应的列表中。uxTopReadyPriority 代表处于就绪态的最高优先级值,系统按就绪态的最高优先级的高到低遍历,再依次执行对应的任务级列别,而针对同一优先级列表内的任务,则会按照次序依次执行。

硬件方法

硬件方法就是使用处理器自带的硬件指令来实现,原理与上述方法相似,不同点在于:使用硬件方法的时候 uxTopReadyPriority 就不代表处于就绪态的最高优先级了,而是使用每个 bit 代表一个优先级,bit0 代表优先级 0,bit31 就代表优先级 31,当某个优先级有就绪任务的话就将其对应的 bit 置 1。

四、时间片调度(同一优先级任务列表的任务切换

这里提出一个问题,当有两个一样重要(优先级相等)的任务需要我们去执行的话,我们应该怎么处理?大家都知道即使移植了freertos的单片机同一时间也只能执行一个任务,当面对有个多个同等优先级的任务的情况,freertos给出的答案是时间片调度执行。

在 FreeRTOS 中允许一个任务运行一个时间片(一个时钟节拍的长度)后让出 CPU 的使用权,让拥有同优先级的下一个任务运行,FreeRTOS 中的这种调度方法就是时间片调度

这样的调度方式就好比我们平时看到的风扇叶面,一个页面代表一个同等优先级的任务,当我们执行得慢的时候,我们还能分清具体是那个叶面,而等风扇快速转动起来后我就分不清叶面的类型甚至页面的个数了。单片机同样如此当单片机以几十几百HZ运行,并且将时间片稀释得非常少的时候,我们就分不清他具体在执行什么任务了,乃至于我们会出现“单片机这几个任务是同时执行的错觉”,这也是为什么风扇转起来就像个圆的。这就是FreeRTOS处理多(同优先级)任务的方法。

本文为作者独立编写,本BLOG上所有的原创文章未经本人许可,不得用于商业用途及传统媒体。网络媒体转载请注明出处,否则属于侵权行为。 

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

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

相关文章

WorkPlus解放企业应用开发,实现跨平台无缝切换

在移动应用的快速发展时代,企业对于自主开发和应用平台替换的需求日益增长。WorkPlus作为一个完整的移动数字化APP底座,为企业提供了独立自主的应用开发环境,实现了平台无关性和应用解耦。今天,我们将深入探讨WorkPlus在企业应用开…

基于 Flink SQL 和 Paimon 构建流式湖仓新方案

本文整理自阿里云智能开源表存储负责人,Founder of Paimon,Flink PMC 成员李劲松在云栖大会开源大数据专场的分享。本篇内容主要分为四部分: 数据分析架构演进介绍 Apache PaimonFlink Paimon 流式湖仓流式湖仓Demo演示 数据分析架构演进 …

【C语言:深入理解指针二】

文章目录 1. 二级指针2. 指针数组3. 字符指针变量4. 数组指针变量5. 二维数组传参的本质6. 函数指针变量7. 函数指针数组8. 转移表9. 回调函数10. qsort函数的使用与模拟实现 1. 二级指针 我们知道,指针变量也是变量,它也有自己的地址,使用什…

TypeError: Cannot read property ‘sendpost‘ of undefined

箭头函数指向问题,定义let that this 解决

【外贸商机篇】黑色星期五来啦,跨境电商必备手册!

黑色星期五是每年11月的第四个星期五,三天后是网络星期一。这两个购物日是美国一年中最繁忙的购物日之一,仅在2021年的感恩节周末,电子商务收入估计就达到196亿美元。 在一项Statista调查中,美国消费者被问及他们计划购买哪些商品…

自由飞翔之小鸟

一、创建文件、包、类、插入图片文件 二、app包 1、Gameapp类(运行游戏) package app;import main.GameFrame;public class Gameapp {public static void main(String[] args) {//游戏的入口new GameFrame();} } 三、main包 1、Barrier(障…

Python基础:生成器(Generators)和生成器表达式(Generator Expressions)详解

生成器(Generators)和 生成器表达式(Generator Expressions)是 Python 中用于处理迭代器和序列数据的强大工具。它们允许你按需生成值,而不是一次性生成所有值,从而节省内存和提高性能。 1. 生成器&#x…

前缀和——724. 寻找数组的中心下标

文章目录 🍓1. 题目🫒2. 算法原理🦄解法一:暴力枚举🦄解法二:前缀和 🥔3. 代码实现 🍓1. 题目 题目链接:724. 寻找数组的中心下标 - 力扣(LeetCode&#xff0…

【一文搞定】在Docker中搭建centos7远程桌面环境(Xfce、Gnome两种方式)

目录 前言一、基于GNOME构建远程桌面二、基于Xfce构建远程桌面(轻量级) 前言 本文提供两种安装方式,均自己测试过,最后还是选择了Xfce,因为它比较轻量级,占用资源较少。大家也可以都试试,比较感…

idea 26 个天花板技巧

1、 查看代码历史版本;2、 调整idea的虚拟内存:;3、 idea设置成eclipse的快捷键;4、 设置提示词忽略大小写;5、 关闭代码检查;6、 设置文档注释模板;7、 显示方法分隔符;8、 设置多行…

【大神支招】3步,打造一张BI报表

随着BI报表的高效直观、灵活分析的特点越来越被大家所熟知,很多BI零基础的用户可积极尝试制作BI报表,以达到灵活自助分析、高效智能分析的效果。那么BI报表零基础的小白们该怎么做BI报表,才能又快又好地做出来? 大神支招&#xf…

Authing 入选《 2023 年央国企信创应用与实践研究报告》优秀服务商

11 月 21 日,Authing 身份云作为国内唯一事件驱动云原生身份平台入选《 2023 年央国企信创应用与实践研究报告》优秀服务商,该报告由第一新声研究院合伙人、Gartner 前高管合伙人/副总裁李长华牵头指导,第一新声创始人兼 CEO 组织&#xff0c…

畅捷通T6 客户端登录提示 运行时错误 372 加载控件cfloatmenu失败

客户单win10电脑, T6版本是 V7.1 不知道操作了什么每个电脑提示 运行时错误372: 从加载控件CFloatMenu失败。您的版本可能已过期。确认您使用的控件版本是同您的应用程序一起提供的。 ******* 解决办法: 找个其他电脑复制mscomctl.ocx 到操作系统目录里面注册一下,即可. …

蓝桥杯物联网竞赛_STM32L071_2_继电器控制

CubeMX配置: Function.c及Function.h: #include "Function.h" #include "gpio.h" void Function_LD5_ON(void){HAL_GPIO_WritePin(LD5_GPIO_Port, LD5_Pin, GPIO_PIN_RESET); }void Function_LD5_OFF(void){HAL_GPIO_WritePin(LD5_…

【Unity】 UGUI的PhysicsRaycaster (物理射线检测)组件的介绍及使用

1. 什么是PhysicsRaycaster组件? PhysicsRaycaster是Unity UGUI中的一个组件,用于在UI元素上进行物理射线检测。它可以检测鼠标或触摸事件是否发生在UI元素上,并将事件传递给相应的UI元素。 2. PhysicsRaycaster的工作原理 PhysicsRaycast…

便携式心电图机方案_基于MT6735平台的手持心电图机

便携式心电图机具备体积小、易携带、兼容12导模式的特点,通过工频滤波、基线滤波和肌电滤波等处理,能够获得更精准的心电图谱。该设备可以与医院信息系统(HIS)相连接,实现患者信息的共享。采集的心电数据可以通过无线方式发送到心电判读平台&…

Python函数式编程:让你的代码更优雅更简洁

概要 函数式编程(Functional Programming)是一种编程范式,它将计算视为函数的求值,并且避免使用可变状态和循环。 函数式编程强调的是函数的计算,而不是它的副作用。 在函数式编程中,函数是第一类公民&a…

postgresql数据库中update使用的坑

简介 在数据库中进行增删改查比较常见,经常会用到update的使用。但是在近期发现update在oracle和postgresql使用却有一些隐形区别,oracle 在执行update语句的时候set 后面必须跟着1对1的数据关联而postgresql数据库却可以一对多,这就导致数据…

springboot使用redis缓存乱码(key或者 value 乱码)一招解决

如果查看redis中的值是这样 创建一个配置类就可以解决 package com.deka.config;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; i…

2024年的云趋势:云计算的前景如何?

本文讨论了2024年云计算的发展趋势。 适应复杂的生态系统、提供实时功能、优先考虑安全性和确保可持续性的需求正在引领云计算之船。多样化的工作负载允许探索通用的公共云基础设施范例之外的选项。由于需要降低成本、提高灵活性和降低风险,混合云和多云系统越来越受…