CORTEX-M3中断的现场保护问题

在《Cortex-M3 Devices Generic User Guide.pdf》中介绍了异常入栈和出栈的情况,详见2.3 Exception model。Cortex-M3内核的寄存器如下。

异常发生时,入栈的寄存器是R0~R3+R12+PC+LR+SP。为啥袒护R0‐R3以及R12呢, R4‐R11就是下等公民?(摘自《Cortex-M3权威指南 》第9章) 
原来,在ARM上,有一套的C函数调用标准约定(《 C/C++ rocedure Call Standard for the ARM Architecture》,AAPCS, Ref5)。个中原因就在它上面:它使得中断服务例程能用C语言编写,编译器优先使用被入栈的寄存器来保存中间结果(当然,如果程序过大也可能要用到R4‐R11,此时编译器负责生成代码来push它们。但是, ISR应该短小精悍,不要让系统如此操心——译者注)。如果读者再仔细看,会发现R0‐R3, R12是最后被压进去的。这里也有一番良苦用心:为的是可以更容易地使用SP基址来索引寻址,( 以及为了LDM等多重加载指令,因为LDM必须加载地址连续的一串数据)。参数的传递也是受益者:使之可以方便地通过压入栈的R0‐R3取出( 主要为系统软件所利用,多见于SVC与PendSV中的参数传递)。 
这就是说,C编译器中断(异常)服务函数封装的这样的需求:当R0~R3+R12不够用时会使用R4‐R11,在使用R4‐R11之前会进行入栈保护;在使用完之后进行出栈恢复现场。 
这也为开发人员使用汇编语言编写中断服务函数提供了借鉴。比如,在uC/OS-III移植过程中使用汇编编写任务级/中断级调度器。调度器需要触发Cortex-M3的滴答定时器中断来达到现场保护和任务切换的目的。而这个滴答定时器中断就需要使用汇编编写(详见已经移植好了的os_cpu_a.s)。 
对uC/OS-III其他中断即可使用C编译器提供的模板即可: 
void xxxxx_xxxHandler(void) ? 

OSIntEnter(); 
…… //中断服务函数代码 
OSIntExit();   

分析一下其过程 
响应xxxxx_xxxHandler之后,保存现场R0~R3+R12+PC+LR+SP,执行OSIntEnter()和中断服务函数代码(若这期间如果通用寄存器不够用时会使用R4‐R11,使用前会先进行入栈保护,使用后出栈恢复现场),然后会在中断级调度器OSIntExit()中判定是否需要进行任务切换,如果需要则定位好待切换的任务,最后挂起由汇编编写的滴答定时器中断。这会引入“咬尾机制”直接转而去执行滴答定时器中断服务函数。

通过对C编译器封装的中断服务函数模型进行的“背地儿里”的操作,可以预见C编译器对普通函数模型封装的额外操作。至少不会比这个复杂吧....

----

原文地址:https://www.cnblogs.com/Ph-one/p/11119034.html

时间: 2024-10-14 22:42:20

CORTEX-M3中断的现场保护问题的相关文章

Cortex M3 NVIC与中断控制

Cortex M3 NVIC与中断控制 宗旨:技术的学习是有限的,分享的精神的无限的. 一.NVIC概览 --嵌套中断向量表控制器 NVIC 的寄存器以存储器映射的方式来访问,除了包含控制寄存器和中断处理的控制逻辑之外, NVIC 还包含了 MPU. SysTick 定时器以及调试控制相关的寄存器. NVIC 共支持 1 至 240 个外部中断输入(通常外部中断写作 IRQs).具体的数值由芯片厂商在设计芯片时决定.此外, NVIC 还支持一个"永垂不朽"的不可屏蔽中断( NMI)输入

Intent七大属性,Activity的启动方式,横竖屏切换的生命周期,现场保护-->

---------------------------------Intent七大属性------------------------------------- 第一类:启动,有ComponentName(显式),Action(隐式),Category(隐式). 第二类:传值,有Data(隐式),Type(隐式),Extra(隐式.显式). 第三类:启动模式,有Flag. ---------------------------------------Activity的启动方式----------

