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