历史上的今天
返回首页

历史上的今天

今天是:2024年11月02日(星期六)

2021年11月02日 | ARM启动及工作模式切换

2021-11-02 来源:eefocus

在ARM体系中通常有以下3种方式控制程序的执行流程:


在正常程序执行过程中,每执行一条ARM指令,程序计数器寄存器(PC)的值加4个字节;每执行一条Thumb指令,程序计数器寄存器(PC)的值加两个字节。整个过程是顺序执行。


通过跳转指令,程序可以跳转到特定的地址标志处执行,或者跳转到特定的子程序处执行。其中,B指令用于执行跳转操作;BL指令在执行跳转动作的同时,保存子程序的返回地址;BX指令在执行跳转操作的同时,根据目标地址的最低位可以将程序状态切换到Thumb状态;BLX指令执行3个操作:跳转到目标地址处执行,保存子程序的返回地址,根据目标地址的最低位可以将程序状态切换到Thumb状态。


当异常中断发生时,系统执行完当前指令后,将跳转到相应的异常中断处理程序处执行。当异常中断处理程序执行完成后,程序返回到发生中断的指令的下一条指令处执行。在进入异常中断处理程序时,要保存被中断的程序的执行现场,在从异常中断处理程序退出时,要恢复被中断的程序的执行现场。本文讨论ARM体系中的异常中断机制。


ARM体系中异常中断种类:


ARM体系中异常中断如下面的介绍。


复位(Reset):当处理器的复位引脚有效时,系统产生复位异常中断,程序跳转到复位异常中断处理程序处执行。复位异常中断通常用在下面两种情况下:系统加电时,系统复位时,跳转到复位中断向量处执行,称为软复位。


未定义指令(Undefined):当ARM处理器或者是系统中的协处理器认为当前指令未定义时,产生未定义的指令异常中断。可以通过该异常中断机制仿真浮点向量运算。


软中断(software interrupt):这是一个由用户定义的中断指令。可用于用户模式下的程序调用特权操作指令。在实时操作系统(RTOS)中可以通过该机制实现系统功能调用。


指令预取中止:如果处理器预取的指令的地址不存在,或者该地址不允许当前指令访问,当该被预取的指令执行时,处理器产生指令预取中止异常中断。


数据访问中止:如果数据访问指令的目标地址不存在,或者该地址不允许当前指令访问,处理器产生数据访问中止异常中断。


外部中断请求(IRQ):当处理器的外部中断请求引脚有效,而且CPSR寄存器中的I控制位被清除时,处理器产生外部中断请求异常中断。系统中各个外设通常通过该异常中断请求处理器服务。


快速中断请求(FIQ):当处理器的外部快速中断请求引脚有效,而且CPSR寄存器中的F控制位被清除时,处理器产生外部中断请求(FIQ)异常中断。


异常中断向量表及异常中断优先级:


中断异常向量表中指定了个异常中断及其处理程序的对应关系。它通常存放在存储地址的低端。在ARM体系中,异常中断向量表的大小为32个字节。其中,每个异常中断占据4个字节大小,保留4个字节空间。


每个异常中断对应的中断向量表中的4个字节的空间中存放了一个跳转指令或者一个向PC寄存器中赋值的数据访问指令。通常这两种指令,程序将跳转到相应的异常中断处理程序处执行。


当几个异常中断同时发生时,就必须按照一定的次序来处理这些异常中断。在ARM中通过给异常中断赋予一定的优先级来实现这种处理次序。当然有异常中断是不可能同时发生的,如指令预取中止异常和软中断(SWI)异常中断是由同一条指令的执行触发的,它们是不可能同时发生的。处理器执行某个特定的异常中断的过程中,称为处理器处于特定的中断模式。各异常中断的中断向量地址以及中断的处理优先级如下表所示。

image.png?imageView2/2/w/550

异常中断使用的寄存器:


各异常中断对应着一定的处理器模式。应用程序通常运行在用户模式下。ARM中的处理器模式如下表所示。

image.png?imageView2/2/w/550

各种不同的处理器模式可能有对应于该处理器模式的物理寄存器组,如下表所示。其中R13_svc表示特权模式下的R13寄存器,R13_abt表示中止模式下的R13寄存器,其余的各寄存器名称含义类推。