android 四大组件Acitivity (2) 保存activity状态 (现场保护)

Activity 现场保护 @Override protected void onSaveInstanceState(Bundle outState) { //保存数据 super.onSaveInstanceState(outState); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { //恢复数据 super.onRestoreInstanceState(savedInstance

ARM cortex M3寄存器及指令集

1.cortex M3拥有通用寄存器R0-R15及一些特殊寄存器: R0‐R7 也被称为低组寄存器.所有指令都能访问它们.它们的字长全是 32 位,复位后的初始值是不可预料的. R8‐R12 也被称为高组寄存器.这是因为只有很少的 16 位 Thumb 指令能访问它们, 32位的指令则不受限制.它们也是 32 位字长,且复位后的初始值是不可预料的 . R13 是堆栈指针.在 CM3 处理器内核中共有两个堆栈指针,于是也就支持两个堆栈.当引用 R13(或写作 SP)时,你引用到的是当前正在使用的那

stm32和cortex M3学习内核简单总结

1.stm32综述 2.寄存器组 3.操作模式和特权级别 4.存储器映射 5.中断和异常 6.其他 Stm32综述 这可以说是我第一款认真学习的单片机了,学完这个就要开启我通往arm9的大门了,接下来把我学到的东西做一个系统的概述: 上图是stm32的系统结构. 使用哈弗体系结构,取指和取数据分离, ICODE指令总线连接到flash闪存指令存储区,这个存储区的地址在0x00000000-0x1FFFFFFF之间,负责取指操作. DCODE数据总线负责在0x00000000-0x1FFFFFFF

ARM7 与Cortex M3的区别

Cortex-M3和ARM7的比较 2005年3月,ARM公司公布了最新的ARMv7架构,并定义了三大系列: ”A“系列面向尖端的基于虚拟内存的操作系统和用户应用.主要针对日益增长的运行包括Linux.Windows CE和Symbian在内的消费电子和无线产品: ”R“系列针对实时系统.主要针对需要运行实时操作系统来进行控制应用的系统,包括骑车电子.网络和影像系统. ”M“系列针对微控制器和低成本应用提供优化.针对开发费用非常敏感,同时对性能要求不断增加的嵌入式应用,如微控制器.骑车车身控制系

Android 学习笔记之实时保存数据-现场保护onSaveInstanceState()

数据保存:在软件开发中我们希望保存下各个Activity数据,以实现客户数据的时时保存,达到较好的用户体验. 那么我们需要解决如下问题: 1.什么时候保存? 2.保存哪些数据? 我想保存应用产生的数据,而这些用户的数据是在Activity与用户进行交互的时候产生的,就是界面上的数据,或者状态. 3.如何进行保存? 4.保存到哪里? 5.编写合适的例子? 创造思路,去哪寻找答案,首先,我想保存应用产生的数据,而这些用户的数据是在Activity与用户进行交互的时候产生的,所以我们进入Activit

汇编中利用堆栈进行现场保护与恢复

设有下面一段子程序: mov ah,2 mov dl,13 int 21h 看了就知道上面这段程序是调用了int 21来输出十六进制13. 那么,如果主程序直接这样调用: mov ax,1 mov dx,1 call 上面的代码 sub ax,1 sub dx,1 可以看出ax,dx初始化的时候就是1,那么虽然程序可以执行成功,但是,到call下面那句就不再是我们主程序所给出的值了,因为子程序也就是上面输出13的那段代码改变了ax和dx的值. 堆栈是内存中的一个特殊区域,可以先把ax和dx放到堆

μC/OS-Ⅲ系统的中断管理

一.典型的μC/OS-Ⅲ中断服务程序解析 μC/OS-Ⅲ系统中典型有内核参与中断服务程序示例如下: MyISR:                                                                 (1) Disable all interrupts;                                (2) Save the CPU registers;                             (3) OSIntNesti