因此我手臂相对较新,而且我在分散文件方面遇到问题。下一个文件是我输入的项目中的文件:
ROOT 0x00020200 0x000DFDFC
{
ITCM 0x00020200
{
ssw01fiq.o (Startup, +First)
startup.o (+RO)
ssw01irq.o (+RO)
}
EXEC_REST +0
{
* (+RO)
}
DTCM 0x00400000 {startup.o (StartOfRAM, +First)}
SCT +0x348
{
ibmp_slot.o* (+ZI);
}
INIT_CALL +0
{
* (INIT)
}
SRAM +0
{
* (+RW, +ZI)
startup.o* (DummyStack, +Last)
}
JUSTAFTERRAM 0x00410000
{
startup.o* (JustAfterRAM)
}
JUSTAFTERROM 0x00100000
{
startup.o* (JustAfterROM)
}
}
所以,我想要做的是添加一个名为INIT_CALL的新执行区,然后在源代码中,我将定义指向init函数的指针并将它们放在INIT部分(以简单的方式,这就是在linux内核上完成...)。 为此,我使用这样的宏:
typedef int (*_init_fn) (void);
#define component_init(__fn) static _init_fn fn __attribute__((section ("INIT"))) = __fn
在一个.c文件中使用它初始化一些初始化函数。
component_init(productUiInitialize);
void dump_fn()
{
printf("Here we have, fn=0x%08X, addr=0x%08X\n", fn, &fn);
}
在另一个.c文件中,我这样做:
extern int productUiInitialize(void);
_init_fn *test = (_init_fn *)0x00400F78;
void do_init_calls( void )
{
dump_fn();
printf("FUNC=0x%08X, INITCALL=0x%08X, ADDR=0x%08X\n",productUiInitialize, *test, test);
}
所以,结果真的很奇怪,我看到我的指针没有很好地初始化,它们有NULL值。然后我注意到,如果我在我的定义中使用const,那么dump_fn函数中的指针就可以了,所以addr是0x00400F78
,value是productUiInitialize
的addr。但是在另一个c
文件中,test的值自然为0x00400F78
,但是当我取消引用它时,我有NULL
(我期待productUiInitialize
)。
我在散点文件上做错了什么?一些投入将非常感激......
更新:所以我最近有更多时间来研究这个问题。我发现,如果我在SRAM中设置我的INIT部分,一切都按预期工作。问题是,在这种情况下,我不知道如何强制初始化地址和我的SECTION的大小。此外,我检查了如果我在test.c中初始化了这样的变量:
_init_fn * fn 属性(((" INIT")))=(init *)0x00400F78;
未正确初始化变量。当我打印它时,其他值与0x00400F78完全不同。所以看来如果我的部分在SRAM执行区域之外(RW和ZI部分都是),那么事情就不会像我预期的那样工作。所以我基本上有两个问题,有谁知道这种行为的原因?另外,如果我把它放在SRAM执行区内,是否有可能强制我的INIT部分的init地址?
提前致谢!