如何在 Keil 中将函数或变量编译到指定地址 2021-10-
作者:
宜居远控 | 来源:发表于
2021-10-28 08:38 被阅读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 型号
本文标题:如何在 Keil 中将函数或变量编译到指定地址 2021-10-
本文链接:https://www.haomeiwen.com/subject/lmwmaltx.html
网友评论