如果异常中断处理程序中使用它自己的物理寄存器之外的其他寄存器,异常中断处理程序必须保存和恢复这些寄存器。在上表中各物理寄存器名称在ARM汇编中并没有被预定义。用户使用这些寄存器时,必须使用伪操作RN来定义这些名称。如可以通过下面操作定义寄存器名称R13_svc:


R13_svc RN R13


进入和退出异常中断的过程:


下面介绍处理器对于各种异常中断的响应过程以及从异常中断处理程序中返回的方法。对于不同的异常中断处理程序,返回地址以及使用的指令是不同的。


ARM处理器对异常中断的响应过程如下:


(1).保存处理器当前状态、中断屏蔽位以及各条件标志位。这是通过将当前程序状态寄存器CPSR的内容保存到将要执行的异常中断对应的SPSR寄存器中实现的。各异常中断有自己的物理SPSR寄存器。

(2).设置当前程序状态寄存器CPSR中相应的位。包括设置CPSR中的位,使处理器进入相应的执行模式;设置CPSR中的位,禁止IRQ中断,当进入FIQ模式时,禁止IRQ中断。

(3).将寄存器lr_mode设置成返回地址。

(4).将程序计数器(PC)值,设置成该异常中断的中断向量地址,从而跳转到相应的异常中断处理程序处执行。


上述的处理器对异常中断的响应过程可以用如下的伪代码描述。


R14_ = return link

SPSR_ = CPSR

CPSR[4:0] = exception mode number

/* 当运行于ARM状态时 */

CPSR[5] = 0

/* 当相应FIQ异常中断时,禁止新的FIQ中断 */

if == RESET or FIQ then

CPSR[6] = 1

/* 禁止新的FIQ中断 */

CPSR[7] = 1

PC = exception vector address

1.响应复位异常中断

当处理器的复位引脚有效时,处理器终止当前指令。当处理器的复位引脚变成无效时,处理器开始执行下面的操作。


R14_svc = UNPREDICATBLE value

SPSR_svc = UNPREDICATBLE value

/* 进入特权模式 */

CPSR[4:0] = 0b10011

/* 切换到ARM状态 */

CPSR[5] = 0

/* 禁止FIQ异常中断 */

CPSR[6] = 1

/* 禁止IRQ中断 */

CPSR[7] = 1

if high vectors configured then

PC = 0XFFFF0000

else

PC = 0X00000000


2.响应未定义指令异常中断

处理器响应未定义指令异常中断时的处理过程如下面的伪代码所示。


R14_und = address of next instruction after the undefined instruction

SPSR_und = CPSR

/* 进入未定义指令异常中断 */

CPSR[4:0] = 0b11011

/* 切换到ARM状态 */

CPSR[5] = 0

/* CPSR[6]不变 */

/* 禁止IRQ异常中断 */

CPSR[7] = 1

if high vectors configured then

PC = 0xFFFF0004

else 

PC = 0x00000004


3.响应SWI异常中断

处理器响应SWI异常中断的处理过程如下面的伪代码所示。


R14_svc = address of next instruction after the SWI instruction

SPSR_svc = CPSR

/* 进入特权模式 */

CPSR[4:0] = 0b10011

/* 切换到ARM状态 */

CPSR[5] = 0

/* CPSR[6]不变 */

/* 禁止IRQ异常中断 */

CPSR[7] = 1

if high vectors configured then

PC = 0xFFFF0008

else 

PC = 0x00000008


4.响应指令预中止异常中断

处理器响应指令预取中止异常中断时的处理过程如下面的伪代码所示。


R14_abt = address of the aborted instruction+4

SPSR_abt = CPSR

/* 进入指令预取中止模式 */

CPSR[4:0] = 0b10111

/* 切换到ARM状态 */

CSPR[5] = 0

/* CPSR[6]不变 */

/* 禁止IRQ异常中断 */

CPSR[7] = 1

if high vectors configured then

PC = 0xFFFF000C

else 

PC = 0x0000000C


5.响应数据访问中止异常中断

处理器响应数据访问中止异常中断时的处理过程如下面的伪代码所示。


R14_abt = address of the aborted instruction+8

SPSR_abt = CPSR

/* 进入数据访问中止 */

CPSR[4:0] = 0b10111

/* 切换到ARM状态 */

CSPR[5] = 0

/* CPSR[6]不变 */

/* 禁止IRQ异常中断 */

CPSR[7] = 1

if high vectors configured then

PC = 0xFFFF0010

else 

PC = 0x00000010


6.响应IRQ异常中断

