(转)UCOSII在任务切换与出入中断时堆栈指针的使用

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存储返回地址。

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

原文地址:https://www.cnblogs.com/yeshenmeng/p/9590814.html

时间: 2024-08-30 07:23:58

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

通过NQA实现当主用出口中断时 可以自动切换到备用出口

主用出口互联 172.71.8.1备用出口互联 172.21.39.1要通过NQA实现当主用出口中断时 可以自动切换到备用出口. NQA配置nqa test-instance admin monitortest-type icmpdestination-address ipv4 202.96.199.133source-address ipv4 61.187.xx.xxnexthop ipv4 172.71.8.1frequency 10probe-count 2start now test-t

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

1.ARM处理器各个模式之间是如何切换的? 答:除用户模式外的其他6种模式称为特权模式,这些模式中,程序可以访问所有系统资源,也可以任意进行处理器模式的切换.处理器模式可以通过软件控制进行切换(直接设置CPSR寄存器的后五位就可以在6种特权模式之间互相切换),也可以通过外部中断或异常处理过程进行切换(例如,在USR模式下,发生中断后切换到IRQ模式). 2.ARM各个模式之间切换时,上下文的保存哪些是硬件在做?哪些是操作系统在做? 答:CPU做的: (1)把返回地址保存到相应模式的lr寄存器中,

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

1.ARM处理器各个模式之间是怎样切换的? 答:除用户模式外的其它6种模式称为特权模式,这些模式中,程序能够訪问全部系统资源,也能够随意进行处理器模式的切换.处理器模式能够通过软件控制进行切换(直接设置CPSR寄存器的后五位就能够在6种特权模式之间互相切换),也能够通过外部中断或异常处理过程进行切换(比如,在USR模式下,发生中断后切换到IRQ模式). 2.ARM各个模式之间切换时,上下文的保存哪些是硬件在做?哪些是操作系统在做? 答:CPU做的: (1)把返回地址保存到对应模式的lr寄存器中,

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

在编辑区,切换当前编辑文件时(单击.cpp或.h文件选项卡),"解决方案资源管理器"目录树会自动定位当前编辑的文件,并以灰色标识,当一个解决方案中的工程数目数目很多,每个工程下面又包含很多文件夹结构时,这个功能就能相当方便的自动定位出,当前编辑的文件在哪个工程中. 设置方法: [解决方案] 工具->选项- > 项目解决方案中,在解决方案资源管理器中跟踪活动项

java开发系统内核:让内核从严重错误中恢复

更详细的讲解和代码调试演示过程,请参看视频 用java开发C语言编译器 更详细的讲解和代码调试演示过程,请参看视频 如何进入google,算法面试技能全面提升指南 如果你对机器学习感兴趣,请参看一下链接: 机器学习:神经网络导论 更详细的讲解和代码调试演示过程,请参看视频 Linux kernel Hacker, 从零构建自己的内核 微软早期的DOS系统,存在一个严重的问题是,如果应用程序运行出现问题,它会导致整个系统完全奔溃掉,我们当前的系统内核也存在这一的问题,例如打开api_call.as

μCos-ii学习笔记2_任务管理

二.任务管理 任务管理是ucos-ii操作系统的核心内容.这一章大致就以下流程来介绍和总结任务管理的相关知识. 要实现复杂任务管理,必然要定义众多数据来描述任务状态,为了精简,建立了许多不同的数据结构,所以第一步就是了解这些数据结构和构成.为了避免枯燥,我们同时要认识到每一种结构具体起到什么作用,感受其中的精妙之处,这样理解起来就更容易了. 建立完必要的数据结构,程序在OS_TCBInit()中对TCB进行初始化,在OSInit()中对操作系统的其他重要数据结构进行初始化. 操作系统在启动和运行

ucos 学习

1.UCOSII 早期版本只支持 64 个任务,但是从 2.80 版本开始,支持任务数提高到 255 个,不过对我们来说一般 64 个任务都是足够多了,一般很难用到这么多个任务. UCOSII 保留了最高4 个优先级和最低 4 个优先级的总共 8 个任务,用于拓展使用,单实际上, UCOSII 一般只占用了最低 2 个优先级,分别用于空闲任务(倒数第一)和统计任务(倒数第二),所以剩下给我们使用的任务最多可达 255-2=253 个 Ucos 的原理本质上也是这样的,当一个任务 A 正在执行的时

VS2010调试多进程--医疗His调试中使用

有些时候碰到自己开发的程序嵌入到别人的框架中,而在接口的地方出了问题,而又不方便将自己的模快加入到别人的工程中这个时候VS的附加到进程调试变得不可或缺了,直奔主题 http://msdn.microsoft.com/zh-cn/library/ms123401.aspx 选择启动项目 在“解决方案资源管理器”中,右击项目名,然后在快捷菜单上单击“设为启动项目”. 如果要调试不止一个项目,可以选择多个启动项目. 选择多个启动项目 在“解决方案资源管理器”中,右击此解决方案名并在快捷菜单上单击“属性

201521123116 《java程序设计》第十周学习总结

1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 2. 书面作业 Q1 finally 题目4-2 1.1 截图你的提交结果(出现学号) 1.2 4-2中finally中捕获异常需要注意什么? 答:需要注意的是分两种情况捕获异常,第一种是打开资源的时候可能抛出Exception异常,第二种是释放资源的时候可能抛出RuntimeException异常,最后无论成功与否都要释放资源,即用finally语句. Q2:用异常改进ArrayIntegerStack