关于rtos中任务切换时的程序流程
今天和一个小伙伴讨论了一下基于cortex-m3内核的RTOS在任务切换时的程序流程,小伙伴说国内某搜索引擎都搜不到这类的信息,所以我才打算写下来,硬件平台是stm32f1。
这里的切换有两种情况:
第一种:从main函数跳到任务一时的程序流程;
第二种:从任务一跳到任务二时的程序流程。
先说第一种:从stm32f1上电复位说起吧,上电复位之后,CPU执行以下代码:
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT SystemInit
IMPORT __main LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
可见代码先去执行SystemInit()这个函数,执行结束之后去执行main()函数。我为什么要说这个呢,因为在《cortex-m3权威指南》里面有这样一句:“主堆栈指针( MSP):复位后缺省使用的堆栈指针,用于操作系统内核以及异常处理例程(包括中断服务例程)”
也就是说当cpu复位之后执行的SystemInit()和main()函数时用的都是MSP。我为什么要提MSP,因为下面还有个PSP。
继续说main()函数,执行main()函数的时候,肯定会执行一大堆初始化(这里就不多赘述初始化了些啥),然后去找优先级最高的任务,并把这个找到的任务赋给nextTask变量,这时会启动任务调度——也就是触发PendSV异常。注意到这里用的都是MSP。
这里插一句任务切换的本质:“保存上一个任务的运行状态,恢复下个任务的运行状态”。
触发PendSV异常必然会去执行PendSV_Handler()异常处理函数,在这个函数里执行的就是上面这句红字,但是从main函数到任务一的时候,是没有上一个任务的,所以不需要保存上一个任务,直接恢复下一个任务就行。恢复下一个任务就是把下一个任务的运行状态(这时任务一的运行状态是该任务初始化完成的状态)通过弹栈弹入CPU的寄存器里面然后占据CPU的控制权运行该任务,这时就不用MSP了(因为有专门给任务跑的栈),通过下面这句代码 ORR LR, LR, #0x04 切换到PSP堆栈,就是下图的第二位 并把它置1,这个PSP是啥呢,同样在《cortex-m3权威指南》里面有这句解释,进程堆栈指针( PSP):由用户的应用程序代码使用。这个PSP就是专门给任务用的栈指针,这个时候任务就在PSP上运行了。

