历史上的今天
返回首页

历史上的今天

今天是:2025年03月16日(星期日)

正在发生

2020年03月16日 | ARM体系结构与编程-4

2020-03-16 来源:eefocus

ARM异常中断处理:

ARM体系异常中断种类:按中断的处理优先级从高到低依次为:复位、数据访问中止、快速中断请求、外部中断请求、预取指中止、未定义指令、软件中断。


ARM体系中的异常中断向量表:

0x0 复位

0x4 未定义指令

0x8 软件中断(SWI)

0x0c 预取指中止

0x10 数据访问中止

0x14 保留

0x18 外部中断请求(IRQ)

0x1c 快速中断请求(FIQ)


各异常中断对应着一定的处理器模式,不同处理器模式下有各自的物理寄存器。如果异常中断处理程序中使用它自己的物理寄存器之外的其他寄存器,异常中断处理程序

必须保存和恢复这些寄存器。


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

进入中断的过程:

<1>将当前程序状态寄存器CPSR的内容保存到将要执行的异常中断对应的SPSR寄存器中。

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

<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

/*禁止新的IRQ中断*/

CPSR[7] = 1

PC = exception_vector_address


响应复位异常中断:当处理器的复位引脚有效时,处理器中止当前指令。当处理器的复位引脚变成无效时,处理器开始执行下面的操作:

R14_svc = UNPREDICTABLE value

SPSR_svc = UNPREDICTABLE 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


响应未定义指令异常中断:处理器检测到未定义指令异常时,处理器开始执行下面的操作:

R14_und = address_of_next_instruction_after_the_undefined_instruction

SPSR_und = CPSR

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

CPSR[4:0] = 0b11011

/*切换到ARM状态*/

CPSR[5] = 0

/*禁止新的IRQ中断*/

CPSR[7] = 1

if high_vectors_configured then

PC = 0xFFFF0004

else

PC = 0x00000004

响应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

响应预取指中止异常中断:处理器检测到预取指中止异常时,处理器开始执行下面的操作:

R14_abt = address_of_the_aborted_instruction + 4

SPSR_abt = CPSR

/*进入预取指中止异常中断模式*/

CPSR[4:0] = 0b10111

/*切换到ARM状态*/

CPSR[5] = 0

/*CPSR[6]不变*/

/*禁止新的IRQ中断*/

CPSR[7] = 1

if high_vectors_configured then

PC = 0xFFFF000C

else

PC = 0x0000000C

响应数据访问中止异常中断:处理器检测到数据访问中止异常时,处理器开始执行下面的操作:

R14_abt = address_of_the_aborted_instruction + 8

SPSR_abt = CPSR

/*进入数据访问中止异常中断模式*/

CPSR[4:0] = 0b10111

/*切换到ARM状态*/

CPSR[5] = 0

/*CPSR[6]不变*/

/*禁止新的IRQ中断*/

CPSR[7] = 1

if high_vectors_configured then

PC = 0xFFFF0010

else

PC = 0x00000010

响应IRQ异常中断:处理器检测到IRQ异常时,处理器开始执行下面的操作:

R14_irq = address_of_next_instruction_to_be_executed + 4

SPSR_irq = CPSR

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

CPSR[4:0] = 0b10010

/*切换到ARM状态*/

CPSR[5] = 0

/*CPSR[6]不变*/

/*禁止新的IRQ中断*/

CPSR[7] = 1

if high_vectors_configured then

PC = 0xFFFF0018

else

PC = 0x00000018

响应FIQ异常中断:处理器检测到FIQ异常时,处理器开始执行下面的操作:

R14_fiq = address_of_next_instruction_to_be_executed + 4

SPSR_fiq = CPSR

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

CPSR[4:0] = 0b10001

/*切换到ARM状态*/

CPSR[5] = 0

/*禁止新的FIQ中断*/

CPSR[6] = 1

/*禁止新的IRQ中断*/

CPSR[7] = 1

if high_vectors_configured then

PC = 0xFFFF001C

else

PC = 0x0000001C


退出中断的过程:从异常中断处理程序中返回包括以下两个基本操作

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


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


对不同的异常中断,PC所指的位置是不同的,同时,返回地址也是不同的。


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

SWI和未定义指令异常中断是由当前执行的指令自身产生的,中断发生时,PC指向当前指令后的第2条指令,处理器将PC-4保存到异常模式下的lr_mode寄存器中,因此通过以下命令来实现返回:MOVS PC, LR 。当异常中断处理程序中使用了数据栈时,可以通过以下指令在进入中断处理程序时保存被中断程序的执行现场,在退出中断处理程序时恢复被中断程序的执行现场:

