历史上的今天
今天是:2025年03月15日(星期六)
2020年03月15日 | ARM 异常介绍
2020-03-15 来源:eefocus
一、中断概念:
CPU 在执行当前程序的过程中因硬件或软件的原因插入了另一段程序运行的过程
硬件引起的中断不可预测,随机性
软中断:事先在程序中安排特殊指令,CPU 执行到该类指令时,转去执行相应的一段预先安排好的程序,然后再返回来执行原来的程序
二、ARM 体系异常分类:
复位异常(Reset)
数据异常(Data Abort)
快速中断异常(FIQ)
外部中断异常(IRQ)
预取异常(Prefetch Abort)
软中断异常(SWI)
未定义异常(Undefined interrupt)
三、异常处理伪代码及 7 种异常
异常处理伪代码:
R14_ SPSR_ CPSR[4:0] = exception mode number CPSR[5] = 0 /*进入 ARM 状态*/ If CPSR[6] = 1 /*屏蔽快速中断 FIQ*/ CPSR[7] = 1 /*屏蔽外部中断 IRQ*/ PC = exception vector address 复位异常 概念 当处理器复位引脚有效时,系统产生复位异常中断,程序跳转到复位异常中断处理程序处执行,复位异常中断通常用于系统上电和系统复位两种情况。 步骤: 设置异常中断向量表 初始化数据栈和寄存器 初始化存储系统,如系统中的 MMU 初始化关键的 I/O 设备 使能中断 处理器切换到合适的模式 初始化C变量,跳转到应用程序执行 伪代码 R14_svc = UNPREDICTABLE value SPSR_svc = UNPREDICTABLE value CPSR[4:0] = 0B10011 /*进入特权模式*/ CPSR[5] = 0 /*处理器进入 ARM 态*/ CPSR[6] = 1 /*禁止快速中断*/ CPSR[7] = 1 /*禁止外设中断*/ If high vectors configured then PC = 0xffff0000 Else PC = 0x00000000 未定义指令异常 概念 当 ARM 处理器执行协处理器指令时,它必须等待一个外部协处理器答应后,才能真正执行这条指令。若协处理器没有响应,则发生未定义指令异常。未定义指令异常可用于在没有物理协处理器的系统上,对协处理器进行软件仿真,或通过软件仿真实现指令集扩展。 步骤 将仿真程序入口地址链接到向量表中未定义指令异常中断入口处(0x00000004 或 0xffff0004),并保存原来的中断处理程序 读取该未定义指令的 bits[27:24],判断其是否是一条协处理器指令。如果 bits[27:24]值为 0b1110 或 0b110x,则该指令是一条协处理器指令;否则由软件仿真实现协处理器功能,可以通过 bits[11:8] 来判断要仿真的协处理器功能(类似于 SWI 异常实现机制) 如果不仿真该未定义指令,则程序跳转到原来的未定义指令异常中断的中断处理程序行 伪代码 r14_und = address of next instruction after the undefined instruction SPSR_und = CPSR CPSR[4:0] = 0b11011 /*进入未定义指令模式*/ CPSR[5] = 0 /*处理器进入 ARM 状态*/ /*CPSR[6] 保持不变*/ CPSR[7] = 1 /*禁止外设中断*/ If high vectors configured then PC = 0xffff00004 Else PC = 0x00000004 软中断异常 概念 这是一个由用户定义的中断指令(SWI)。该异常由执行 SWI 指令产生,可用于用户模式下的程序调用特权操作指令。在实时操作系统中可以通过该机制实现系统功能调用。 伪代码 r14_svc = address of next instruction after the SWI instruction SPSR_und = CPSR CPSR[4:0] = 0b10011 /*进入特权模式*/ CPSR[5] = 0 /*处理器进入 ARM 态*/ /*CPSR[6] 保持不变*/ CPSR[7] = 1 /*禁止外设中断*/ If high vectors configured then PC = 0xffff000C Else PC = 0x0000000C 预取异常 概念 预取异常是由系统存储器报告的。当处理器预取的指令的地址不存在,或者该地址不允许当前指令访问(权限不够)时,将产生预取异常。 如果系统中不包含 MMU,指令预取异常中断处理程序只是简单地报告错误并退出;若包含 MMU,引起异常的指令的物理地址被存储到内存中。 伪代码 r14_svc = address of the aborted instruction + 4 SPSR_und = CPSR CPSR[4:0] = 0b10111 CPSR[5] = 0 /*CPSR[6] 保持不变*/ CPSR[7] = 1 /*禁止外设中断*/ If high vectors configured then PC = 0xffff000c Else PC = 0x0000000c 数据异常 概念 数据异常是由存储器发生数据中止信号,它由存储器访问指令 Load/Store 产生。 当数据访问指令的目标地址不存在,或者该地址不允许当前指令访问(权限不够)时,将产生数据访问中止异常。 产生数据访问中止异常时,寄存器的值修改规则 r14 的值只与发生数据异常的指令地址有关,与 PC 值无关 如果指令中没有指定基址寄存器回写,则基址寄存器的值不变 如果指令中指定了基址寄存器回写,则寄存器的值和具体芯片的 Abort Models 有关,由芯片的生成商指定 如果指令只加载一个通用寄存器的值,则通用寄存器的值不变 如果是批量加载指令,则寄存器中的值不可预知 如果指令加载协处理器寄存器的值,则被加载寄存器的值不可预知 伪代码 r14_abt = address of the aborted instruction + 8 SPSR_abt = CPSR CPSR[4:0] = 0b10111 CPSR[5] = 0 /*CPSR[6] 保持不变*/ CPSR[7] = 1 /*禁止外设中断*/ If high vectors configured then PC = 0xffff0010 Else PC = 0x00000010 外部中断异常 概念 当处理器的外部中断请求引脚有效,而且 CPSR 的寄存器的 I 控制位被清除时,处理器产生外部中断请求异常中断。系统中各外设通过该异常中断请求处理服务。 伪代码 r14_abt = address of the next instruction to be executed + 4 SPSR_irq = CPSR CPSR[4:0] = 0b10010 /*进入特权模式*/ CPSR[5] = 0 /*处理器进入 ARM 状态*/ /*CPSR[6] 保持不变*/ CPSR[7] = 1 /*禁止外设中断*/ If high vectors configured then PC = 0xffff0018 Else PC = 0x00000018 快速中断异常 概念 当处理器的外部快速中断请求引脚有效,而且 CPSR 的 F 控制位被清除时,处理器产生外部快速中断请求异常中断。 伪代码 r14_abt = address of the next instruction to be executed + 8 SPSR_fiq= CPSR CPSR[4:0] = 0b10001 /*进入FIQ模式*/ CPSR[5] = 0 CPSR[6] = 1 CPSR[7] = 1 /*禁止外设中断*/ If high vectors configured then PC = 0xffff001c Else PC = 0x0000001c 四、FIQ 与 IRQ 比较 相同点 都只是普通中断: 当我们程序定义了该中断,并且在程序运行的时候产生了 IRQ/FIQ 中断,则此时的芯片运行过程:①中断处理器利用IRQ请求线来告诉ARM,②ARM切换到 IRQ/FIQ 模式运行 不同点 FIQ 速度快,IRQ 速度慢,原因: FIQ模式提供了更多的寄存器,r8-r14 和 SPSR,而 IRQ 模式只有 r13-r14 和 SPSR,这就意味着在ARM的IRQ模式下,中断处理程序自己要保存R8到R12这几个寄存器,然后退出中断处理时程序要恢复这几个寄存器,而FIQ模式由于这几个寄存器都有banked寄存器,模式切换时CPU自动保存这些值到banked寄存器,退出FIQ模式时自动恢复,所以这个过程FIQ比IRQ快.不要小看这几个寄存器,ARM在编译的时候,如果你FIQ中断处理程序足够用这几个独立的寄存器来运作,它就不会进行通用寄存器的压栈,这样也省了一些时间。 FIQ 比 IRQ 有更高优先级,如果 FIQ 和 IRQ 同时产生,那么 FIQ 先处理。 在symbian系统里,当CPU处于FIQ模式处理FIQ中断的过程中,预取指令异常,未定义指令异常,软中断全被禁止,所有的中断被屏蔽。所以FIQ就会很快执行,不会被其他异常或者中断打断,所以它又比IRQ快了。而IRQ不一样,当ARM处理IRQ模式处理IRQ中断时,如果来了一个FIQ中断请求,那正在执行的IRQ中断处理程序会被抢断,ARM切换到FIQ模式去执行这个FIQ,所以FIQ比IRQ快多了。 另外FIQ的入口地址是0x1c,IRQ的入口地址是0x18。写过完整汇编系统的都比较明白这点的差别,18只能放一条指令,为了不与1C处的FIQ冲突,这个地方只能跳转,而FIQ不一样,1C以后没有任何中断向量表了,这样可以直接在1C处放FIQ的中断处理程序,由于跳转的范围限制,至少少了一条跳转指令。
史海拾趣
|
在QUARTUS里设置全局信号,是不是只要在ASSIGNMENT EDITOR把某一信号设置成全局信号就成,我这么设置,为什么编译的时候说没有声明?… 查看全部问答> |
|
---〓×〓×〓×〓×〓---Addr/DATA 请问上述地址与数据复用时序图中,为什么会有上下两根信号线? 一般的不都是一根的信号线吗,如:s0 s1 s2____/---\\_______ 不知道哪有芯片时序图的详细介绍书籍没?麻烦知道的给指点下,谢谢… 查看全部问答> |
|
4442卡的初始密码为ffffff,这个密码是16进制的,还是ASCII吗?明华读卡器的密码校验函数为:int csc_4442(int icdev, int len, unsigned char* p_string)我把\"ffffff\"作为参数放入,但校验错误。用hex_asc(\"ffffff\", s3, 3) 转换后把s3作为参数 ...… 查看全部问答> |
|
工作模式 bxCAN有3个主要的工作模式:初始化、正常和睡眠模式。 初始化模式 *软件通过对CAN_MCR寄存器的INRQ位置1,来请求bxCAN进入初始化模式,然后等待硬件对CAN_MSR寄存器的INAK位置1来进行确认。 *软件通过对CAN_MCR寄存器的 ...… 查看全部问答> |
|
这个是STM32的PWM输出模式,STM32的TIM1模块是增强型的定时器模块,天生就是为电机控制而生,可以产生3组6路PWM,同时每组2路PWM为互补,并可以带有死区,可以用来驱动H桥。 下面的代码,是利用TIM1模块的1、2通道产生一共4路PWM的代码例子, ...… 查看全部问答> |
|
贪便宜,在淘宝上买了个山寨的ST-LINK。 现在出现了奇怪的问题。 我用的是STM8S207S6,单片机工作电压是5V. ST-LINK的SWIM口,其供电电压时3.3V。 当我的板子不供电的时候,我直接连ST-LINK,由它来供电,我可以把软件down到单片机,并且在 ...… 查看全部问答> |
|
memcpy(&secureRamFuncs_runstart, &secureRamFuncs_loadstart, (Uint32)&secureRamFuncs_loadsize); 如题,请问这个函数的三个参数是在什么地方给它付的值?… 查看全部问答> |




