咸阳网站建设培训学校,品牌网网站建设公司,北京网站备案地址,seo网站快速排名0 参考资料
ARM Cortex-A(armV7)编程手册V4.0.pdf
ARM体系结构与编程第2版1 前言
Cortex-M系列内核MCU中断硬件原生支持嵌套中断#xff0c;开发者不需要为了实现嵌套中断而进行额外的工作。但在Cortex-A7中#xff0c;硬件原生是不支持嵌套中断的#xff0c;这从Cortex-A…0 参考资料
ARM Cortex-A(armV7)编程手册V4.0.pdf
ARM体系结构与编程第2版1 前言
Cortex-M系列内核MCU中断硬件原生支持嵌套中断开发者不需要为了实现嵌套中断而进行额外的工作。但在Cortex-A7中硬件原生是不支持嵌套中断的这从Cortex-A7中断向量表中仅为外部中断设置了一个中断向量可以看出。本文介绍Cortex-A7的简单的中断处理机制即不可嵌套中断的处理机制。
2 Cortex-A7简单中断处理不可嵌套中断机制
2.1 概述
简单的中断处理机制意味着在中断发生之后将会屏蔽掉同类中断如果在响应中断期间有多个中断请求需要处理则会按照优先级顺序取决于中断服务函数写法依次处理。这样的设计下无法使高抢占优先级的中断抢占低抢占优先级中断执行也就无法实现中断嵌套。
2.2 中断处理步骤
简单中断处理步骤可以概括为以下5步。
2.2.1 硬件保存上下文
当发生外部中断硬件将会自动执行以下几个操作 1将当前模式下中断发生前的PC程序计数器后面第2条指令地址保存到IRQ模式下的LR链接寄存器 2将当前模式下CPSR当前程序状态寄存器保存到到IRQ模式的SPSR程序状态保存寄存器 3修改CPSR当前程序状态寄存器将I位设置为1屏蔽IRQ同时将模式设置为IRQ模式切换到IRQ模式 4将PC程序计数器设置为IRQ的中断向量 以上步骤可以用如下示意图描述
2.2.2 跳转到中断服务函数
1中已经将IRQ中断向量传入PC程序计数器下一条指令则开始执行中断服务函数
2.2.3 中断服务函数保存上下文
中断服务函数应当将会被修改的寄存器入栈在中断服务函数完成后将保存的寄存器出栈恢复原来的值。这里需要注意如果是使用汇编语言编写中断服务函数开发者应该自行编写出入栈操作语句。如果是使用C语言编写中断服务函数则编译器会完成寄存器的出入栈操作。 以上步骤可以用如下示意图描述
2.2.4 根据中断源执行相应的中断服务函数
不同于Cortex-M的所有外部中断都有独立的中断向量Cortex-A7的中断处理程序需要自行判断中断源并调用相应的中断服务函数。
2.2.5 从中断处理程序中返回
1将SPSR_IRQIRQ模式下的SPSR寄存器复制到CPSR当前程序状态寄存器将系统状态恢复到中断发生前的状态 2将IRQ模式下的LR链接寄存器内容复制到PC程序计数器。下一条指令便会执行中断打断点的下一条指令恢复现场。 以上步骤可以用如下示意图描述
2.2.6 简单的IRQ中断服务函数实例
IRQ_Handler
PUSH {r0-r3, r12, lr} Store AAPCS registers and LR onto the IRQ mode stack
BL identify_and_clear_source
BL C-irq_handler
POP {r0-r3, r12, lr} Restore registers and
SUBS pc, lr, #4 return from exception using modified LR操作如下 1将LR程序链接寄存器及可能破坏的寄存器入栈 2识别中断源 3跳转到相应的中断服务函数 4将保存的寄存器出栈 5将LR链接寄存器值-4然后写入PC程序计数器 这里之所以需要将LR链接寄存器值-4再写入PC原因如下 当IRQ或FIQ中断产生时PC程序计数器指向当前指令后面第3条指令对于ARM指令来说它指向当前指令地址12字节的位置对于Thumb指令来说它指向当前指令地址加6个字节的位置。ARM指令下当IRQ和FIQ中断发生时处理器会将值PC-4保存到异常模式下的LR链接寄存器中这时PC-4即指向当前指令后的第2条指令。因此返回操作中再将PC-4就可以得到当前指令后的第一条指令从而实现现场恢复。 说明
3 总结
1以上例子同样适用于FIQ中断。 2IRQ中断的关键操作是保存了中断打断点后面第2条指令地址到IRQ模式的LR链接寄存器使得中断打断后能够恢复现场。 3从简单中断处理机制可以看出由于进入IRQ模式时IRQ一直处于屏蔽状态因此是不可能做到中断嵌套。同时又由于LR链接寄存器在每次进入IRQ模式前会硬件自动设置为打断点后面第2条指令地址即使我们人为进入使能IRQ的IRQ模式假如我们在将LR链接寄存器入栈之前触发了一次IRQ中断后由于LR链接寄存器被修改第一个IRQ将无法返回第一次打断点一直执行被第二次中断打断后的断点到退出IRQ模式中间的语句陷入死循环。