优秀文章收录

如何在 Keil 中将函数或变量编译到指定地址 2021-10-

2021-10-28  本文已影响0人  宜居远控

方式一: 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 型号

上一篇下一篇

猜你喜欢

热点阅读