1 uc/os ii在M3中的堆栈结构

1.1 M3入账序列 
 
1.2 加上手工入栈序列 

2 PendSV在Cortex-M3中的应用

Systick为嵌入到内核中,优先级比一般中断优先级高。若在一般中断的ISR执行过程中,发生了Systick异常,则Systick会抢占该ISR。若此时Systick做上下文切换,在M3中将触发用法fault(在中断活跃时尝试切入线程模式)。即使在别的内核体系下不发生硬fault,ISR也会被延迟,这对于任一讲究实时性的系统是不能接受的。 
所以Systick只是在其服务程序中触发一个PendSV中断(事先将PendSV中断优先级设置的很低)。Systick返回后将继续执行被抢占的中断ISR。执行完后,程序跳转到PendSV服务程序中执行任务切换。

3 M3中堆栈的切换

3.1 在中断返回时,通过修改LR中的EXC_RETURN 
3.1.1 EXC_RETURN 
在出入ISR的时候,LR的值将得到重新的诠释,这种特殊的值称为“EXC_RETURN”, 
在异常进入时由系统计算并赋给LR,并在异常返回时使用它。EXC_RETURN的二进制值除了最低4位外全为1,而其最低4位则有另外的含义。 
表1 EXC_RETURN位段详解 
 
表2 合法的EXC_RETURN值及功能 

3.2 异常返回和异常返回序列 
M3 提供的异常返回指令 
 
出栈:先前压入栈中的寄存器在这里恢复。内部的出栈顺序与入栈时的相对应,堆栈指针的值也改回先前的值。 
只要ISR没有更改过CONTROL[1],就依然使用发生本次异常的瞬间正在使用的SP指针来执行出栈操作。

3.3 修改EXC_RETURN,进行模式和堆栈的选择。 
在异常ISR中,处理器处于特权模式,可以访问所有存储器(除MPU规定)。通过修改LR的值来达到不同模式和堆栈的切换。

4、再论M3双堆栈机制

已经知道M3堆栈分为MSP和PSP,CONTROL[1]决定如何选择。当CONTROL[1]为0时,只使用MSP,此时用户程序和异常handler共享一个堆栈。 
当CONTROL[1]为1时,线程模式将不再使用MSP,而改用PSP。这样做的好处在OS内核中防止用户程序 的堆栈破坏OS的堆栈。在在这种情况下进入异常的自动压栈使用的是进程堆栈,进入异常handler后才自动改为MSP,退出异常时切换回PSP,并且从进程堆栈上弹出数据

5、理解M3中的R14

1 在中断 
在出入ISR的时候,LR的值将得到重新的诠释,这种特殊的值称为“EXC_RETURN”。在异常进入时由系统计算并赋给LR,并在异常返回时使用它。

2 在函数跳转 
当呼叫一个子程序时,由R14存储返回地址。

6、UCOSII中的PSP MSP

1 、执行任务的时候用的是PSP

PSP堆栈指针在任务初始化的时候指向的是任务的堆栈而不是CPU内核堆栈,即在创建任务的时候定义的全局变量数组

当任务运行时,任务堆栈用来保存一些局部变量

当任务挂起时,任务堆栈负责保存任务的运行现场,也就是CPU寄存器的值

2、执行中断的时候用的是MSP

MSP指向CPU内核堆栈,就是启动文件里面分配的堆栈大小

文章转载自:https://blog.csdn.net/sunheshan/article/details/48554327

