历史上的今天
返回首页

历史上的今天

今天是:2024年12月03日(星期二)

正在发生

2018年12月03日 | ARM Cortex-M3中断跳转过程

2018-12-03 来源:eefocus

在学习CM3的时候,仔细学习了CM3的中断跳转过程,发现嵌入式的MCU在这一块基本上是一样的,当然不同架构的MCU也有自己的特性。


我来介绍下CM3的中断跳转过程,首先假设中断发生,CM3内核开始响应中断,由于不同厂家的CM3可能略有区别,但CM3的内核肯定是一样的,所以我们在这个前提下开始讨论,暂时把中断屏蔽位,标志位之类的东西放在一边。


现在介绍中断响应的过程:


1、压栈。从这一点来讲几乎所有的处理器都是一样的,用压栈保护现场。压入哪些寄存器呢,又是怎样一个顺序?如果就大多数的C语音编程来讲,这个不是很关心的内容。但是CM3的压栈寄存器特点,让我们来见识下ARM设计的特点。其压栈顺序如下图所示,请注意压栈的地址顺序和时间顺序不是相同的。


地址(SP)

寄存器

被保护顺序(时间顺序)

N-0

之前已压栈内容


N-4

xPSR

2

N-8

PC

1

N-12

LR

8

N-16

R12

7

N-20

R3

6

N-24

R2

5

N-28

R1

4

N-32

R0

3


这一点就我们普通coding来讲,是非常奇特的,堆栈的空间顺利和进栈时间没有必然联系,跟我们“后进先出”的观点有很大出入,那么显然这里的“堆栈”,并不是我们传统意义的上的堆栈,具体怎样实现ARM没有详述,只是说他们可以做到这点。


我们可以看到PC,xPSR,R0,R1,R2,R3是率先入栈的(时间上),这样做的目的,是为了编译器优先使用入栈了的寄存器来保存中间结果(如果程序过大也可能要用到R4-R11,此时编译器负责生成代码来push它们)。这也是要求ISR尽量短小的原因,用更少的寄存器,以加快响应。


2、查找中断向量表。其实这一步跟第一步是并行的,只是为了分别介绍我,列了序号。ARM是有D-Code(数据总线)和I-Code(指令总线),两条总线。可以看到PC是第一个压栈的,此时数据总线正忙于压栈操作,与此同时指令总线就可以查找中断向量表,查询中断服务程序的入口地址。在CM3中中断向量表位于地址从0x00000000开始的一段存储空间,每个表项占一个字(4byte)。这是中断向量表没有重定位的情况,当然中断向量表也可以重定位,即存储在其他地方。这个需要设置相应的寄存器,我个人认为还是让其固定在这个默认的位置比较好,以免出现以外情况。在看中断向量表的时候我遇到了一个很有意思的问题:


中断服务函数的入口地址为0x67C(图1所示),但是中断向量表中存储的地址确是0x67D(图2所示),竟然加了1。

 

这让我纠结了很久,后来一位整ARM7的大牛解答了我的问题。ARM的PC最低位是0的时候ARM会进入ARM模式,但是最低位是1的时候会进入thumb模式。而我们的CM只支持thumb模式,所以PC最低位必须为1。而且thumb指令集是16位的,所以0x67D就是指向0x67C所存储的指令,但是减一就不行了,就变成了指令空间内上一个地址存储的指令。

       

把CM3中断跳转过程写出来跟大家分享,若有不妥之处,望大家斧正。


图1 方框内为所对应中断服务函数入口地


图2 方框内为中断向量表中中断服务函数入口地址


***************************************************************************


记得在DSP TMS32F2812中,中断向量的初始化是由一段地址拷贝代码完成的,在STM32(Cortex-M3)中没有显示的代码拷贝,只有启动代码进行了向量的初始化,一直以为是编译器在程序影像中自己完成了相关向量的拷贝,即,拷贝到固定的NVIC区,事实上并不是这样,cortex-m3并没有一块专门用于存放NVIC向量表的地方,这张表实际是存放在代码(程序映像)的开始,下面引用cortex-M3权威指南进行解释:


当发生了异常并且要响应它时,CM3需要定位其服务例程的入口地址。这些入口地址存储在所谓的“(异常)向量表”中。缺省情况下,CM3认为该表位于零地址处,且各向量占用4字节。因此每个表项占用4字节,如表7.6所示。

      


因为地址0处应该存储引导代码,所以它通常映射到Flash或者是ROM器件,并且它们的值不得在运行时改变。然而,为了支持动态重分发中断,CM3允许向量表重定位——从其它地址处开始定位各异常向量。这些地址对应的区域可以是代码区,但更多是在RAM区。在RAM区就可以修改向量的入口地址了。为了实现这个功能,NVIC中有一个寄存器,称为“向量表偏移量寄存器”(在地址0xE000_ED08处),通过修改它的值就能重定位向量表。但必须注意的是:向量表的起始地址是有要求的:必须先求出系统中共有多少个向量,再把这个数字向上“圆整”到2的整次幂,而起始地址必须对齐到后者的边界上。例如,如果一共有32个中断,则共有32+16(系统异常)=48个向量,向上圆整到2的整次幂后值为64,因此向量表重定位的地址必须能被64*4=256整除,从而合法的起始地址可以是:0x0, 0x100, 0x200等。向量表偏移量寄存器的定义如表7.7所示。



如果需要动态地更改向量表,则对于任何器件来说,向量表的起始处都必须包含以下向量:


 主堆栈指针(MSP)的初始值

 复位向量

 NMI

 硬fault服务例程

后两者也是必需的,因为有可能在引导过程中发生这两种异常。

可以在SRAM中开出一块空间用于存储向量表。在引导期间先填写好各向量,然后在引导完成后,就可以启用内存中的新向量表,从而实现向量可动态调整的能力。


推荐阅读

史海拾趣

First Silicon Co., Ltd公司的发展小趣事

面对日益激烈的市场竞争,First Silicon公司深知供应链管理的重要性。公司投入大量资源,对供应链进行了全面整合和优化。通过建立长期稳定的供应商关系、引入先进的供应链管理软件和提高库存周转率等措施,First Silicon有效降低了原材料成本和库存风险。同时,公司还加强了与下游客户的沟通和合作,确保产品能够及时、准确地送达客户手中。这一系列举措不仅提升了公司的运营效率,还增强了其市场竞争力。

ACCUTEK公司的发展小趣事

在发展过程中,ACCUTEK公司始终注重品牌建设和品质提升。公司投入大量资源用于品牌推广和市场宣传,提高了品牌知名度和美誉度。同时,公司还建立了严格的质量管理体系和售后服务体系,确保每一台出厂的设备都能达到客户的要求和期望。这些举措有效地提升了公司的市场竞争力,赢得了更多客户的信任和支持。

ETC公司的发展小趣事

在ETC领域,速通科技积极寻求与行业内其他企业的合作。公司与多家银行、保险公司等金融机构建立了合作关系,共同推广ETC系统的应用。此外,速通科技还积极参与行业标准的制定和修订工作,推动ETC行业的健康发展。通过与行业内其他企业的合作,速通科技实现了共赢发展,共同推动了ETC行业的进步。

GWP Group公司的发展小趣事

北京速通科技有限公司(以下简称速通科技)作为ETC行业的领军企业,其创立之初就专注于电子不停车收费系统(ETC)的研发与应用。随着国内交通拥堵问题的日益严重,速通科技看到了ETC系统在未来交通管理中的重要地位。公司组建了一支由行业专家和技术精英组成的团队,开始了ETC技术的探索之路。

Elpakco Inc公司的发展小趣事