这时就是任务一占据CPU的控制权在运行!
再来说第二种:当任务一占据了CPU的使用权在运行时,PendSV异常触发需要切换到任务二。这时CPU会通过压栈的方式把当前任务一的运行状态(就是任务一占据cpu控制权时寄存器的值)压入只属于任务一的独立栈中,这就是保存上一个任务的运行状态;然后恢复下一个任务,任务二的运行状态就是一开始在main()函数中初始化的状态,cpu通过弹栈的方式 把 这些保存在任务二独立栈中的运行状态数据 弹入CPU的寄存器,让任务二占据CPU的控制权并运行。
当然了,在这里多说一句,触发PendSV异常时执行的PendSV_Handler()函数时 用的是MSP指针运行的,任务一与任务二运行时用的是PSP指针。
关于rtos中任务切换时的程序流程的更多相关文章
- 在docker中运行elasticsearch时go程序无法连接到节点
错误信息: panic: no active connection found: no Elasticsearch node available 在docker中运行es时,默认启动sniffing ...
- Android中Activity切换时共享视图元素的切换动画(5.0以上)
同一时候公布在我的博客 点此进入 背景 说来这个的背景很easy,常常在使用图片列表的时候就会想,假设"列表中的图片放大到整个屏幕"作为 Activity 的补间动画.就很完美了. ...
- 关于含RecyclerView的fragment来回切换时页面自动滑动到底部的解决方法
原因: 在fragment中来回切换时RecyclerView获得了焦点,而RecyclerView的 focusableOnTouchMode属性默认是true,所以在切换时RecyclerView ...
- Android 中Activity生命周期分析:Android中横竖屏切换时的生命周期过程
最近在面试Android,今天出了一个这样的题目,即如题: 我当时以为生命周期是这样的: onCreate --> onStart -- ---> onResume ---> onP ...
- 在使用Qt5.8完成程序动态语言切换时遇到的问题
因为之前了解过一些Qt国际化的东西,所以在写程序的时候需要显示给用户的字符都使用了 tr(" ")的形式,然后使用 Qt Linguist得到相应的 qm(Qt message)文 ...
- 【转】Android Fragment中使用SurfaceView切换时闪一下黑屏的解决办法
重构了下之前自己的一个新闻客户端,全部使用了Fragment来进行页面切换,只有一个入口Activity作为程序的启动Activity,其中有一个界面需要调用摄像头识别二维码, 于是就会用到Surfa ...
- 从Excel中导入数据时,提示“未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序”的解决办法
注意,64位系统,用64位的补丁文件; https://www.cnblogs.com/A2008A/articles/2438962.html 操作系统:使用的是64位的Windows Server ...
- 解决微信小程序的wx-charts插件tab切换时的显示会出现位置移动问题-tab切换时,图表显示错乱-实现滑动tab
解决Echarts在微信小程序tab切换时的显示会出现位置移动问题 tab切换时,图表显示错乱 <canvas class="kcanvas" canvas-id=" ...
- Android 如何去掉手机中横竖屏切换时的转屏动画?
前言 欢迎大家我分享和推荐好用的代码段~~ 声明 欢迎转载,但请保留文章原始出处: CSDN:http://www.csdn.net ...
随机推荐
- flask上下文管理相关 - threading.local 以及原理剖析
threading.local 面向对象相关: setattr/getattr class Foo(object): pass obj = Foo() obj.x1 = 123 # object.__ ...
- 集群架构04·NFS服务,环境安装
初识 网络文件系统Netwrok File System,类似于wiin10的网络共享 功能:通过网络让不同主机系统之间可以共享文件或目录 客户端通过挂载的方式将服务器端共享的目录挂载到本地系统. 集 ...
- 思科S系列220系列交换机多个漏洞预警
补天漏洞响应平台近期监测思科官方发布了关于思科 S 系列 220 系列交换机的3个漏洞修复通告,其中包含2个高危漏洞,最高CVSS 3.0评分9.8. 更新时间 2019年 08月 09日 威胁目标 ...
- [Cometoj#4 E]公共子序列_贪心_树状数组_动态规划
公共子序列 题目链接:https://cometoj.com/contest/39/problem/E?problem_id=1585 数据范围:略. 题解: 首先可以考虑知道了$1$的个数和$3$的 ...
- [百家号]7nm ARM 64核!华为Hi1620高性能CPU公开:3.0GHz
7nm ARM 64核!华为Hi1620高性能CPU公开:3.0GHz https://baijiahao.baidu.com/s?id=1617735663824201180&wfr=spi ...
- POJ3046ANT_COUNTING
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> ...
- Python_oneday
基本程序设计 一切代码输入,请使用英文输入法 编写一个简单的程序 圆公式面积: area = radius * radius * 3.1415 在Python里面不需要定义数据的类型 控制 ...
- Pygame小游戏练习四
@Python编程从入门到实践 Python项目练习 九.添加Play按钮 一.创建Button类 先让游戏一开始为非活动状态 # game_stats.py # --snip-- self.game ...
- 解决python在cmd运行时导入包失败,出现错误信息 "ModuleNotFoundError: No module named ***"
1.下图为我的自动化测试工程结构图 我通过运行run.bat批处理文件,调用cmd控制台运行start_run.py来开始我的自动化测试,但是出现如下错误: 大家可能知道我们的工程在IDE(Pycha ...
- 优化方法总结以及Adam存在的问题(SGD, Momentum, AdaDelta, Adam, AdamW,LazyAdam)
优化方法总结以及Adam存在的问题(SGD, Momentum, AdaDelta, Adam, AdamW,LazyAdam) 2019年05月29日 01:07:50 糖葫芦君 阅读数 455更多 ...