STMFD sp!, {reglist,lr}

;... ...

LDMFD sp!, {reglist,pc}^


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

IRQ和FIQ异常中断发生时,PC指向当前指令后的第3条指令,处理器将PC-4保存到异常模式下的lr_mode寄存器中,这时,PC-4指向当前指令后的第2条指令,因此通过以下命令来实现返回:SUBS PC, LR,#4 。当异常中断处理程序中使用了数据栈时,可以通过以下指令在进入中断处理程序时保存被中断程序的执行现场,在退出中断处理程序时恢复被中断程序的执行现场:

SUBS LR, LR, #4

STMFD sp!, {reglist,lr}

;... ...

LDMFD sp!, {reglist,pc}^


将异常中断处理程序注册到异常中断向量表中:

<1>使用跳转指令:在异常中断对应的向量表中特定的位置放一条跳转指令,直接跳转到该异常中断的处理程序。缺点:只能在32M的空间内跳转 


<2>使用数据读取指令LDR:使用LDR向PC直接赋值。第一步:先将异常中断处理程序的绝对地址存放在距离向量表4KB的范围内的一个存储单元中;第二步:再使用LDR将该单元的内容读取到PC中。

推荐阅读

史海拾趣

Cavium Networks公司的发展小趣事

随着消费者对家庭娱乐和智能生活的需求不断增长,Cavium Networks 敏锐地捕捉到了这一市场趋势。公司推出了面向消费者市场的无线显示解决方案 WiVu,利用最新的笔记本电脑技术如嵌入式 DisplayPort 和显示迷你卡(DMC),为多房间和交互式应用提供了高性能的 Wi-Fi 无线显示解决方案。WiVu 的推出不仅满足了消费者对便捷、高效、高质量的娱乐体验的需求,也引领了市场的新潮流,进一步巩固了 Cavium Networks 在电子行业中的地位。

EUPEC [eupec GmbH]公司的发展小趣事

面对未来市场的机遇和挑战,EUPEC制定了明确的发展战略。公司将继续加大技术创新和研发投入力度,推动电力半导体技术的进步和应用拓展。同时,EUPEC还将加强与国际知名企业的合作与交流,不断提升自身的竞争力和影响力。在应对市场变化和挑战的过程中,EUPEC将始终坚持以客户为中心的理念,为客户提供更优质的产品和服务。

请注意,以上故事是基于EUPEC公司的发展历程和相关信息进行概括和编写的,并非完全基于事实的直接叙述。如需更详细和准确的信息,请参考相关官方资料或新闻报道。

G-Mag Usa公司的发展小趣事

在20世纪90年代初,G-Mag Usa公司由一群电子工程师创立,专注于研发高性能的半导体芯片。当时,市场上对于小型化、低功耗的芯片需求日益增长。G-Mag通过不断的技术创新,成功研发出了一种新型低功耗处理器,该处理器在保持高性能的同时,能耗降低了30%。这一技术突破迅速吸引了众多智能手机制造商的注意,G-Mag因此迅速崛起,成为半导体行业的佼佼者。随着智能手机市场的爆发式增长,G-Mag的芯片出货量也随之飙升,公司规模迅速扩大。

Continental公司的发展小趣事

随着技术的不断进步和市场的不断变化,大陆集团也在不断调整其业务架构。在新的架构中,大陆集团将业务领域划分为三个部分:自主驾驶和安全、车联网和信息、以及橡胶技术(包括轮胎业务和康迪泰克)。这一调整使得大陆集团能够更好地应对市场变化和技术挑战。同时,大陆集团还通过收购和兼并等方式不断扩大其业务范围和技术实力。

驰芯微(CHIPWISE)公司的发展小趣事

在发展过程中,驰芯微公司成功完成了多轮融资,为公司的发展提供了强有力的资金支持。这些资金主要用于车规级传感和控制类芯片的系列化业务以及新能源电池管理系统汽车电子系统一站式车规级芯片套片解决方案的研发和推广。未来,驰芯微将继续加大在技术研发和产品创新方面的投入力度,致力于成为国际领先的汽车电子芯片供应商。同时,公司还将积极拓展海外市场,提升品牌知名度和影响力。

