让我们说我有一个微控制器,我知道当它收到一个中断时,它会跳转到地址0x8000(就像一个例子)。我如何在C中定义它,似乎它可能类似于将地址转换为变量,因此我可以读取或写入内存。
通常,支持包附带一些pragma语句或其他方式来指示中断代码的位置。但我想了解你将如何在标准C中做到这一点。某种函数指针还是什么?
答案 0 :(得分:1)
这里不是一个简单的答案,但是我已经看到它在我曾经使用过的系统上完成了:
将函数放在地址的最佳方法是使用某种链接描述文件。这使您可以控制代码的对齐和运行方式。不确定你使用的是哪种C口味,但我使用的几乎所有C都能够通过链接器设置位置。
接下来,您可以在该位置定义一个指针,该指针是一个“跳转”指令,指向您希望中断代码存在的任何位置。这可能最好用汇编程序和.org语句来完成。这就是我们在非常老的硬件上做到这一点的原因,因为它允许我们通过将实际的跳转操作码更改为指向其他位置来轻松更改矢量所做的事情。
答案 1 :(得分:0)
对于中断例程,您希望将代码放在所需的地址(0x8000)。它不仅仅是你提出的演员地址。 #pragma宏创建一个由该宏定义的所有代码的函数表。与此功能表一起,您将需要使用链接描述符文件。此描述符文件将指定内存的物理地址区域。然后,您可以按特定物理地址中的部分放置#pragma代码。
为了在C中执行相同的操作,您必须在程序中执行类似的过程。您必须将功能代码复制到所需的地址。您可以通过函数名称轻松获取函数地址。但这还不够,因为您还需要在堆栈上保存当前的CPU状态和变量。为局部变量设置堆栈并正确设置外部引用。完成函数调用后,这部分由编译器完成。在这种情况下的一个技巧是使用可重定位的函数。但是这些仍然需要一些编译器选项来获取函数的起始和结束地址。您可以查看编译器指南以获取可重定位选项