keil下如何指定stack和heap地址

目的:

有些应用场景下需要指定stack和heap摆放地址,本文简要介绍keil下如何指定stack和heap地址。

说明:

使用keil一般会启用microlib,即使用keil的库来实现一些标准接口,这样生成的代码会更精简,一般启用配置如下:

使用microlib时对stack和heap的配置有两种方式:

目前大都是方式1,这种方式不能精确的指定stack和heap地址,方式2则可以,本文介绍方式2的实现。

操作步骤:

1, 修改sct文件:

参考 《DUI0377G_02_mdk_armlink_user_guide.pdf》 7.1.4 有如下内容:

参考 《DUI0377G_02_mdk_armlink_user_guide.pdf》 7.7 有如下内容:

参考上面,增加 ARM_LIB_STACK 和 ARM_LIB_HEAP,sct修改前后对比如下:

2, 修改启动文件:

从上节可知,增加了region后相应的符号就能使用,其具体含义如下:

参考 《DUI0377G_02_mdk_armlink_user_guide.pdf》 6.3.2 有如下内容:

ASM中使用链接器定义的符号方法如下:

参考 《DUI0377G_02_mdk_armlink_user_guide.pdf》 6.3.8 有如下内容:

参考上面,修改启动文件,修改前后对比如下:

这里移除了启动文件中一些没有变化的部分。

3,从输出文件检查SP地址:

从编译后生成的hex文件可看出SP被指定为 0x20000400,如下图:

4, C代码中测试相关符号:

参考 《DUI0377G_02_mdk_armlink_user_guide.pdf》 6.3.7 有如下内容:

编写测试代码,部分内容如下:

cpp 复制代码
// stack 相关符号
extern uint32_t Image$$ARM_LIB_STACK$$Base;
extern uint32_t Image$$ARM_LIB_STACK$$ZI$$Length;
extern uint32_t Image$$ARM_LIB_STACK$$ZI$$Limit;
// heap 相关符号
extern uint32_t Image$$ARM_LIB_HEAP$$ZI$$Base;
extern uint32_t Image$$ARM_LIB_HEAP$$ZI$$Length;
extern uint32_t Image$$ARM_LIB_HEAP$$ZI$$Limit;

int main(void)
{
    ......
    INFO("MCU_CLK = %dMHz\n", mcu_clk / 1000000U);
    
    INFO("stack base = 0x%X\n", (uint32_t)&Image$$ARM_LIB_STACK$$Base);
    INFO("stack Length = 0x%X\n", (uint32_t)&Image$$ARM_LIB_STACK$$ZI$$Length);
    INFO("stack Limit = 0x%X\n", (uint32_t)&Image$$ARM_LIB_STACK$$ZI$$Limit);
    INFO("heap base = 0x%X\n", (uint32_t)&Image$$ARM_LIB_HEAP$$ZI$$Base);
    INFO("heap Length = 0x%X\n", (uint32_t)&Image$$ARM_LIB_HEAP$$ZI$$Length);
    INFO("heap Limit = 0x%X\n", (uint32_t)&Image$$ARM_LIB_HEAP$$ZI$$Limit);
    ......
}

烧录后打印内容如下:

注意事项:

按照本文档修改后代码要按下表进行符号替换:

|-----------------|---------------------------------|---------|
| 原符号 | 新符号 | 备注 |
| __initial_sp | ImageARM_LIB_STACKZILimit | 注意这两个符号 | | __initial_limit | ImageARM_LIB_STACKBase | 注意这两个符号 | | __heap_base | ImageARM_LIB_HEAPZIBase | |
| __heap_limit | ImageARM_LIB_HEAPZI$$Limit | |

参考:

《DUI0377G_02_mdk_armlink_user_guide.pdf》

keil帮助文档

相关推荐
secondyoung6 小时前
I2C通信协议详解
arm开发·驱动开发·stm32·单片机·嵌入式硬件·mcu·51单片机
三块石头10113 小时前
车载ADC避坑:为什么ADC采集值偏低?
经验分享·stm32·单片机·嵌入式硬件·mcu·硬件架构·硬件工程
学习智者18 小时前
《玄》IDE v3.6.3重磅发布:全功能修复与性能飞跃
开发语言·c++·ide·算法·中文语言 玄
重生之小比特19 小时前
【Java SE】IDEA 调试 Debug 案例完整分析
java·ide·intellij-idea
Danny_姜21 小时前
Android Studio Quail 4 稳定版发布:本地 Gemma 4 + Android Skills
android·ide·android studio
withoutfear1 天前
IntelliJ IDEA卡顿内存分配不足和索引被频繁触发问题解决办法
java·ide·intellij-idea
国科安芯2 天前
基于ECC加固的抗辐射MCU在卫星载荷数据管理中的应用分析
单片机·嵌入式硬件·mcu·抗辐射·ecc加固·卫星数据管理
寥落半伤感2 天前
在Pycharm中一键迅速安装包及查看虚拟环境中包名的方法
ide·python·pycharm
进击的炸酱面2 天前
如何在服务器中使用codex?代理配置一图详解
ide·vscode·ssh
持敬chijing2 天前
VSCode 远程开发环境完整搭建指南:汉化、SSH 免密连接与版本更新锁定
ide·vscode·ssh