Elpakco Inc公司的创立,源于创始人对电子行业未来趋势的敏锐洞察。在电子科技日新月异的时代,创始人凭借在半导体封装领域的丰富经验和深厚技术积累,决定创立一家专注于高精度电子元件封装的公司。初创时期,资金紧张、技术难度大、市场竞争激烈,但创始人带领团队夜以继日地研发,不断突破技术瓶颈,终于成功研制出第一款高精度、高可靠性的电子封装产品,为公司的发展奠定了坚实的基础。

HOPERF公司的发展小趣事

在无线射频和传感器领域,HOPERF始终保持着技术创新的领先地位。公司独创的“NextGenRF”算法专利技术,填补了国内在该领域的空白,并获得了多项企业认证、发明专项和软件著作权。这些技术创新不仅推动了公司产品性能的持续提升,还引领了整个行业的发展方向。此外,HOPERF还积极参与国际标准制定,不断提升自身在全球行业中的话语权和影响力。

问答坊 | AI 解惑

[:)]看看通讯汇编程序,给予指导,谢谢

附件里也有硬件连接图!!!我用的附件文件夹(解压缩后得)内的单片机程序(ASM格式,用的keil软件编译,后用烧录器直接烧进单片机内实验),原希望当单片机收到一个数0CH时。可以每隔一秒发一个数(从0FFH到01H)给PC机。 出现的问题:收是收到了 ...…

查看全部问答>

一个制作智能小车的思路——与大家分享下

本帖最后由 paulhyde 于 2014-9-15 03:39 编辑 吉林工业职业技术学院 指导教师:王友权 郭志忠 电动智能小车的制作 一、方案论证 1.路面情况检测方案的选择 探测路面黑线的基本原理:光线照射到路面并反射,由于黑线和白纸对光的反射系 ...…

查看全部问答>

大家想不想让EEWORLD办公室的MM浮上水面??

发现,最近一阵子,论坛里最八卦最大的八卦点就是:   EEWORLD 美眉的声音。   (当然,我就是其中之一。哈哈)   先来几个证据: (去我的回复里找找就行了~~) https://bbs.eeworld.com.cn/viewthread.php?tid=109503&e ...…

查看全部问答>

【详解】AT89S51

本文转引自 飞凌嵌入式 www.witech.com.cn 很多初学51单片机的网友会有这样的问题:AT89S51是什么 书上和网络教程上可都是8051,89C51等!没听说过有89S51 ! 这里,初学者要澄清单片机实际使用方面的一个产品概念,MCS-51单片机是美国INTE公司于1980年 ...…

查看全部问答>

求LCD說明書

LMDJ6S002A LCD 240X64 (180mmX65) 6  NANYA 手頭上有一塊這樣的LCD,但找不到說明書,誰有可不可以寄我一份或提供下載地址, 找到說明書了給100分。 …

查看全部问答>

大家推荐一个51单片机上的操作系统吧

最好能小一点的。上手比较快的,谢谢…

查看全部问答>

谁有D类功放资料啊

我最近想搞D类功放,还有阻抗的匹配,各位老师谁有这方面的资料啊…

查看全部问答>

新手求助~~

大家好,我是个新手,刚从老师那搞来块LM3S6965,想做个网页控制端口通断的路由器,但是对于网页控制实在是小白。。。。 那位大神能给个网页控制的实例程序,或者资料神马的啊? 谢谢。。。 邮箱:zhongli90@126.com [ 本帖最后由 gravity 于 20 ...…

查看全部问答>

想学原理图设计,给点建议

如题,我本科学通信工程毕业,学原理图设计应该从哪方面着手!!!…

查看全部问答>

TI A8开源硬件平台周计划之【旅行家足迹记录仪】

很高兴能获得提名;TI的推广还是很给力的,赞一下,想当初本科时候的同学都能申请到dsp芯片;希望大家多提宝贵意见,我表示感谢:carnation:…

查看全部问答>