如何在 C 中为中断向量转换或分配函数地址?

how are function addresses cast or assigned for interrupt vectors in C?

假设我有一个微控制器并且我知道当它接收到中断时它会跳转到地址 0x8000(仅作为示例)。我如何在 C 中定义它,它似乎类似于将地址转换为变量以便我可以读取或写入内存。

通常支持包会附带一些 pragma 语句或其他方式来指示中断代码的位置。但我想了解您将如何在标准 C 中进行操作。某种函数指针或其他东西?

这里不是直接的 C 答案,但这是我在我使用过的系统上看到的:

将函数放在某个地址的最佳方法是使用某种链接描述文件。这使您可以控制代码的对齐方式和 运行。不确定您使用的是哪种 C 语言,但我使用的几乎所有 C 语言都能够通过链接器设置位置。

接下来,您可以在该位置定义一个指针,这是一个 "jump" 指令,指向您希望中断代码所在的位置。不过,这可能最好使用汇编器和 .org 语句来完成。这就是我们在非常旧的硬件上的做法,因为它允许我们通过将实际的跳转操作码更改为指向其他地方来轻松更改向量的作用。

对于中断例程,您想将代码放在所需的地址 (0x8000)。它不仅仅是你所要求的演员地址。 #pragma 宏创建一个由该宏定义的所有代码的函数 table。除了这个函数 table 你还需要使用一个链接器描述文件。该描述符文件将指定内存的物理地址区域。然后,您可以将#pragma 代码按部分放在特定的物理地址中。

为了在 C 中执行相同的操作,您必须在程序中遵循类似的过程。您必须将功能代码复制到所需的地址。您可以轻松地以函数名称开头获取函数地址。但这还不够,因为您还需要在堆栈上保存当前 CPU 状态和变量。为局部变量设置堆栈并正确设置外部引用。当函数调用完成时,这部分由编译器为您完成。这种情况下的技巧之一是使用 relocatable 函数。但是这些仍然需要一些编译器选项来为您提供函数的开始和结束地址。您可以查看编译器指南中的 relocatable 选项