处理器响应IRQ异常中断时的处理器过程如下面的伪代码所示。


R14_irq = address of next instruction to be executed + 4

SPSR_irq = CPSR

/* 进入IRQ异常中断模式 */

CPSR[4:0] = 0b10010

/* 切换到ARM状态 */

CSPR[5] = 0

/* CPSR[6]不变 */

/* 禁止IRQ异常中断 */

CPSR[7] = 1

if high vectors configured then

PC = 0xFFFF0018

else 

PC = 0x00000018


7.响应FIQ异常中断

处理器响应FIQ异常中断时的处理器过程如下面的伪代码所示。


R14_fiq = address of next instruction to be executed + 4

SPSR_fiq = CPSR

/* 进入FIQ异常中断模式 */

CPSR[4:0] = 0b10001

/* 切换到ARM状态 */

CSPR[5] = 0

/* 禁止FIQ中断 */

CPSR[6] = 1

/* 禁止IRQ异常中断 */

CPSR[7] = 1

if high vectors configured then

PC = 0xFFFF001C

else 

PC = 0x0000001C

从异常中断处理程序中返回包括下面两个基本操作:


恢复被中断的程序的处理器状态,即将SPSR_mode寄存器内容复制到当前程序状态寄存器CPSR中。


返回到发生异常中断的指令的下一条指令处执行,即将lr_mode寄存器的内容复制到程序计数器PC中。


复位异常中断处理程序不需要返回。整个应用系统是从复位异常中断处理程序开始执行的,因为它不需要返回。


实际上,当异常中断发生时,程序计数器PC所指的位置对于各种不同的异常中断是不同的。同样,返回地址对于各种不同的异常中断也是不同的。下面详细介绍各种异常中断处理程序的返回方法。


1.SWI和未定义指令异常中断处理程序的返回

SWI和未定义指令异常中断是由当前执行的指令自身产生的,当SWI和未定义指令异常中断发生时,程序计数器PC的值还未更新,它指向当前指令后面第2条指令。当SWI和未定义指令异常中断发生时,处理器将值(PC-4)保存到异常模式下的寄存器lr_mode中。这时(PC-4)即指向当前指令的下一条指令。因此返回操作可以通过下面的指令来实现:


MOV PC LR

该指令寄存器LR中的值复制到程序计数器PC中,实现程序返回,同时将SPSR_mode寄存器内容复制到当前程序状态寄存器CPSR中。


当异常中断处理程序使用了数据栈时,可以通过下面的指令在进入异常中断处理程序时保存被中断程序的执行现场,在退出异常中断处理程序时恢复被中断程序的执行现场。异常中断处理程序中使用的数据栈由用户提供。


stmfd sp!, {reglist,lr}

....

ldmfd sp!, {reglist,pc}^

在上述指令中,reglist是异常中断处理程序中使用的寄存器列表。标识符^指示将SPSR_mode寄存器内容复制到当前程序状态寄存器CPSR中。该指令只能在特权模式下使用。


2.IRQ和FIQ异常中断处理程序的返回

通常处理器执行完当前指令后,查询IRQ中断引脚和FIQ中断引脚,并且查看系统是否允许FIQ中断及IRQ中断。如果有中断引脚有效,并且系统允许该中断发生,处理器将产生IRQ异常中断或FIQ异常中断。当IRQ和FIQ异常中断产生时,程序计数器PC的值已经更新,它指向当前指令后面第3条指令。当IRQ和FIQ异常中断发生时,处理器将值(PC-4)保存到异常模式下的寄存器lr_mode中。这时(PC-4)即指向当前指令后的第2条指令。因此返回操作可以通过下面的指令来实现:


SUB PC, LR, #4

该指令将寄存器LR中的值减4后,复制到程序计数器PC中,实现程序返回,同时将SPSR_mode寄存器内容复制到当前程序状态寄存器CPSR中。


当异常中断发处理程序使用了数据栈时,可以通过下面的指令在进入异常中断处理程序时保存被中断程序的执行现场,在退出异常中断处理程序时恢复被中断程序的执行现场。异常中断处理程序中使用的数据栈由用户提供。


SUB LR, LR, #4

STMFD sp!, {reglist, lr}

...

LDMFD sp!, {reglist, pc}^

上述指令中,reglist是异常中断处理程序中使用的寄存器列表。标识符^指示将SPSR_mode寄存器内容复制到当前程序状态寄存器CPSR中。该指令只能在特权模式下使用。


