手臂分散文件问题

时间:2016-06-30 15:33:12

标签: c arm embedded

因此我手臂相对较新,而且我在分散文件方面遇到问题。下一个文件是我输入的项目中的文件:

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地址?

提前致谢!

0 个答案:

没有答案