任务调度器——任务切换

一、开启任务调度器

函数原型:

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.rhkb.cn/news/365244.html

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

相关文章

web学习笔记(七十二)

目录 1.vue2通过$parent实现组件传值——父传子 2.vue2 通过$children实现组件传值——子传父 3. provide和inject传值(依赖注入) 4.vue2如何操作dom 5.vue2如何拿到最新的dom 6.filters过滤器 7.vue2的生命周期 8.vuex的用法 1.vue2通过$parent…

LLDP 基本原理

LLDP 简介 定义 LLDP(Link Layer Discovery Protocol,链路层发现协议)是 IEEE 802.1ab 中定义的第二层发现(Layer 2 Discovery)协议。 LLDP 提供了一种标准的链路层发现方式,可以将本端设备的主要能力、…

Wp-scan一键扫描wordpress网页(KALI工具系列三十二)

目录 1、KALI LINUX 简介 2、Wp-scan工具简介 3、信息收集 3.1 目标IP(服务器) 3.2kali的IP 4、操作实例 4.1 基本扫描 4.2 扫描已知漏洞 4.3 扫描目标主题 4.4 列出用户 4.5 输出扫描文件 4.6 输出详细结果 5、总结 1、KALI LINUX 简介 Kali Linux 是一…

决策树划分属性依据

划分依据 基尼系数基尼系数的应用信息熵信息增益信息增益的使用信息增益准则的局限性 最近在学习项目的时候经常用到随机森林,所以对决策树进行探索学习。 基尼系数 基尼系数用来判断不确定性或不纯度,数值范围在0~0.5之间,数值越低&#x…

shark云原生-日志管理体系-filebeat

文章目录 1. deploy 文件1.1 RBAC1.2. DaemonSet1.2.1. Elasticsearch 连接信息1.2.2. Volume 1.3. ConfigMap1.3.1. 日志收集路径1.3.2. 日志事件输出目标 2. 在控制平面节点上运行Filebeat3. 查看输出3.1. 关于处理器 processors 4. 日志收集配置4.1. 手动指定日志收集路径4.…

简单多状态DP问题

