打印
[嵌入式linux]

链接器脚本的问题!

[复制链接]
699|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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[1], !LED_STATUS(led[1]));
                //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

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

104

帖子

0

粉丝