任务创建和调度器开启

目录

一、任务创建

二、静态任务和动态任务创建的区别

三、任务调度

1、vTaskStartScheduler()调度器:

2、内核相关硬件初始化函数分析:xPortStartScheduler()

3、启动第一个任务函数分析:prvStartFirstTask()

4、SVC中断服务函数

5、MSP、PSP??

6、线程模式(Thread Mode),中断异常模式(Handler Mode)??

7、内核态和用户态??

8、SVC和PendSV的区别??

9、r0-r12寄存器组??


一、任务创建

二、静态任务和动态任务创建的区别

三、任务调度

1、vTaskStartScheduler()调度器:

(1) 创建空闲任务;

(2) 创建定时器任务(如果开启);

(3) 关闭中断,在 SVC 中断服务函数 vPortSVCHandler)中会打开中断;

(4) 当宏configGENERATE_RUN-TIME_STATS为1的时候说明使能时间统计功能,此时需要用户实现宏portCONFIGURE_TIMER_FOR_RUN_TIME_STATS,此宏用来配置一个定时器/计数器;

(5) 调用函数xPortStartScheduler()来初始化跟调度器启动有关的硬件,比如滴答定时器FPU单元PendSV中断等等。

2、内核相关硬件初始化函数分析:xPortStartScheduler()

(1) 设置PendSV的中断优先级,为最低优先级;

(2) 设置滴答定时器的中断优先级,为最低优先级。

(3) 调用函数vPortSetupTimerInterrupt()来设置滴答定时器的定时周期,并且使能滴答定时器的中断;

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

(5) 调用函数prvEnableVFP()使能FPU;

(6) 设置寄存器FPCCR的bit31和bit30都为1,这样S0-S15和FPSCR寄存器在异常入口和退出时的壮态自动保存和恢复。并且异常流程使用惰性压栈的特性以保证中断等待;

(7) 启动第一个任务。

3、启动第一个任务函数分析:prvStartFirstTask()

向量表的起始地址保存的就是主栈指针MSP 的初始值,这一行代码执行完以后寄存器 RO 就存储 MSP 的初始值。现在来看(1)、(2)、(3)这三步起始就是为了获取MSP的初始值。

(5)和(6)、使能中断,关于这两个指令的详细内容请参考《权威指南》的“第4章架构”的第4.2.3 小节。

(7)和(8)、数据同步和指令同步屏障,这两个指令的详细内容请参考《权威指南》的“第 5章 指令集”的 5.6.13 小节。

(9),调用SVC指令触发SVC中断, SVC也叫做请求管理调用, SVC和PendSV异常对于OS的设计来说非常重要。SVC 异常由 SVC 指令触发。关于 SVC 的详细内容请参考《权威指南》的“第 10 章 OS 支持特性”的 10.3 小节。在 FreeRTOS 中仅仅使用 SVC 异常来启动第一个任务,后面的程序中就再也用不到SVC了。

4、SVC中断服务函数

(1)、(2)和(3):目的就是获取要切换到的这个任务的任务栈顶指针,因为任务所对应的寄存器值,也就是现场都保存在任务的任务堆栈中,所以需要获取栈顶指针来恢复这些寄存器值。

(4):通过这一步我们就从任务堆栈中将 R4-R11,R14 这几个寄存器的值给恢复了,注意 R14 的值为OXFFFFFFFD,这个值就是我们在初始化任务堆栈的时候保存的EXC-RETURN的值。

(8):执行此行代码以后硬件自动恢复寄存器R0-R3、R12、LR、PC和xPSR的值,堆栈使用进程栈PSP,然后执行寄存器PC中保存的任务函数。至此, FreeRTOS的任务调度器正式开始运行。

5、MSP、PSP??

        MSP和PSP 双堆栈机制是为了OS设计的,是为了让OS、中断与应用程序代码运行解耦,增加整体程序的健壮性。

        那双堆栈指针的作用是什么?答案是为了隔离OS和应用程序,程序的运行少不了堆栈,因为我们CPU只有少量的通用寄存器,当我们使用的临时变量比较多得时候,就需要将这些临时变量存储到堆栈里,而堆栈的push和pop都是通过SP来实现的,所以通过MSP和PSP就能实现OS内核与应用程序的隔离,应用程序task用PSP,而OS用MSP,这样会非常安全。因为应用程序再怎么折腾也只是在自己的堆栈内折腾,不会影响内核OS。

        在发生中断时,CPU会自动的保存现场,这部分工作是硬件自动完成的,而SP到底是指向PSP还是MSP,则是根据在发生中断前是使用MSP还是PSP,比如发生中断前,正在运行RTOS的task,即在使用PSP,那么CPU保存现场也是使用PSP,然后进入中断服务程序,此时会从PSP切换到MSP。

6、线程模式(Thread Mode),中断异常模式(Handler Mode)??

        特权状态和非特权,即内核态和用户态的设计也是为了OS设计的,让整个程序分层,整体程序更加健壮。

7、内核态和用户态??

用户态--->内核态:唯一途径是通过中断、异常、陷入机制(访管指令)

内核态->用户态:设置程序状态字PSW