以上五个故事框架分别围绕驰芯微公司的初创历程、技术突破、面对“芯片限制”的机遇与挑战、与明然科技的合作以及融资与未来规划等方面进行了描述。这些故事展示了驰芯微在电子行业中的发展历程和取得的成就,同时也揭示了公司未来的发展方向和目标。

Alutronic Kuhlkorper Gmbh & Co Kg公司的发展小趣事

驰芯微公司一直注重技术研发和产品创新。公司拥有一支高素质的研发团队,不断在芯片设计、制造和封装等领域取得突破。其中,车规级霍尔传感器芯片XL3600系列和车规级32位微控制器MCU芯片XL6600系列是公司的明星产品。这些产品不仅性能卓越,而且可靠性高,赢得了客户的广泛认可。此外,驰芯微还不断推出新产品,如新能源动力多节电池组监控器BMS AFE芯片XL8812/XL8820系列等,进一步丰富了公司的产品线。

问答坊 | AI 解惑

ce下如何打开帮助文档.htm

    在ce下想打开帮助文档,在网上搜了下,说需要peghelp.exe,可我在ce设备windows目录下没找到这个文件,在我的ce安装目录下也没找到这个文件,那是不是要添加什么组件?         PROCESS_INFORMATION pi;   ...…

查看全部问答>

PC机与板子通信的问题

现在手头上有个项目,实现PC机对板子参数设置(通过USB Device),我现在是用同步软件跟板子相连,我想知道,WinCE上的应用程序怎么检测到USB Device是否连接上?…

查看全部问答>

在WinCE 上, 如果ARM CPU 已经内置了CPU 控制器, 在平台上实现USB 功能,需要哪些步骤?

在WinCE 上, 如果ARM CPU 已经内置了CPU 控制器, 在平台上实现USB 功能,需要哪些步骤? 如果CPU 原厂的BSP 已经支持了USB 功能, 我们还需要哪些步骤?…

查看全部问答>

请教:EVC高级编程及其应用开发一书中的UDC程序,为什么可以发送数据,不能接收数据

EVC高级编程及其应用开发一书中的UDC程序,为什么可以发送数据,接收不到数据。我将单机设置为一个本地环路。然后拿个一个windows的UDP调试软件,在写好IP,本地和远端的端口后,windows的UDP调试软件可以接收到EVC程序发送的数据,但是EVC程序接收 ...…

查看全部问答>

选择:若是有一个外企通信公司的工作和联通的工作?

若是有一个机会去外企通信公司工作,挣得相对多点,累点,搞技术 还有一个机会去联通工作,可能待遇低点,工作轻松点,选择哪个好呢?有过来人帮着分析一下吗? 工作地点在山东。我毕业是计算机 硕士 不是211的…

查看全部问答>

wince 5.0 使用 imaging COM组件 画png图片 内存泄露

BOOL ImageFromIDResource(UINT nID, LPCTSTR sTR, IImage** pIImage) {         HRSRC hRsrc = ::FindResource (hInstRes,MAKEINTRESOURCE(nID),sTR); // type         if (!hRsrc)     &n ...…

查看全部问答>

关于优龙2440开发板K9F1208flash换成K9K8G08flash驱动得问题

100分寻高人指点:我板子是优龙得2440开发板,现在板子上得flash是K9K8G08修改flash驱动得时候就出现了麻烦: 一:关于可行性:有朋友提出2440不支持MLC结构FLASH(K9K8G08是MLC结构)说要用软件方法解决,望指教 二:修改nand.c得时候有几个地方 ...…

查看全部问答>

有关MCU烧录问题

请问哪位大虾知道三星S3F828B,S3F84BB,S3F9454烧录用哪些引脚? 还有ATMEG128,ATMEG32,ATMEG32L…

查看全部问答>

梦想能否实现?只在你一个选择!深圳单片机培训&嵌入式培训

我对嵌入式一些概念名词简单的理解通常我们都有这么一个模糊的概念,我以前做单片机,单片机是不是嵌入式系统呢? 当然是。只不过呢,我们现在把它看成一个低端的嵌入式系统。通常我们所说的嵌入 式系统是指什么呢?指像“ARM+LINUX”这样结 ...…

查看全部问答>

想用万利的STM32板交换一块LM3S811的板,另有一块5502的DSP板可出售

板子如图,9。9成新,拿回来之后基本没有用过,因为一直没有时间。   这个板是万利的,应该可以交换LM3S811 这是5502的DSP板…

查看全部问答>