我想将函数
void loadableSW (void)
放置在特定位置:0x3FF802
。在另一个函数中residentMain()
我将使用函数指针跳转到这个位置。如何声明函数
loadableSW
来实现这一点。为了清楚起见,我附上了 residentMain
的骨架。
更新:目标硬件是TMS320C620xDSP。由于这是一个航空航天项目,因此确定性 行为是一个理想的设计目标。理想情况下,他们想知道记忆的哪一部分包含特定时间的内容。我刚刚知道的解决方案是在链接器文件的内存中定义一个部分。该部分应从
0x3FF802
(放置函数的位置)开始。由于 loadableSW
函数的大小是已知的,因此内存部分的大小也可以确定。然后指令 #pragma CODESECTION ("function_name", "section_name")
可以将该函数放置在指定的部分中。
由于测试脚本中不允许使用
pragma
指令,我想知道是否有其他方法可以在不使用任何链接器指令的情况下执行此操作。
此外我很好奇。 C++ 中的函数有放置语法吗?我知道有一个对象,但是函数?
void residentMain (void)
{
void (*loadable_p) (void) = (void (*) (void)) 0x3FF802;
int hardwareOK = 0;
/*Code to check hardware integrity. hardwareOK = 1 if success*/
if (hardwareOK)
{
loadable_p (); /*Jump to Loadable Software*/
}
else
{
dspHalt ();
}
}
我不确定您的操作系统/工具链/IDE,但以下答案应该有效:
我知道的只有一种方法,它显示在第一个答案中。
更新
如何在 gcc 中定义节:
变量: http://mcuoneclipse.com/2012/11/01/defining-variables-at-absolute-addresses-with-gcc/
方法(节(“节名称”)):http://gcc.gnu.org/onlinedocs/gcc-3.2/gcc/Function-Attributes.html#Function%20Attributes
如何将函数放置在C中的特定地址?
由于测试脚本中不允许使用 pragma 指令,我想知道是否有其他方法可以在不使用任何链接器指令的情况下执行此操作。
如果您的目标支持PC相对寻址并且您可以确保它是纯粹,那么您可以使用
memcpy()
来重新定位例程。
如何从 RAM 运行代码...对此有一些提示。如果您无法生成PC-relative/relocatable代码,那么如果没有链接器的帮助,您绝对无法做到这一点。这是链接器/加载器的定义,用于修复地址。
这可以带你到一个不同的概念。不要“完全链接”您的代码。相反,将地址修复推迟到加载。然后你必须编写一个 loader 将代码放在运行时;但从你的航空航天项目评论来看,我认为复杂性和分析也很重要,所以我不相信你会接受这一点。您还需要双倍的存储空间等