关于STM32 KEIL MDK环境下,程序在RAM中调试的问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于STM32 KEIL MDK环境下,程序在RAM中调试的问题相关的知识,希望对你有一定的参考价值。
在DEBUG模式下,已实现下载程序到RAM中运行,正常。但当我想重头开始运行,我点击RST按钮后,重新运行发现此时运行的是FLASH中的程序,而不是之前下载到RAM中的程序。我的问题是,KEIL MDK该如何设置,使得当我RST后,运行的还是RAM中的程序?
芯片复位后进入的是复位中断入口地址,一般是0,并且位于FLASH中。然后在入口处放置一条跳转指令,跳转到指定的地址执行。所以如果想复位后从RAM中执行,那么必须修改bootloader,也就是最初的那段汇编代码,把跳转的地址改成RAM的地址。 参考技术A 在RAM中调试和从RAM中启动是两个不同的概念,实验证明,在RAM中调试不需要改变BOOT1和BOOT0引脚。
在调试的过程中如果单击了RST复位按钮,则需要重新Debug!
所以,你的问题只能重新Debug。
望采纳,谢谢! 参考技术B 硬件上要跳线,请注意一下STM32的Boot0,Boot1这两个pin在上电时的电压,是否从RAM上执行由这两个pin的电压决定。
如果你用的是外面买的调试板,这这两个管脚应该可以通过跳线设置。具体请阅读datasheet.
Keil/MDK:查看STM32的RAM和ROM使用情况
一、概述
本文主要记录下keil环境下,分析空间资源使用情况的基本方法。
二、编译结果
使用keil进行编译后,首先会得到如下信息:
其中:
Code
表示程序代码部分RO-data
表示 只读的数据(read-only),如程序定义的常量const temp;RW-data
表示 可读写的数据(read-write),如已初始化的全局变量ZI-data
表示 0初始化的可读写变量(zero initialized),如未初始化的全局变量
占用的 flash
=Code
+ RO-data
+ RW-data
占用的 ram
= RW-data
+ ZIdata
- Q:这里RW-data为什么既占用flash,又占用ram呢?
A:这是因为已初始化的数据会存储在Flash中,上电会从FLASH搬移至RAM中。 - Q:为什么ROM Size不包括ZI Data?
A:这是因为已经初始化的数据,在掉电后需要保存初始值,以便上电运行后重载,因此存在rom中。而ZI Data数据都是0,上电运行后直接清零即可,包含进去反而浪费存储空间。
三、map文件
在工程的\\Projects\\Listings\\目录下有一个map文件,这个目录与设置有关:
将map文件拖到keil中查看,可以在最下面看到信息:
这里直接给出了整个程序ram和rom的使用情况。当然map文件的使用情况不仅如此,目前主要用到的有:
- Global Symbols
这部分内容给出了函数和全局变量的起始地址。
当需要确认某个变量是否地址对齐时,可以从这里快速查找。如uin32_t类型的变量,起始地址不是4字节对齐,则会跨字节访问,有时会出现意想不到的问题。这时或许可以通过__align(4)关键字修饰来调整。
从这里也可以看到全局变量的地址分布,在分析数组越界等异常行为时,往往会有帮助。 - Image component sizes
在这一部分,可以查看单个C文件的资源使用情况。
当需要对空间进行优化时,可以快速定位哪个源文件使用了较多的资源空间,进而查看是否可以进行缩减。
附一个map文件结构说明的博客:Keil 生成的Map文件分析。
以上是关于关于STM32 KEIL MDK环境下,程序在RAM中调试的问题的主要内容,如果未能解决你的问题,请参考以下文章