本帖最后由 084425 于 2020-7-31 23:16 编辑
如何在Keil中将函数或变量编译到指定地址
Questions:如何在Keil 中将函数或变量编译到指定地址
Answer:实现方法如下
方式一: attribute 属性
1,将函数加载到指定位置
示例将main.c 中的delay 函数指定到0x08020000 地址,可以在c 文件中函数的定义处指定delay 函数。
void delay(void) __attribute__ ((section(".ARM.__at_0x08020000")));
2,将数组加载到指定位置
int Temp[] __attribute__ ((section(".ARM.__at_0x08020000"))) = {0x1, 0x2};
3,将变量加载到指定位置
示例可以直接将c 代码修改如下:
const int Temp __attribute__ ((section(".ARM.__at_0x08020000"))) = 10; // RO
int Temp __attribute__ ((section(".ARM.__at_0x20000000"))) = 10; // RW
方式二: 修改.sct 文件
将目标文件加载到指定位置,在Keil 中使用修改.sct 文件进行分散加载需要对工程配置进行如下修改,修改.sct 方法的详细使用请参考.sct 的语法规则,如下图Keil 下sct 文件编辑
其中Use Memory Layout from Target Dialog 选项是默认勾选,应取消选择。点击Scatter File 栏后的Edit对.sct 文件进行编辑。
示例将core_main.c 的目标文件进行分散加载。
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************
LR_IROM1 0x08000000 0x00020000 { ; load region size_region
ER_IROM1 0x08000000 0x00020000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}
RW_IRAM1 0x20000000 0x00038000 { ; RW data
.ANY (+RW +ZI)
}
}
LR_IROM2 0x08020000 0x00020000 { ; load region size_region
ER_IROM2 0x08020000 0x00020000 { ; load address = execution address
core_main.o (+RO)
}
}
红色区域表示将以上.c 文件加载到0x08020000 地址,大小为0x00020000。在这里,其目的通俗来说就是将以
上.c 文件编译生成的目标文件链接到MCU 芯片内部flash 的128KB 区域之后,区域大小为128KB。
类型:开发工具
适用型号:适用所有MCU 型号
FAQ0004_如何在Keil中将函数或变量编译到指定地址_V1.0.0.pdf
(646.47 KB)
|