这里写目录标题 什么是多状态DP解决多状态DP问题应该怎么做?关于多状态DP问题的几道题1.按摩师2.打家劫舍Ⅱ3.删除并获得点数4.粉刷房子5.买卖股票的最佳时期含手冷冻期 总结 什么是多状态DP 多状态动态规划(Multi-State Dynamic Programming, Multi-St…

数据结构-顺序表的插入排序

顺序表的排序可以看作数组排序的拓展。基本逻辑和数组排序的逻辑大同小异。 由于顺序表中可以存放不同种的数据类型,进而和结构体排序又有相似之处。其中要注意的是(->)和(.)的区别。 -> 符号是针对指针进行的操…

实现了Map接口的HashMap

HashMap 底层主要由以下几个部分组成&#xff1a; 数组 (Node<K,V>[] table): 这是一个数组&#xff0c;存储的是链表的头节点。默认大小为 16。链表 (Linked List): 当发生哈希冲突时&#xff0c;即不同的键具有相同的哈希值&#xff0c;HashMap 使用链表来解决冲突。链…

计网之IP

IP IP基本认识 不使用NAT时&#xff0c;源IP地址和目的IP地址不变&#xff0c;只要源MAC和目的MAC地址在变化 IP地址 D类是组播地址&#xff0c;E类是保留地址 无分类地址CIDR 解决直接分类的B类65536太多&#xff0c;C类256太少a.b.c.d/x的前x位属于网路号&#xff0c;剩…

分治精炼宝库-----快速排序运用(⌯꒪꒫꒪)੭

目录 一.基本概念: 一.颜色分类&#xff1a; 二.排序数组&#xff1a; 三.数组中的第k个最大元素&#xff1a; 解法一&#xff1a;快速选择算法 解法二&#xff1a;简单粗暴优先级队列 四.库存管理Ⅲ&#xff1a; 解法一&#xff1a;快速选择 解法二&#xff1a;简单粗…

Github 2024-06-21 开源项目日报 Top10

根据Github Trendings的统计,今日(2024-06-21统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量TypeScript项目3Python项目3Java项目2非开发语言项目2JavaScript项目1Rust项目1Dart项目1HTML项目1Vue项目1C++项目1TensorFlow: 机器学习的开源…

【Linux】IO多路复用——select,poll,epoll的概念和使用,三种模型的特点和优缺点,epoll的工作模式

文章目录 Linux多路复用1. select1.1 select的概念1.2 select的函数使用1.3 select的优缺点 2. poll2.1 poll的概念2.2 poll的函数使用2.3 poll的优缺点 3. epoll3.1 epoll的概念3.2 epoll的函数使用3.3 epoll的优点3.4 epoll工作模式 Linux多路复用 IO多路复用是一种操作系统的…

算力时代,算能(SOPHGO)的算力芯片/智算板卡/服务器选型

数字经济时代&#xff0c;算力成为支撑经济社会发展新的关键生产力&#xff0c;全球主要经济体都在加快推进算力战略布局。随着大模型持续选代&#xff0c;模型能力不断增强&#xff0c;带来算力需求持续增长。算力对数字经济和GDP的提高有显著的带动作用&#xff0c;根据IDC、…

EasyExcel数据导入

前言&#xff1a; 我先讲一种网上信息的获取方式把&#xff0c;虽然我感觉和后面的EasyExcel没有什么关系&#xff0c;可能是因为这个项目这个操作很难实现&#xff0c;不过也可以在此记录一下&#xff0c;如果需要再拆出来也行。 看上了网页信息&#xff0c;怎么抓到&#x…

C++:typeid4种cast转换

typeid typeid typeid是C标准库中提供的一种运算符&#xff0c;它用于获取类型的信息。它主要用于类型检查和动态类型识别。当你对一个变量或对象使用typeid运算符时&#xff0c;它会返回一个指向std::type_info类型的指针&#xff0c;这个信息包含了关于该类型名称、大小、基…

【嵌入式Linux】i.MX6ULL 时钟树——理论分析

文章目录 0. 时钟树结构0.1 参考手册 Chapter 18​: Clock Controller Module (CCM)0.2 时钟信号路径 1. 时钟源——晶振1.1 外部低频时钟 - CKIL1.1.1 CKIL 同步到 IPG_CLK 解释 1.2 外部高频时钟 - CKIH 和 内部振荡器1.3 总结1.4 缩写补充 2. PLL时钟2.1 i.MX6U 芯片 PLL 时…

【ESP32】打造全网最强esp-idf基础教程——14.VFS与SPIFFS文件系统

VFS与SPIFFS文件系统 这几天忙着搬砖&#xff0c;差点没时间更新博客了&#xff0c;所谓一日未脱贫&#xff0c;打工不能停&#xff0c;搬砖不狠&#xff0c;明天地位不稳呀。 不多说了&#xff0c;且看以下内容吧~ 一、VFS虚拟文件系统 先来看下文件系统的定义&#x…

力扣SQL50 连续出现的数字 distinct

Problem: 180. 连续出现的数字 &#x1f468;‍&#x1f3eb; 力扣官解 Code SELECT DISTINCTl1.Num AS ConsecutiveNums FROMLogs l1,Logs l2,Logs l3 WHEREl1.Id l2.Id - 1AND l2.Id l3.Id - 1AND l1.Num l2.NumAND l2.Num l3.Num ;

Unity实现简单的MVC架构

文章目录 前言MVC基本概念示例流程图效果预览后话 前言 在Unity中&#xff0c;MVC&#xff08;Model-View-Controller&#xff09;框架是一种架构模式&#xff0c;用于分离游戏的逻辑、数据和用户界面。MVC模式可以帮助开发者更好地管理代码结构&#xff0c;提高代码的可维护性…

简单体验一下AI训练的过程

推荐一个站点 http://playground.tensorflow.org 有什么优点呢 这个是tensorflow官方的体验站点&#xff0c;以图形化的方式给出了训练过程中所需的各种因素。