| 
 
| 我想要把程序下载进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
 | 
 |