8、SVC和PendSV的区别??

        SVC不能挂起,它将立即被执行;而PendSV可以暂时挂起异常,对于操作系统来说这很有用,它可以等待一个重要的任务执行完毕后再处理该异常。

        总得来说就是SVC由用户调用SVC #<immed>时立即触发,而PendSV则是置相应的异常标志位,等待比PendSV优先级高的异常执行完后,再执行PendSV。

        在FreeRTOS中,使用SVC异常来开启第一个任务的调度。然后将PendSV异常优先级设置为最低,保证中断的实时性,后续的上下文切换全由PendSV来实现。

9、r0-r12寄存器组??

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

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

相关文章

优思学院|质量工程师需要学习什么软件?

初入职质量工程师的朋友常常会问&#xff1a;质量工程师需要学习什么软件&#xff1f;在质量控制和管理的世界里&#xff0c;拥有强大的数据分析工具是走向成功的关键&#xff0c;因此&#xff0c;对于质量工程师来说&#xff0c;掌握正确的软件不仅能提升工作效率&#xff0c;…

NebulaGraph基础(默认看了入门篇)

感谢阅读 官方链接运算符比较运算符布尔符管道符集合运算符UNION、UNION DISTINCT、UNION ALL官方示例代码&#xff08;并集&#xff09;INTERSECT官方示例代码&#xff08;交集&#xff09;MINUS 字符串运算符官方代码&#xff08;字符串&#xff09; 列表运算符算术运算符 Ne…

MyBatis 学习(二)之 第一个 MyBatis 案例

目录 1 配置 MyBatis 方式 1.1 XML 配置文件 1.2 Java 注解配置 1.3. Java API 配置 2 在 MySQL 中创建一张表 3 创建一个基于 Maven 的 JavaWeb 工程 4 编写 User 实体类 5 创建 Mybatis 全局配置文件 6 编写一个 DAO 或 Mapper 接口 7 编写 SQL 映射配置文件&#…

简单了解B树和B+树

目录 B树 B树 B树和B树的结构示意图 总结 B树和B树是两种非常重要的树状数据结构&#xff0c;它们广泛应用于数据库和文件系统的索引结构中。这两种数据结构能够帮助我们高效地管理、查询以及更新大量的数据。下面&#xff0c;我将简单介绍它们,以及他们之间的区别。 B树 B…

同源不同页面之间的通信,SharedWorker使用

同源不同页面之间的通信&#xff0c;SharedWorker使用 描述实现结果 描述 同源不同页面之间的通信&#xff0c;使用SharedWorker&#xff0c;或者使用全局方法通信&#xff0c;这里使用SharedWorker来实现 mdn地址&#xff1a;https://developer.mozilla.org/zh-CN/docs/Web/A…

【小沐学QT】QT学习之信号槽使用

文章目录 1、简介2、代码实现2.1 界面菜单“转到槽”方法2.2 界面信号槽编辑器方法2.3 QT4.0的绑定方法2.4 QT5.0之后的绑定方法2.5 C11的方法2.6 lamda表达式方法 结语 1、简介 在GUI编程中&#xff0c;当我们更改一个小部件时&#xff0c;我们通常希望通知另一个小程序。更普…

动态之美:Motion 5特效,让视频栩栩如生 mac版

Motion 5&#xff0c;一款强大的视频后期特效软件&#xff0c;凭借其丰富的功能和出色的性能&#xff0c;成为了众多影视制作人员的首 选工具。它不仅能够满足专业级影视制作的需求&#xff0c;也适合初学者探索和实践视频特效的魅力。 Motion 5软件获取 Motion 5拥有丰富多样…

15年超长寿命!道合顺全新红外冷媒气体传感器重磅推出

创新科技&#xff0c;引领行业未来&#xff01;高灵敏度、15年超长寿命&#xff0c;全球领先的湿度应用范围&#xff0c;道合顺全新红外冷媒气体传感器DSH06M-M40K-JS重磅推出&#xff01; 随着社会对环保的日益关注&#xff0c;各行各业都在积极寻求可持续发展的解决方案。“…

C++——String(1)

目录 1. 为什么学习string类&#xff1f; 1.1 C语言中的字符串 1.2 相关题目 2. 标准库中的string类 2.1 string类&#xff08;了解一下&#xff09; 2.2 string类的常用接口说明 1. string类对象的常见构造 2. string类对象的容量操作 3. string类对象的访问及遍历操作…

常用字符函数和字符串函数的了解和模拟实现

前言 字符函数和字符串函数都是在编程中用来处理字符和字符串的函数。 字符函数是用来处理单个字符的函数&#xff0c;比如查找、替换、转换大小写、比较等操作。常用的字符函数包括&#xff1a; isalpha()&#xff1a;判断一个字符是否为字母&#xff1b;isdigit()&#xf…

Squid代理服务器配置

需求是&#xff1a;通过外网机&#xff08;跳板机&#xff09;访问内网机&#xff0c;并为内网机提供访问网络的能力。 【跳板机T】【内网机N】 公网IP&#xff1a;39.107.xx.xxx 跳板机IP&#xff1a;172.17.216.234 内网机IP&#xff1a;172.17.216.241 Squid代理服务器地址…

python 小游戏《2048》字符版非图形界面

参考链接&#xff1a; 闲谈2048小游戏和数组的旋转及翻转和转置 目录 2048 一、方阵类 二、随机插入1或2 三、 合并和递增 四、 判断和移动 五、 键盘控制 完整源代码 玩法过程 2048 上回说到2048小游戏中数组的各种旋转、翻转的方法&#xff0c;就是为代码编程作准…