Exception 硬件异常处理入口/出口代码存储在哪里

Exception 硬件异常处理入口/出口代码存储在哪里,exception,assembly,microcontroller,interrupt,Exception,Assembly,Microcontroller,Interrupt,我知道这个问题似乎很一般,因为它可能取决于平台 但我知道,对于过程/函数调用,用于在堆栈上推送返回地址和局部变量等的汇编代码可以是调用者函数或被调用者函数的一部分 当硬件异常或中断发生时,程序计数器将通过异常表获取异常处理程序的地址,但存储状态、返回地址等的实际代码在哪里?或者这是在硬件级别自动完成的中断和异常 提前感谢在程序中定义良好(同步)位置发生的函数调用,编译器生成可执行指令来管理返回地址、寄存器和局部变量。这些说明与功能代码集成在一起。详细信息是特定于硬件和编译器的 对于可能发生在程序

我知道这个问题似乎很一般,因为它可能取决于平台

但我知道,对于过程/函数调用,用于在堆栈上推送返回地址和局部变量等的汇编代码可以是调用者函数或被调用者函数的一部分

当硬件异常或中断发生时,程序计数器将通过异常表获取异常处理程序的地址,但存储状态、返回地址等的实际代码在哪里?或者这是在硬件级别自动完成的中断和异常


提前感谢在程序中定义良好(同步)位置发生的函数调用,编译器生成可执行指令来管理返回地址、寄存器和局部变量。这些说明与功能代码集成在一起。详细信息是特定于硬件和编译器的

对于可能发生在程序中任何位置(异步)的硬件异常或中断,管理返回地址和寄存器都是在硬件中完成的。详细信息是特定于硬件的


考虑在程序执行过程中,硬件异常/中断是如何发生的。然后考虑如果硬件异常/中断需要特殊指令集成到可执行代码中,那么这些特殊指令将不得不在整个程序中到处重复。那没有道理。硬件异常/中断管理在硬件中处理。

对于在程序中定义良好(同步)位置发生的函数调用,编译器生成可执行指令来管理返回地址、寄存器和局部变量。这些说明与功能代码集成在一起。详细信息是特定于硬件和编译器的

对于可能发生在程序中任何位置(异步)的硬件异常或中断,管理返回地址和寄存器都是在硬件中完成的。详细信息是特定于硬件的


考虑在程序执行过程中,硬件异常/中断是如何发生的。然后考虑如果硬件异常/中断需要特殊指令集成到可执行代码中,那么这些特殊指令将不得不在整个程序中到处重复。那没有道理。硬件异常/中断管理在硬件中处理。

因为您询问的是arm,并且您标记了微控制器,所以您可能在谈论arm7tdmi,但可能在谈论cortex-ms之一。这些工作方式与全尺寸arm架构不同。正如与这些核心(取决于核心的armv6-m或armv7-m)相关的架构参考手册中所记录的,它记录了硬件符合ABI,以及中断的内容。因此,psr的返回地址、寄存器0到4以及其他一些都放在堆栈上,这对于一个体系结构来说是不寻常的。R14没有获取返回地址,而是获取一个特定模式的无效地址,该模式是体系结构的一部分,与其他处理器ip不同,cortex ms上的地址空间是由arm鼓励或指定的,这就是为什么在这些处理器上,ram通常从0x20000000开始,而flash则小于0x20000000,也有一些例外情况,他们把ram放在“可执行”范围内,假装是哈佛,但实际上修改了哈佛。这有助于使用0xFFFxxxxx链接寄存器返回地址,具体取决于手册,他们要么在返回地址上使用yada-yada,要么详细说明您发现的模式的含义


同样地,向量表中的地址也有类似于前16个是系统/arm异常,然后是中断,最多可能是128或256个中断,但您必须查看芯片供应商(而不是arm)的文档,以了解它们暴露了多少以及与什么相关。如果你不使用这些中断,你不必在flash中留下一个巨大的漏洞来存储向量,只需在你的程序中使用该flash(只要你确保你永远不会触发该异常或中断)

既然您在询问arm,并且您标记了微控制器,那么您可能在谈论arm7tdmi,但可能在谈论cortex-ms之一。这些功能不同于全尺寸arm架构。正如与这些核心(取决于核心的armv6-m或armv7-m)相关的架构参考手册中所记录的,它记录了硬件符合ABI,以及中断的内容。因此,psr的返回地址、寄存器0到4以及其他一些都放在堆栈上,这对于一个体系结构来说是不寻常的。R14没有获取返回地址,而是获取一个特定模式的无效地址,该模式是体系结构的一部分,与其他处理器ip不同,cortex ms上的地址空间是由arm鼓励或指定的,这就是为什么在这些处理器上,ram通常从0x20000000开始,而flash则小于0x20000000,也有一些例外情况,他们把ram放在“可执行”范围内,假装是哈佛,但实际上修改了哈佛。这有助于使用0xFFFxxxxx链接寄存器返回地址,具体取决于手册,他们要么在返回地址上使用yada-yada,要么详细说明您发现的模式的含义

同样地,向量表中的地址也有类似于前16个是系统/arm异常,然后是中断,最多可能是128或256个中断,但您必须查看芯片供应商(而不是arm)的文档,以了解它们暴露了多少以及与什么相关。如果你不使用这些中断,你不必在你的闪光灯上留下一个巨大的漏洞来寻找向量,只要使用fla就行了