---------------------------------------------
-- 时间: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 任务切换函数实例相关推荐

  1. Cortex‐M3的Faults异常究竟是什么?

    关注+星标公众号,不错过精彩内容 作者 | strongerHuang 微信公众号 | strongerHuang 有许多朋友在学习,或者开发STM32时都遇到过HardFault_Handler的情 ...

  2. layui轮播图切换会有跳动_Layui中轮播图切换函数说明

    ### Layui中轮播图切换函数说明 ### ##### 官方文档 [链接][Link 1] ##### ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdG ...

  3. pyqt5 制作壁纸切换工具实例 第二章

    pyqt5 制作壁纸切换工具实例 第一章 https://blog.csdn.net/mtl1994/article/details/118020546 提示:写完文章后,目录可以自动生成,如何生成可 ...

  4. pyqt5 制作壁纸切换工具实例 第一章

    pyqt5 制作壁纸切换工具实例 第二章 https://blog.csdn.net/mtl1994/article/details/118152403 文章目录 前言 效果图 一.代码 1.结构 总 ...

  5. cortex m3的操作模式和状态

    1.操作状态(operation state): debug state:处理器在调试器发起halt或匹配到断点时,会进入debug state并停止执行指令. thumb state:处理器正在运行 ...

  6. python中time函数用法_python中time tzset()函数实例用法

    在时间的设置方面,为了能够跟系统时间有更好的区分,我们有时会借用一些函数方法来实现.就拿tzset()来说是设置时间的一种方法,其内在的变量依靠TZ的控制,如果没有设置TZ则以系统时间为准.接下来我们 ...

  7. php脚本函数,PHP执行系统命令函数实例讲解

    命令注入 命令注入(Command Injection),对一些函数的参数没有做过滤或过滤不严导致的,可以执行系统或者应用指令(CMD命令或者 bash 命令)的一种注入攻击手段. 常见的执行系统命令 ...

  8. 一张图说明 函数, 实例(对象), 原型之间的关系

    前言 很多初学者都对函数,实例(对象), 原型之间的关系理不清楚. 网上五花八门的文章很多,要么不知所云,要么是晦涩难懂. 本文意在用最简洁的语言跟示例让初学者理清楚这三者之间的关系,无需理会其内部原 ...

  9. countif和sum套用_if函数嵌套countif、sumif函数实例操作详解 你需要学习了

    excel中if函数嵌套countif函数实例操作详解,需要了解if函数.countif函数.sumif函数字符串引用方式,isblank函数 操作方法 01 用扫描枪连接excel后将自动将货物名称 ...

最新文章

  1. 学校机房项目交换机的配置:
  2. Learning from Imbalanced Classes
  3. C# 无意间写了一段线程死锁的代码
  4. 实现Windows程序的数据更新
  5. [react] react与angular、vue有什么区别?
  6. linux3.0.4编译LDD中的scull全过程
  7. Linux禁止ip拒绝访问80,Linux iptables 设置允许(禁止)IP范围
  8. php 扩展 suhosin 配置不当引发的报错及其解决方法
  9. struct timeval结构体 以及 gettimeofday()函数
  10. 邮件退订_如何方便地退订邮件列表
  11. Ubuntu18.04安装最新R语言环境的方法
  12. python怎么读取github_如何通过Python模拟登陆Github?
  13. ffmpeg将sdp转发_ffmpeg常用命令
  14. POJ 3254 Corn Fields (状态压缩)
  15. git 密钥文件在哪里? 代码提交到Git分支。
  16. python编写程序统计一元人民币换成一分、两分和五分的所有兑换方案个数(用while循环)
  17. 那些简历造假拿 Offer 的程序员,后来都怎样了?
  18. matlab corner 舍弃,成长就是不断地丢弃与拾取 — 读The Glass Castle《玻璃城堡》有感...
  19. 计算机二级考试vb试题,2016计算机二级考试《VB》真题练习
  20. Linux常用命令(面试)

热门文章

  1. 实验13 简单FTP 程序设计
  2. pandas 读csv 报错 UnicodeDecodeError: 'utf-8' codec can't decode byte 0xca in position 0: invalid cont
  3. 服务端的第五次课程:安全,认证,授权
  4. golang配置export GOPRIVATE拉取私有库代码
  5. 【收藏】SonarQube-插件-离线安装PMD+阿里P3C
  6. k8s 通用的java项目迁移流程
  7. python django ansible自动化运维管理平台源码收藏
  8. 地图上的三国(一口气看完15幅地图)
  9. Corodva Could not resolve com.android.tools.build:gradle:3.0.1 解决方法
  10. k8s pod的创建流程图示