mazhao141 发表于 2017-12-21 17:35

链接器脚本的问题!

我想要把程序下载进Flash,但是我想让他运行在内存里
所以我在链接器脚本里加入如下的段声明:

_loadaddtest = LOADADDR(.addtest);

.addtest :
{
        . = ALIGN(4);
        _saddtest = .;
        *(.addtest)
       
        _eaddtest = .;
} >RAM AT> ROM

_size_of_addtest = SIZEOF(.addtest);

并且编辑main.c文件

#include <string.h>

extern char _loadaddtest[], _saddtest[], _eaddtest[], _size_of_addtest[];

__attribute__((section(".addtest"))) void addTest(){
        int i;
        for(i = 0; i < 1000000; i ++){

        }
}

int main(void) {
        delay_init(168);
        memcpy(_saddtest, _loadaddtest, _size_of_addtest);
        bspLedConfig();
        bspMD8Config(115200);
        bspFiberOpticalConfig(115200);
        bspIso485Config(115200);
        printfMz("addtest is loaded at:%x, run at :%x, _size_of_addtest is :%x",
                        _loadaddtest,_saddtest, _size_of_addtest); //(_eaddtest - _saddtest));

        while (1) {
                delay_ms(500);
                addTest();
                LED(led, !LED_STATUS(led));
                //printfMz("HelloWorld\r\n");
        }
}
但是并不能正确执行addTest()函数
反汇编显示调用的实际上是__addTest_veneer
37                      delay_ms(500);
08001bfa:   mov.w   r0, #500      ; 0x1f4
08001bfe:   bl      0x8001b90 <delay_ms>
38                      addTest();
08001c02:   bl      0x80058b8 <__addTest_veneer>

printfMz函数打印的内容是正确的"addtest is loaded at:80058c0, run at :20000000, _size_of_addtest is :2c"

这个东西的目标是stm32f407
最后可以正确执行是通过声明了一个函数指针
void (*f)(void);
f = addTest;
f();

但是我想知道如何正确的调用addTest而不是让编译器生成一个__addTest_veneer
页: [1]
查看完整版本: 链接器脚本的问题!