当前位置: 首页 > news >正文

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

相关文章:

  • 强化学习(三)用动态规划(DP)求解
  • 初识kaggle,以及记录 kaggle的使用
  • 强化学习(四)用蒙特卡罗法(MC)求解
  • 阿里面试 深度学习[转]
  • 亲历亚马逊、华为机器学习面试,原来考官想听到这些回答[转]
  • 枸杞常泡水喝好吗?
  • 【转载】 再励学习面试真题 (强化学习面试真题)
  • 2018年强化学习领域十篇重要论文(附源码)[转]
  • 强化学习新思潮1:值分布强化学习(01)
  • Linux内核中的算法和数据结构
  • Linux中mkdir和touch命令区别
  • linux nand flash常用命令
  • 迁移学习 Transfer Learning
  • PYNQ系列学习(二)——pynq与zynq对比(一)
  • [IMX6DL] CPU频率调节模式以及降频方法
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • Android Volley源码解析
  • css属性的继承、初识值、计算值、当前值、应用值
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • Javascript弹出层-初探
  • LeetCode18.四数之和 JavaScript
  • Promise面试题2实现异步串行执行
  • windows下使用nginx调试简介
  • Yeoman_Bower_Grunt
  • 反思总结然后整装待发
  • 区块链分支循环
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • mysql面试题分组并合并列
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • (¥1011)-(一千零一拾一元整)输出
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (八)c52学习之旅-中断实验
  • (第二周)效能测试
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (实战篇)如何缓存数据
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • (转)程序员技术练级攻略
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • .Net 8.0 新的变化
  • .NET DataGridView数据绑定说明
  • .NetCore项目nginx发布
  • /deep/和 >>>以及 ::v-deep 三者的区别
  • @ConfigurationProperties注解对数据的自动封装
  • @staticmethod和@classmethod的作用与区别
  • []利用定点式具实现:文件读取,完成不同进制之间的
  • [20150707]外部表与rowid.txt
  • [BZOJ3757] 苹果树
  • [bzoj4010][HNOI2015]菜肴制作_贪心_拓扑排序
  • [CF543A]/[CF544C]Writing Code
  • [CQOI 2011]动态逆序对
  • [DM复习]关联规则挖掘(下)