我想在0x3FF802位置放置一个函数void loadableSW(void)。在另一个函数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 ();
}
}
答案 0 :(得分:0)
我不确定您的操作系统/工具链/ IDE,但以下答案应该有效:
How to specify a memory location at which function will get stored?
我只知道一种方式,它会在第一个答案中显示出来。
<强>更新强>
如何在gcc中定义部分:
变量: http://mcuoneclipse.com/2012/11/01/defining-variables-at-absolute-addresses-with-gcc/
方法(section(“section-name”)):http://gcc.gnu.org/onlinedocs/gcc-3.2/gcc/Function-Attributes.html#Function%20Attributes
答案 1 :(得分:0)
如何将函数放在C中的特定地址?
由于在测试脚本中不允许使用pragma指令,我想知道是否有其他方法可以在不使用任何链接器指令的情况下执行此操作。
如果您的目标支持 PC相对寻址,并且您可以确保它纯,那么您可以使用memcpy()
重新定位例程。
How to run code from RAM...对此有一些提示。如果您无法生成 PC相对/可重定位代码,那么在链接器的帮助下绝对不能这样做。这是链接器/加载器的定义,用于修复地址。
这可以带你去一个不同的概念。不要完全链接您的代码。而是推迟地址修复直到加载。然后,您必须编写 loader 以在运行时放置代码;但是根据你的航空航天项目评论,我认为复杂性和分析也很重要,所以我不相信你会接受。你还需要加倍存储等等。