Cortex-M3 任务切换函数实例
---------------------------------------------
-- 时间:2018-12-09
-- 创建人:Ruo_Xiao
-- 邮箱:xclsoftware@163.com
---------------------------------------------
一、声明
本人在“网易云课堂”报名了李述铜老师的《自己动手从0到1写嵌入式操作系统》课程,《内核编程实践》这堂课中讲解了任务切换的基本方法。对于核心函数“PendSV_Handler”的自己的理解我将记录在下面,由于该课程是付费课程,该工程的源码我觉得不能随便贴上,故只在这里粘贴必要的“PendSV_Handler”的源码,以供自己记录和该课程的学员参考,本人不会将该博客用于商业用途。如若我有侵权行为请告知,我会及时删除该篇文章。
二、源码
三、功能
1、该函数的功能是初步理解任务切换的本质,即:保存当前任务所使用的寄存器(R4~R11)的值到内存,中断或者异常服务例程执行完之后,再恢复中断或者异常之前任务的寄存器的值,从而继续执行该任务。
2、第8行~第13行代码是当前任务所使用的寄存器保存到内存。
3、第16行~第18行代码,功能是更新栈指针,即:R1。这里的R1相当于SP。
四、解释
1、开始执行该函数时,各个变量的地址及内容如下:
blockPtr 地址:0x2000 0000 , 内容 : 0x2000 0008
blockPtr->stackPtr 地址 :0x2000 0008 , 内容 :0x2000 1018
2、第8行:LDR R0, =blockPtr
这里blockPtr相当于符号,该代码的含义是将blockPtr的地址传给R0,即:R0 = &blockPtr = 0x2000 0000 。
3、第9行:LDR R0, [R0]
该代码的含义是R0 = *R0,也就是R0 = R0中的内容,即:R0 = blockPtr = &(bolckPtr->stackPtr) = 0x2000 0008。
4、第10行:LDR R0, [R0]
该代码的含义同上,即:R0 = bolckPtr->stackPtr = &stackBuffer[1024]= 0x20001018。
执行完该句,R0就指向了stackBuffer[1024]。
5、第13行:STMDB R0!, {R4-R11}
该代码的含义是将R11~R4的值逐个存储在stackBuffer[1023]~stackBuffer[1016]中,即:入栈。
过程如下:
R0 = R0 - 4 , 将R11压入*R0中。
R0 = R0 - 4 , 将R10压入*R0中。
……
R0 = R0 - 4, , 将R4压入*R0中。
结果如下:
执行到这里,就完成了将R4~R11入栈的使命。
6、第16行~17行,含义同第8行~第9行。
7、第18行: STR R0, [R1]
该代码的含义是将R0的值压入*R1中,即:bolckPtr->stackPtr = R0 = 0x20000FF8。
这里0x20000FF8是第13行执行完成之后,R0的值由0x2000 1018 - 0x0000 0020 (4*8的十六进制) = 0x20000FF8。
8、第21~22行,相当于执行是其他任务,任务内容是R4 = R4 + 1,,R5 = R5 + 1。
9、第25行:LDMIA R0!, {R4-R11}
将R0所执行的内存中的数据依次压入R4~R11中。
过程如下:
将*R0中的内容压入R4中,R0 = R0 + 4;
将*R0中的内容压入R5中,R0 = R0 + 4;
……
将*R0中的内容压入R11中,R0 = R0 + 4;
执行完之后,R0中的内容恢复到0x2000 1018,即:指向了stackBuffer[1024]。过程同STMDB相反
10、第28行:BX LR
异常返回。
整个函数执行完成之后,实现了保存寄存器入栈,执行其他任务,弹栈恢复寄存器的值,从而完成任务切换功能。
(SAW:Game Over!)
Cortex-M3 任务切换函数实例相关推荐
- Cortex‐M3的Faults异常究竟是什么?
关注+星标公众号,不错过精彩内容 作者 | strongerHuang 微信公众号 | strongerHuang 有许多朋友在学习,或者开发STM32时都遇到过HardFault_Handler的情 ...
- layui轮播图切换会有跳动_Layui中轮播图切换函数说明
### Layui中轮播图切换函数说明 ### ##### 官方文档 [链接][Link 1] ##### ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdG ...
- pyqt5 制作壁纸切换工具实例 第二章
pyqt5 制作壁纸切换工具实例 第一章 https://blog.csdn.net/mtl1994/article/details/118020546 提示:写完文章后,目录可以自动生成,如何生成可 ...
- pyqt5 制作壁纸切换工具实例 第一章
pyqt5 制作壁纸切换工具实例 第二章 https://blog.csdn.net/mtl1994/article/details/118152403 文章目录 前言 效果图 一.代码 1.结构 总 ...
- cortex m3的操作模式和状态
1.操作状态(operation state): debug state:处理器在调试器发起halt或匹配到断点时,会进入debug state并停止执行指令. thumb state:处理器正在运行 ...
- python中time函数用法_python中time tzset()函数实例用法
在时间的设置方面,为了能够跟系统时间有更好的区分,我们有时会借用一些函数方法来实现.就拿tzset()来说是设置时间的一种方法,其内在的变量依靠TZ的控制,如果没有设置TZ则以系统时间为准.接下来我们 ...
- php脚本函数,PHP执行系统命令函数实例讲解
命令注入 命令注入(Command Injection),对一些函数的参数没有做过滤或过滤不严导致的,可以执行系统或者应用指令(CMD命令或者 bash 命令)的一种注入攻击手段. 常见的执行系统命令 ...
- 一张图说明 函数, 实例(对象), 原型之间的关系
前言 很多初学者都对函数,实例(对象), 原型之间的关系理不清楚. 网上五花八门的文章很多,要么不知所云,要么是晦涩难懂. 本文意在用最简洁的语言跟示例让初学者理清楚这三者之间的关系,无需理会其内部原 ...
- countif和sum套用_if函数嵌套countif、sumif函数实例操作详解 你需要学习了
excel中if函数嵌套countif函数实例操作详解,需要了解if函数.countif函数.sumif函数字符串引用方式,isblank函数 操作方法 01 用扫描枪连接excel后将自动将货物名称 ...
最新文章
- 学校机房项目交换机的配置:
- Learning from Imbalanced Classes
- C# 无意间写了一段线程死锁的代码
- 实现Windows程序的数据更新
- [react] react与angular、vue有什么区别?
- linux3.0.4编译LDD中的scull全过程
- Linux禁止ip拒绝访问80,Linux iptables 设置允许(禁止)IP范围
- php 扩展 suhosin 配置不当引发的报错及其解决方法
- struct timeval结构体 以及 gettimeofday()函数
- 邮件退订_如何方便地退订邮件列表
- Ubuntu18.04安装最新R语言环境的方法
- python怎么读取github_如何通过Python模拟登陆Github?
- ffmpeg将sdp转发_ffmpeg常用命令
- POJ 3254 Corn Fields (状态压缩)
- git 密钥文件在哪里? 代码提交到Git分支。
- python编写程序统计一元人民币换成一分、两分和五分的所有兑换方案个数(用while循环)
- 那些简历造假拿 Offer 的程序员,后来都怎样了?
- matlab corner 舍弃,成长就是不断地丢弃与拾取 — 读The Glass Castle《玻璃城堡》有感...
- 计算机二级考试vb试题,2016计算机二级考试《VB》真题练习
- Linux常用命令(面试)
热门文章
- 实验13 简单FTP 程序设计
- pandas 读csv 报错 UnicodeDecodeError: 'utf-8' codec can't decode byte 0xca in position 0: invalid cont
- 服务端的第五次课程:安全,认证,授权
- golang配置export GOPRIVATE拉取私有库代码
- 【收藏】SonarQube-插件-离线安装PMD+阿里P3C
- k8s 通用的java项目迁移流程
- python django ansible自动化运维管理平台源码收藏
- 地图上的三国(一口气看完15幅地图)
- Corodva Could not resolve com.android.tools.build:gradle:3.0.1 解决方法
- k8s pod的创建流程图示