其它异常中断返回情况请参考《ARM体系结构与编程》一书中的第9章。

推荐阅读

史海拾趣

Cortina Systems Inc公司的发展小趣事

由于Cortina Systems Inc公司的具体发展历程和相关故事的详细资料可能涉及公司内部的敏感信息,且具体的故事可能随着时间和市场环境的变化而有所不同,因此,我无法直接为您提供5个关于Cortina Systems Inc公司在电子行业里发展起来的具体故事。不过,我可以基于公开资料为您概述Cortina Systems Inc公司在电子行业的一些重要发展节点和事件,您可以根据这些信息进行进一步的了解和研究。

  1. 并购集通科技,拓宽业务领域

在某一时期,Cortina Systems Inc.通过并购集通科技,实现了业务领域的拓宽。集通科技是一家专注于为中小型企业和家庭网络用户提供嵌入式网络处理器、三合一整合服务(Triple Play)和网络存储解决方案的私人公司。通过这次并购,Cortina成功地将集通在中小型企业和家庭网络技术方面的优势与其通信网络基础设施环境相结合,为下一代网络使用者社群网络、多媒体传输和数字家庭连接能力的发展奠定了坚实基础。

  1. 与思科紧密合作,推动技术标准发展

在技术标准制定方面,Cortina Systems Inc.与思科展开了紧密的合作。双方共同推出了Interlaken技术规范,这一规范被视为网络处理论坛(NPF)可升级的SPI规范的竞争对手。尽管NPF与光联网论坛(OIF)合并后,Cortina与思科并未将Interlaken提交至OIF,但这一合作仍然为行业内的技术标准发展注入了新的活力。

  1. 推出双模ONU网关解决方案,满足中国市场独特需求

随着全球通信市场的不断发展,Cortina Systems Inc.针对中国市场推出了双模ONU网关解决方案。这一解决方案的推出,旨在满足中国市场对于混合式接入方式的特殊需求。在中国,三大运营商引导的接入方式既包括EPON也包括GPON,这使得双模ONU成为市场趋势。Cortina通过这一解决方案,成功地为中国市场提供了独特的、适应本土需求的通信解决方案。

  1. 技术创新能力突出,不断推出新产品

作为电子行业的领导者之一,Cortina Systems Inc.一直以其突出的技术创新能力而著称。公司不断投入研发,推出了一系列具有创新性和竞争力的新产品。这些产品不仅提升了公司的市场竞争力,也为整个电子行业的发展带来了新的机遇和挑战。

  1. 拓展全球市场,提升品牌影响力

随着业务的发展和产品线的完善,Cortina Systems Inc.逐渐将目光投向了全球市场。公司通过参加各种国际展览和会议,积极与全球合作伙伴建立联系,拓展业务领域。同时,公司还加强了品牌建设和市场推广力度,提升了在全球市场的知名度和影响力。

这些事件和节点只是Cortina Systems Inc.在电子行业发展历程中的一部分。要了解更多关于该公司的具体故事和详细发展历程,建议您查阅相关新闻报道、行业分析报告或公司官方发布的信息。通过这些资料,您可以更深入地了解Cortina Systems Inc.在电子行业中的崛起和发展。

AVAGO公司的发展小趣事

随着公司规模的扩大和技术的不断积累,AVAGO公司开始寻求多元化的发展道路。除了继续深耕半导体领域外,公司还积极拓展其他相关领域,如传感器、无线通信等。同时,公司还与其他行业的领军企业建立了紧密的战略合作关系,共同推动技术创新和市场拓展。

Dialog公司的发展小趣事

Dialog公司一直注重产品的安全性和可靠性。为了确保其产品和解决方案能够满足客户对安全性的要求,Dialog公司积极寻求各种认证和合规性评估。例如,Dialog公司的DA16200 Wi-Fi SoC获得了PSA一级认证,这标志着Dialog公司在芯片层面保护设备方面取得了重要里程碑。PSA Certified认证机制由Arm及其四个全球领先的独立安全评估实验室合作伙伴共同创立,该认证机制以一种方法论的方式来开发安全功能的最佳实践。获得PSA一级认证使Dialog公司能够确保其客户和合作伙伴在从芯片到应用的各个开发阶段都能获得安全性保障。

虹冠电子(Champion)公司的发展小趣事

