2536|2

227

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

如何在RAM中调试程序? [复制链接]

单片机的程序一般是存储在Flash中,芯片上电之后CPU从Flash读取指令并执行。与SRAM相比,对Flash的写入速度要慢很多,特别是Flash写入数据之前还需要进行耗时的擦除操作。在某些情况下存在将程序放在SRAM运行或者调试的需求。

下面两张图是STM32片内SRAM和Flash在使用J-Link调试器时的下载速度对比,SRAM下载速度达到了109.7KB/s,而Flash的下载速度仅有10.3KB/s,写入速度差距显而易见。

在对需要频繁改动的代码的调试过程中,如果将代码放置到SRAM运行,能够节约很多时间,省去了擦除和写入Flash的时间。如果从功耗的角度考虑,将应用程序放在SRAM运行,每次系统上电通过bootloader程序将应用从Flash复制到SRAM,然后关闭Flash的电源,这样可以使系统的功耗更低。

在SRAM中调试代码,在IDE中添加断点时使用的是软件断点,也就是说断点的数量是不受限制的,而在Flash中调试时添加的断点必须是硬件断点,硬件断点的数量一般只有4~8个,同时添加的断点超过这个数量时就无法再添加了。

虽然Flash的擦写寿命一般都有10000次以上,在调试过程中不太可能因为擦写Flash到这个次数而导致失效,但也确实可以作为在SRAM中调试代码的理由。

当然,虽然在SRAM中调试和运行程序有很多好处,但是这只适合片内的SRAM,如果是外扩的Memory,速度比片内SRAM就要慢得多,而且功耗优势也就不存在了。另一方面,一般片内SRAM的容量比较有限,相比Flash要小很多,这也是不足的一个地方。

实现在SRAM调试的方法

不同的架构处理器实现起来的方式一般存在差异,但是思路基本是一致的。修改链接器设置,将代码的链接地址改成SRAM,并且需要更改向量表的地址到SRAM合适的位置。至于在如何引导从SRAM中的代码开始执行,有两种做法。以STM32为例,可以控制BOOT引脚,复位时从SRAM启动。

 

另一种是直接使用IDE的调试和下载按钮,IDE调试软件自动将代码下载到SRAM区域,并通过设置PC让程序执行,在SRAM中调试程序一般是使用这种方式。下面以SEGGER的Embedded Studio for ARM(简称SES)和STM32F1系列MCU为例,演示在SRAM中调试代码。

1、修改链接器配置

在SES中可以不修改链接器脚本,因为直接改脚本的工作量稍大一点。直接改内存映射文件:

 

在内存映射文件中直接将Flash的地址改成SRAM的前面部分区域,剩余的用作程序的RAM。

 

2、修改向量表的地址

因为Cortex-M要求向量表放置在零地址,启动后可以更改。所以在SRAM起始地址放置向量表。在链接器脚本中将向量表所在的section定位到SRAM的起始地址。但这里用的方法并不需要修改,因为这里Flash的地址现在实际上已经是SRAM的地址。

 

3、设置向量表基地址寄存器

Cortex-M的系统控制块的VTOR寄存器控制着向量表的基地址,所以还需要将该寄存器的值配置为SRAM起始地址。如果使用了ST的HAL库,在CMSIS的驱动文件中已经有实现的代码,在只需要在编译器宏定义中定义一个名为“VECT_TAB_SRAM”的宏。

通过链接器的映射文件,检查链接后的代码地址,可以看到确实是定位到了SRAM,向量表也在SRAM的起始地址。

接下来就可以在SRAM中对代码进行调了。

 

最新回复

好详细的文章,匆匆浏览一遍,还要仔细读一读。   详情 回复 发表于 2022-3-23 16:56
点赞 关注
个人签名

欢迎关注“麦克泰技术”


回复
举报

15

帖子

0

TA的资源

一粒金砂(中级)

沙发
 

好详细的文章,匆匆浏览一遍,还要仔细读一读。

 
 

回复

227

帖子

0

TA的资源

一粒金砂(高级)

板凳
 
lvrc01 发表于 2022-3-23 16:56 好详细的文章,匆匆浏览一遍,还要仔细读一读。

谢谢,更多资讯欢迎关注麦克泰技术

 
个人签名

欢迎关注“麦克泰技术”

 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表