任务调度器——任务切换

一、开启任务调度器

函数原型:

void vTaskStartScheduler( void )

作用:用于启动任务调度器,任务调度器启动后, FreeRTOS 便会开始进行任务调度

内部实现机制(以动态创建为例):

(1)首先,判断动态创建任务 or 静态创建任务

(2)创建空闲任务

(3)如果使能软件定时器,则创建软件定时器任务

(4)关闭中断,防止调度器开启之前或过程中,受中断干扰,会在运行第一个任务时打开中断 

5)初始化全局变量,并将任务调度器的运行标志设置为已运行 

(6)初始化任务运行时间统计功能的时基定时器

(7)调用函数 xPortStartScheduler()

xPortStartScheduler() :

(1)检测用户在 FreeRTOSConfig.h 文件中对中断的相关配置是否有误

(2)配置 PendSV 和 SysTick 的中断优先级为最低优先级

(3)调用函数 vPortSetupTimerInterrupt()配置 SysTick(主要配置定时器的中断周期

(4)初始化临界区嵌套计数器为 0

(5)调用函数 prvEnableVFP()使能 FPU(M4与M7内核才有FPU)

(6)调用函数 prvStartFirstTask()启动第一个任务

二、启动第一个任务

        要运行任务,必须把任务的寄存器的值加载到CPU的寄存器中,任务A的寄存器值,在一开始创建任务时就保存在任务堆栈里边

注:

1、中断产生时,硬件自动xPSR,PC(R15),LR(R14),R12,R3-R0出/入栈(保存和恢复);
R4~R11需要手动出/入栈(保存和恢复)

2、进入中断后硬件会强制使用MSP指针 ,此时LR(R14)的值将会被自动被更新为特殊的EXC_RETURN

2.1 开启第一个任务函数:prvStartFirstTask ()

__asm void prvStartFirstTask( void )
{/* 八字节对齐 */PRESERVE8/* 将向量表偏移量寄存器地址存储到R0 */ldr r0, =0xE000ED08/* 向量表偏移量寄存器存储着向量表的起始地址 *//* 将向量表起始地址存储到R0 */ldr r0, [ r0 ]/* 将MSP的初始值存储到R0 */ldr r0, [ r0 ]/* 使MSP回到最初值 */msr msp, r0/* 使能中断 */cpsie icpsie fdsbisb/* 触发SVC中断,开启第一个任务 */svc 0nopnop
/* *INDENT-ON* */
}

功能:用于初始化启动第一个任务前的环境,主要是获取MSP 指针的初始值,并使能全局中断触发SVC,开启一个任务

Q:向量表偏移量寄存器为什么会出现在这?

 答:

         经过前面一系列的操作,MSP的值已经改变,为了获取MSP的初始值,需要通过VTOR寄存器,找到向量表的起始地址,再通过此地址才可以找到MSP的初始值

程序在运行过程中需要一定的栈空间来保存局部变量等一些信息。当有信息保存到栈中时,
MCU 会自动更新 SP 指针,ARM Cortex-M 内核提供了两个栈空间:

(1)MSP(主堆栈指针):它由 OS 内核异常服务例程以及所有需要特权访问的应用程序代码来使用

(2)PSP(进程堆栈指针):用于常规的应用程序代码(不处于异常服务例程中时)

在FreeRTOS中,中断使用MSP(主堆栈)中断以外使用PSP(进程堆栈)

 

2.2 SVC中断函数:void vPortSVCHandler( )

函数功能:恢复现场开启中断,并跳转到PC所指向的函数中(第一个任务函数中

    //进行8字节对齐 PRESERVE8//将当前任务TCB结构体的指针的地址存储在R3ldr r3, = pxCurrentTCB   /* Restore the context. *///通过地址找到当前任务结构的地址ldr r1, [ r3 ] /* Use pxCurrentTCBConst to get the pxCurrentTCB address. *///通过地址找到第一个成员变量,栈顶指针(保存着更新后的地址,已经开辟了寄存器组的空间)ldr r0, [ r1 ]           /* The first item in pxCurrentTCB is the task top of stack. *///出栈ldmia r0 !, { r4 - r11 } /* 将出栈后的栈顶指针的值赋值给PSP,用于后面的现场保存 */msr psp, r0 /* Restore the task stack pointer. */isb//R0清0mov r0, # 0//使能所有中断msr basepri, r0//R14与0xd进行或运算,表示退出中断后,进入线程模式,并使用PSPorr r14, # 0xd//跳转到PC所指向地址的函数中bx r14

 

 

R14:链接寄存器,在中断中记录了异常返回值 EXC_RETURN

        当从 SVC 中断服务退出前,通过向 r14 寄存器最后 4 位按位或上 0x0D,使得硬件在退出时使用进程堆栈指针 PSP 完成出栈操作并返回后进入任务模式、返 回 Thumb 状态。在 SVC 中断服务里面,使用的是 MSP 堆栈指针,是处在 ARM 状态。

        当 r14 为 0xFFFFFFFX,执行是中断返回指令,cortext-m3 的做法,X 的 bit0 为 1 表示 返回 thumb 状态,bit1 和 bit2 分别表示返回后 sp 用 msp 还是 psp、以及返回到特权模式还 是用户模式

        异常返回,这个时候出栈使用的是 PSP 指针,自动将栈中的剩下 内容加载到 CPU 寄存器: xPSR,PC(任务入口地址),R14,R12,R3,R2,R1,R0 (任务的形参)同时 PSP 的值也将更新,即指向任务栈的栈顶

 

注意:SVC中断只在启动第一次任务时会调用一次,以后均不调用  

三、任务切换

本质:CPU寄存器值的切换

 假设当由任务A切换到任务B时,主要分为两步:

        第一步:需暂停任务A的执行,并将此时任务A的寄存器保存到任务堆栈,这个过程叫做保存现场

        第二步:将任务B的各个寄存器值(被存于任务堆栈中)恢复到CPU寄存器中,这个过程叫做恢复现场

对任务A保存现场,对任务B恢复现场,这个整体的过程称之为:上下文切换

注意:任务切换的过程在PendSV中断服务函数里边完成 

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

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

相关文章

Linux 安装、配置Tomcat 的HTTPS

Linux 安装 、配置Tomcat的HTTPS 安装Tomcat 这里选择的是 tomcat 10.X ,需要Java 11及更高版本 下载页 ->Binary Distributions ->Core->选择 tar.gz包 下载、上传到内网服务器 /opt 目录tar -xzf 解压将解压的根目录改名为 tomat-10 并移动到 /opt 下, 形成个人…

测评推荐:企业管理u盘的软件有哪些?

U盘作为一种便携的存储设备,方便易用,被广泛应用于企业办公、个人学习及日常工作中。然而,U盘的使用也带来了数据泄露、病毒传播等安全隐患。为了解决这些问题,企业管理U盘的软件应运而生。 本文将对市面上流行的几款U盘管理软件…

Hadoop3:Yarn容量调度器配置多队列案例

一、情景描述 需求1: default队列占总内存的40%,最大资源容量占总资源60%,hive队列占总内存的60%,最大资源容量占总资源80%。 二、多队列优点 (1)因为担心员工不小心,写递归死循环代码&#…

电路笔记(电源模块): 基于FT2232HL实现的jtag下载器硬件+jtag的通信引脚说明

JTAG接口说明 JTAG 接口根据需求可以选择20针或14针的配置,具体选择取决于应用场景和需要连接的功能。比如之前的可编程逻辑器件XC9572XL使用JTAG引脚(TCK、TDI、TDO、TMS、VREF、GND)用于与器件进行调试和编程通信。更详细的内容可以阅读11…

51单片机STC8H8K64U通过RA8889/RA8876如何控制彩屏(SPI源码下载)

【硬件部份】 一、硬件连接实物: STC8H系列单片机不需要外部晶振和外部复位,在相同的工作频率下,速度比传统的8051单片机要快12倍,具有高可靠抗干扰的优秀特性,与瑞佑的RA8889/RA8876控制芯片刚好可以完美搭配用于工…

redis实战-缓存雪崩问题及解决方案

定义理解 缓存雪崩是指在同一时间段,大量缓存的key同时失效,或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力 和缓存击穿的区别: 缓存雪崩是由于缓存中的大量数据同时失效或缓存服务器故障引起的&#xff1b…

机器学习周记(第四十五周:Graphformer)2024.6.24~2024.6.30

目录 摘要ABSTRACT1 论文信息1.1 论文标题1.2 论文摘要1.3 论文引言1.4 论文贡献 2 论文模型2.1 问题定义2.2 模型架构2.2.1 自注意下采样模块(Self-attention down-sampling module)2.2.2 稀疏图自注意力机制(Sparse graph self-attention m…

【C++】using namespace std 到底什么意思

📢博客主页:https://blog.csdn.net/2301_779549673 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📢本文作为 JohnKi 的学习笔记,引用了部分大佬的案例 📢未来很长&a…

新手练习项目 7:猜数字游戏

名人说:莫听穿林打叶声,何妨吟啸且徐行。—— 苏轼《定风波莫听穿林打叶声》 Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder) 目录 一、项目描述二、项目实现三、项目步骤四、项目扩展方向 更多项目内容,请关注我、订…

打靶记录——靶机medium_socnet

靶机下载地址 https://www.vulnhub.com/entry/boredhackerblog-social-network,454/ 打靶过程 由于靶机和我的Kali都处于同一个网段,所以使用arpscan二次发现技术来识别目标主机的IP地址 arpscan -l除了192.168.174.133,其他IP都是我VMware虚拟机正…

【Spring Boot】认识 JPA 的接口

认识 JPA 的接口 1.JPA 接口 JpaRepository2.分页排序接口 PagingAndSortingRepository3.数据操作接口 CrudRepository4.分页接口 Pageable 和 Page5.排序类 Sort JPA 提供了操作数据库的接口。在开发过程中继承和使用这些接口,可简化现有的持久化开发工作。可以使 …

springboot学习,如何用redission实现分布式锁

目录 一、springboot框架介绍二、redission是什么三、什么是分布式锁四、如何用redission实现分布式锁 一、springboot框架介绍 Spring Boot是一个开源的Java框架,由Pivotal团队(现为VMware的一部分)于2013年推出。它旨在简化Spring应用程序…

大数据面试题之Spark(1)

目录 Spark的任务执行流程 Spark的运行流程 Spark的作业运行流程是怎么样的? Spark的特点 Spark源码中的任务调度 Spark作业调度 Spark的架构 Spark的使用场景 Spark on standalone模型、YARN架构模型(画架构图) Spark的yarn-cluster涉及的参数有哪些? Spark提交jo…

编码大模型系列:Meta创新的“代码编译优化”的LLM

鲁班号导读正式上线。移步“鲁班秘笈”,查阅更多内容。 大型语言模型 (LLM) 已在各种软件工程和编码任务中展现出卓越的能力。然而,它们在代码和编译器优化领域的应用仍未得到充分探索。训练LLM需要大量资源,需要大量的 GPU时间和大量的数据…

一个合理的前端应用文件结构

在大型应用中,最关键且最具挑战性的方面之一就是拥有一个良好且合理的文件结构。在考虑通过微前端将代码库拆分成多个应用之前,可以遵循一些步骤来改善项目级别的架构,并在您考虑这一路径时使过渡更容易。 我们的目标是应用某种模块化方法&am…

MSPM0G3507——定时器例程讲解4——timx_timer_mode_periodic

以下示例以周期模式配置TimerG并切换LED。周期从500ms开始,每次切换减少50ms,直到周期为100ms,然后重复。设备在等待中断时保持待机模式 #include "ti_msp_dl_config.h"/* ((32KHz / (321)) * 0.5s) 45 - 1 495 due to N1 ticks …

Qt中用QLabel创建状态灯

首先ui设计中分别创建了4个大灯和4个小灯。 编辑.h文件 #ifndef LED_H #define LED_H#include <QWidget> #include <QLabel>QT_BEGIN_NAMESPACE namespace Ui { class Led; } QT_END_NAMESPACEclass Led : public QWidget {Q_OBJECTpublic:Led(QWidget *parent n…

服务器硬件以及RAID配置

目录 一、RAID磁盘阵列原理&#xff08;嘎嘎重要&#xff09; 1、RAID的概述 2、常用的RAID 2.1、RAID 0 2.2、RAID 1 2.3、RAID 5 2.5、RAID 10 3、阵列卡介绍 二、建立软件RAID磁盘阵列 1、添加硬盘 2、使用fdisk分区&#xff0c;类型为fd 3、mdata命令使用参数 …

安全与加密常识(3)什么是数字签名和数字证书

文章目录 数字签名工作原理关键特点应用实例 数字证书数字证书和数字签名趣味实例 数字签名 数字签名是一种通过密码运算生成的数据&#xff0c;用于验证信息的完整性和来源&#xff0c;确保数据在传输过程中未被篡改&#xff0c;同时提供发送者的身份认证和防止抵赖的功能。它…

Qt: QPushButton 按钮实现 上图标下文字

效果如下&#xff1a; 实现有如下几种方式&#xff1a; 1. 使用 QPushButton 设置 setStyleSheet 例&#xff1a; ui->recorder->setStyleSheet("QPushButton{"\"border: 1px solid #00d2ff; "\"min-height: 60px; "\"col…