虹冠电子注重全球市场的拓展,通过建立完善的营销网络和合作伙伴关系,将产品销往世界各地。公司在新竹、汐止以及美国硅谷等地设有研发中心和生产基地,能够为客户提供及时、高效的技术支持和服务。同时,虹冠电子还与国内优秀的晶圆封测大厂等合作伙伴建立了紧密的合作关系,共同推动电源管理技术的发展和应用。

C-MAC Automotive公司的发展小趣事

在电子行业快速发展的今天,C-MAC Automotive公司始终保持着对创新的追求。公司不断投入研发资金,探索新的技术方向和应用领域。通过持续创新,C-MAC成功推出了一系列具有竞争力的新产品,为公司的发展注入了新的动力。同时,公司还注重人才培养和团队建设,打造了一支高效、专业的研发团队,为公司的未来发展奠定了坚实基础。

这些故事虽然基于虚构,但反映了电子行业中许多企业发展的普遍规律。通过技术突破、战略合作、创新营销、全球化战略和持续创新等手段,企业可以不断提升自身竞争力,实现快速发展。

Elec & Eltek公司的发展小趣事

随着全球对环境保护和可持续发展的重视日益加深,Eltek公司也积极响应这一趋势。在产品研发和生产过程中,Eltek公司始终坚持环保理念,采用环保材料和工艺,减少对环境的影响。同时,Eltek公司还加大了在可再生能源领域的投入力度,积极研发具有更高效率和更低成本的电力电子产品。此外,Eltek公司还积极参与各种环保活动和公益事业,为推动全球可持续发展贡献自己的力量。

以上五个故事虽然是虚构的,但其中所蕴含的发展思路、创新精神和国际化视野是电子行业公司普遍需要关注和借鉴的。希望这些故事能为您提供一些启示和灵感。

问答坊 | AI 解惑

请教一个三级管的作用

这是一个数字电压表的显示部分,三极管连的是片选端,共阴极数码管,但是那个三极管的具体驱动原理,不清楚,求高手指教。…

查看全部问答>

Code-red出的仿真器,好酷!!!

最近到Code-red官方网上溜达了一下,看到看仿真器。感觉好酷啊,不过价格也不菲啊。     Summary of Red Probe Features USB 2.0 full-speed. Self powered from USB host. Wide target voltage range: 1.5V - 3.5V. Switc ...…

查看全部问答>

嵌入式学习,嵌入式学习有哪些要素呢

学习,老师是非常关键的环节。对于嵌入式的学习当然也不例外。所以,在嵌入式的学习中,老师是很重要的要素之一。 嵌入式学习,挑选什么样的老师? 双师型老师。具体的来说,一方面,具备嵌入式的研发经验,有独立开发的项目和作品,在嵌入式行 ...…

查看全部问答>

JAVA 嵌入式 我该如何选择

我们学校要分科了,已经上了半年了,从头到尾都学了HTML    Javascript   c语言  oracle  java   C#。当然这些都是各个语言初级部分。现在到了第二学期了,要分JAVA方向和嵌入式方向(做的是高层 ...…

查看全部问答>

哪位知道PB工程里FILEVIEW->C:\WINCE500->PLATFORM文件夹是空的,是什么原因啊?

哪位知道PB工程里FILEVIEW->C:\\WINCE500->PLATFORM文件夹是空的,是什么原因啊? 编译是正确的,但是这里就是不显示,没法单独编译某个驱动了!请各位高人帮帮忙啊! 如下图:C:\\PB.BMP …

查看全部问答>

图像旋转后显示乱码

旋转前图像的宽高是4的倍数的矩形就没有问题;如果不是4的倍数,旋转就会显示出来乱码,我查了,说是扫描的行数要是4的倍数,要更改width的值,但更改了好几回,图片还是乱的。。。有人做过的,麻烦指点一下。多谢了 BITMAPINFO RGB24BitsBITMAPI ...…

查看全部问答>

求助:linux2.6在ixp425平台上移植时time_init函数错误

UBOOT跑的很顺利,一次成功,但是LINUX移植死在了初始化时钟中断上,想破了头,查了很多资料都没效果.硬件平台是我们自己搭建的,没有用成熟的开发板.请教大虾们的帮助.…

查看全部问答>

请问enet_LwIP.c中的locator.c到底起到什么样的作用?

    在enet_lwip.c例程中,一下几句是什么作用?似乎注释掉了之后也没有什么影响啊?     //  Setup the device locator service.    //    //  LocatorInit(); &nbs ...…

查看全部问答>