(转)UCOSII在任务切换与出入中断时堆栈指针的使用的更多相关文章

  1. vs切换当前编辑文件时自动定位目录树

    在编辑区,切换当前编辑文件时(单击.cpp或.h文件选项卡),"解决方案资源管理器"目录树会自动定位当前编辑的文件,并以灰色标识,当一个解决方案中的工程数目数目很多,每个工程下面又 ...

  2. 解决win10系统中将JDK1.8切换到JDK1.7时一直失败的问题

    场景:win10系统安装了1.7版本的JDK后,又安装了1.8版本的JDK,在后面的使用中想进行互相切换,但是1.8切换到1.7时一直失败   第一步:  删除 C:\Windows\System32 ...

  3. [Python学习]错误篇二:切换当前工作目录时出错——FileNotFoundError: [WinError 3] 系统找不到指定的路径

    REFERENCE:<Head First Python> ID:我的第二篇[Python学习] BIRTHDAY:2019.7.13 EXPERIENCE_SHARING:解决切换当前工 ...

  4. ARMv7处理器各个模式之间是怎样切换的?模式切换时上下文的保存哪些是硬件在做?哪些是操作系统在做?

    1.ARM处理器各个模式之间是怎样切换的? 答:除用户模式外的其它6种模式称为特权模式,这些模式中,程序能够訪问全部系统资源,也能够随意进行处理器模式的切换.处理器模式能够通过软件控制进行切换(直接设 ...

  5. 切换或者用户登录时 出现 显示 -bash-4.2$ 问题 的解决

    集群的普通用户在登录用户或者切换用户时,出现 -bash-4.2$ 的状态: [goldwind@TR-OS-DB 9.4]#su postgres bash-4.2$ 原因:在linux下通过use ...

  6. vue中setTimeout切换浏览器页签时怎么清除解决方案

    大家都知道,vue中有完整的生命周期,this.$router.push('')可以跳到相应的页面中,在beforeDestroy中可以监听到,将定时器清空,又或是通过this._isDestroye ...

  7. flex mx:TabNavigator进行选项卡切换,需要进行交互时。发生Error #1009错误

    当需要进行 mx:TabNavigator选项卡进行切换时,需要进行交互,然后却报了"TypeError: Error #1009: 无法访问空对象引用的属性或方法."错误,产生这 ...

  8. 切换不同的echarts时,出现图标缩小,报警告,Can’t get dom width or height!

    出现这样的原因是因为,在切换的时候,图表所对应的标签还没有显示出来,最好将代码放在$nextick里面执行,并且,采用使用v-if进行切换 转载:https://www.pianshen.com/ar ...

  9. rsyslog 读日志文件 ,当rsyslog 中断时,也会丢数据

    rsyslog 日志服务器: [root@dr-mysql01 winfae_log]# grep scan0819 wj-proxy01-catalina.out.2016-08-19 [root@ ...

随机推荐

  1. 学习MFC的建议

    1.继续深入学习C++的内容,打好面向对象的程序综合设计与编程基础,参考书籍<C++Primer>. 2.打好Windows编程基础(参考书<Windows程序设计>(第五版) ...

  2. vector at()函数比 []运算符操作安全

    转载:https://blog.csdn.net/chenjiayi_yun/article/details/18507659 []操作符的源码 reference operator[](size_t ...

  3. 【python011--数组2】

    一.从列表中获取元素 *跟数组一样,我们可以通过元素的索引值(index)从列表获取单个元素,注意,列表索引值是从0开始的 >>> member= ['尘封','冰点','无名',' ...

  4. Restful framework【第二篇】APIView

    安装djangorestframework 方式一:pip3 install djangorestframework 方式二:pycharm图形化界面安装 方式三:pycharm命令行下安装(装在当前 ...

  5. Docker Tomcat远程部署到容器

    一:创建一个开启远程部署的tomcat容器 tomcat角色配置 1.tomcat开启远程部署,修改conf/tomcat-users.xml <?xml version="1.0&q ...

  6. 【做题】CF196E. Opening Portals 排除无用边&最小生成树

    题意:给出一个有\(n\)个结点,\(m\)条边的连通无向图,边有边权,等于经过这条边所需的时间.有\(k\)个点设有传送门.一开始,所有传送门关闭.你从\(1\)号点出发,每当你到达一个有传送门的点 ...

  7. ocacle sql: 两张表左连接 ,1对多,取一条数据,取按时间最新的

    说明: MBGL_GZJH jh_id 对应 mbgl_gzjh_fkmx jh_id mbgl_gzjh_fkmx jh_id 有重复多条,但是 FKRQ 不一样,我们去 FKRQ 最新的一条. s ...

  8. java 偏向锁,轻量锁,重量级锁

    synchronized的执行过程: 1. 检测Mark Word里面是不是当前线程的ID,如果是,表示当前线程处于偏向锁 2. 如果不是,则使用CAS将当前线程的ID替换Mard Word,如果成功 ...

  9. Microsoft.EntityFrameworkCore.Sqlite的学习

    SQLite in ASP.NET Core with EntityFrameworkCore ASP.NET Core 2: Using SQLite as a light weight datab ...

  10. Highlight.js语法突出显示

    正如我在这个博客开始之前所说的最小可行产品,因此我在几个小时内就开始运行了.这种方法在初始推动之后会减慢你的速度.最新的例子是要提供语法高亮的代码片段. 规格由于使用静态网站生成器,我的狩猎的开始立即 ...