在SRAM中调试代码

 作用

(1)某些应用场合下不希望或不能修改内部 FLASH 的内容,这时就可以使用 RAM 调试功能 ,它的本质是把原来存储在内部 FLASH 的代码(CODE RW-data 的内容)改为存储到SRAM 中(内部 SRAM 或外部 SDRAM 均可),芯片复位后从 SRAM 中加载代码并运行。

(2)避免 FLASH 擦写,下载程序非常快。避免FLASH可擦除次数过多失效;

(3)把代码下载到RAM,可以解锁被锁定的FLASH芯片。

       注意,存储在 RAM 上的程序掉电后会丢失,不能像 FLASH 那样保存。 所以在 SRAM 中运行的代码一般只是用于调试,调试完毕后,在实际生产环境中仍然使用在内部 FLASH 中运行的代码。

步骤

芯片:STM32F103 VCT6 ,256KB FLASH,48KB SRAM

仿真器:Jlink v8

1.建立双工程

      点击keil 。为了方便我们的使用,针对同一个项目和源代码,我们可以建立flash调试和SRAM调试两个工程。也可以在一个工程配置,不过需要切换,比较麻烦。

       通过点击按钮,可以进行如下配置:

    点击Target options魔术棒按钮可以进入SRAM工程配置界面。

2.分配内存

      有两种方式。一种是配置分散加载文件,手动编辑sct文件,另一种是用MDK对话框选项。可以根据自己的需要分配内存。

2.1 配置分散加载文件

     这里把32K(0x8000)当做ROM使用,即虚拟ROM,分16k(0x4000)用做RAM内存。

sct文件内容如下:

; *************************************************************

; *** Scatter-Loading Description File generated by uVision ***

; *************************************************************

LR_IROM1 0x20000000 0x00008000  {    ; load region size_region

  ER_IROM1 0x20000000 0x00008000  {  ; load address = execution address

   *.o (RESET, +First)

   *(InRoot$$Sections)

   .ANY (+RO)

   .ANY (+XO)

  }

  RW_IRAM1 0x20008000 0x00004000  {  ; RW data

   .ANY (+RW +ZI)

  }

}

2.2 对话框设置

    如果勾选了Use Memory Layout from Target Dialog,按如下分配。

3.配置中断向量表

        由于 startup_stm32f10x.s 启动文件中的代码不是指定到绝对地址的,经过它由链接器决定应存储到内部 FLASH 还是 SRAM,所以 SRAM 版本工程中的启动文件不需要作任何修改。

        重点在于启动文件定义的中断向量表被存储到内部 FLASH 和内部 SRAM 时,这两种情况对内核的影响是不同的,内核会根据它的“向量表偏移寄存器 VTOR”配置来获取向量表,即中断服务函数的入口。

下面以STM32F103VCT6为例

4.建立ini脚本,指定PC及SP指针

4.创建RAM.ini脚本

FUNC void Setup (void)  

RAM.ini脚本文件,放在工程目录下,脚本内容如下:

{

SP = _RDWORD(0x20000000);          // 堆栈指针

PC = _RDWORD(0x20000004);          // PC

_WDWORD(0xE000ED08, 0x20000000);   // 中断向量偏移地址

}

LOAD %L INCREMENTAL      // 下载.axf文件到RAM

Setup();                         // 调用Setup();

g, main                         //跳转到main,可选

     如果上一步在代码中,中断向量偏移地址VECT_TAB_OFFSET没有修改,则默认为0x20000000。

5. JLink设置

6.Flash Download设置

        勾选不需要擦除,RAM for Algorithm和Start与前面分散加载文件配置一致。根据实际情况进行调整。

7.调试运行

       编译,使用debug按钮进行调试。

编译后程序大小分析

编译成功后,KEIL命令行会显示这样一行数据:

Code:代码,存储在ROM中

RO-data:只读数据,存储在ROM中,如const变量

RW-data:初始化为“非 0 值”的可读写变量,使用 ROM 记录该初始值,运行的时候复制到RAM区,如非0的全局变量。

ZI-data:初始化为“0 值”的可读写数据,堆栈空间。存储在RAM区

  •     函数内的局部变量属于栈空间,进入函数申请内存,退出函数释放内存
  •     Malloc属于堆空间

,程序无法正常存储。

,程序无法正常执行.

参考书目

《STM32库开发实战指南——基于STM32F103》

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值