OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 215|回复: 4

KEIL5 + 743 RAM调试运行

[复制链接]

9

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2026-2-9
在线时间
24 小时
发表于 4 天前 | 显示全部楼层 |阅读模式
5金钱
在FLash  反复运行对芯片损耗太大。我在RAM上运行调试, 始终没有成功,  那大神搞过,

给过工程模板。非常感!!

回复

使用道具 举报

12

主题

173

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3308
金钱
3308
注册时间
2017-12-16
在线时间
237 小时
发表于 4 天前 | 显示全部楼层
如果纯考虑的flash磨损,我觉得没必要吧,没看过743手册,但是起码1W次擦写吧,一天烧写30次,够整1年的
回复

使用道具 举报

9

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2026-2-9
在线时间
24 小时
 楼主| 发表于 4 天前 | 显示全部楼层
sfd123 发表于 2026-6-10 09:51
如果纯考虑的flash磨损,我觉得没必要吧,没看过743手册,但是起码1W次擦写吧,一天烧写30次,够整1年的

由于本人水平有限,项目又要求绝对速度。  有些外设没于过。只能频繁试过,也没注意试错空间。

现在想补救一下。   就是不知怎么搞,

好像卡在  。调试什么…ini文件上,始终不能读取  PC  SP  的值无效
回复

使用道具 举报

0

主题

64

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
290
金钱
290
注册时间
2026-1-29
在线时间
24 小时
发表于 4 天前 | 显示全部楼层
基于你的需求,以下是一个适用于嵌入式系统(如AURIX TC3xx/TC4x或STM32系列)的RAM调试工程模板框架及关键设计要点:

一、RAM调试核心挑战与解决方案
资源竞争问题

现象:RAM空间被堆栈、全局变量、DMA缓冲区挤占,导致算法加载失败。
解决:在Linker Script中为调试任务单独划分RAM区域,避开硬件占用区。
启动流程适配

现象:直接跳转到RAM入口时未初始化硬件外设(如时钟、GPIO),导致代码执行失败。
解决:在Bootloader中添加最小化硬件初始化例程,再跳转至RAM调试代码。
调试工具链限制

现象:IDE默认配置不支持从RAM启动,烧录时覆盖自身代码。
解决:修改调试器配置文件(如J-Link脚本),指定加载地址为RAM起始点。
二、通用工程模板结构(以英飞凌AURIX为例)
工程目录

Project/
├── Debug_RAM/                 # RAM调试专用目录
│   ├── src/
│   │   ├── main_debug.c       # 调试入口函数(含硬件初始化)
│   │   └── debug_task.c       # 调试功能实现(日志打印、内存检测等)
│   ├── inc/
│   │   └── debug_config.h     # RAM调试配置宏(地址、大小等)
│   └── linker/
│       └── debug.ld           # 定制链接脚本(独立RAM段)
├── Flash_App/                 # 原始Flash工程(保留不变)
└── Bootloader/                # 引导程序(支持RAM跳转)

      
关键文件内容示例

自定义链接脚本(debug.ld)

      


MEMORY {
  RAM (rwx) : ORIGIN = 0x80000000, LENGTH = 64K  /* 根据实际RAM大小调整 */
}
SECTIONS {
  .debug_text : { *(.debug_text) } > RAM
  .debug_data : { *(.debug_data) } > RAM
  __ram_start = .;
  __ram_end = ORIGIN(RAM) + LENGTH(RAM);
}

      
作用:将调试代码严格限定在RAM区域,避免与Flash代码重叠。

调试入口函数(main_debug.c)

#include "debug_config.h"
void __attribute__((noinline)) jump_to_ram(void) {
    // 1. 初始化关键外设(时钟、串口)
    init_minimal_hardware();  // 需根据芯片手册编写汇编函数
    // 2. 清除RAM中原有垃圾数据
    memset((void*)DEBUG_RAM_START, 0, DEBUG_RAM_SIZE);
    // 3. 拷贝调试任务到RAM(若需动态加载)
    memcpy((void*)DEBUG_TASK_ADDR, debug_task_bin, DEBUG_TASK_SIZE);
    // 4. 设置栈指针并跳转
    __set_MSP(DEBUG_STACK_TOP);
    ((void(*)(void))DEBUG_TASK_ADDR)();
}

      
三、避坑指南与优化建议
内存越界防护

在链接脚本中添加__heap_limit符号,并在调试任务中加入内存访问断言:
      


#define CHECK_MEM(ptr) assert((uintptr_t)(ptr) >= DEBUG_RAM_START && (uintptr_t)(ptr) < DEBUG_RAM_END)

      
调试信息输出优化

通过高速接口(如CAN/Ethernet)重定向日志,避免UART速率瓶颈。
使用芯片内置Trace单元(如ETB/ETM)记录分支轨迹,减少CPU负载。
断电保护机制

在调试任务循环中定期回写关键数据到Flash:
      

        
while (debug_running) {
  if (data_updated) {
    flash_write_blocking(SAVED_DATA_ADDR, critical_data, sizeof(critical_data));
    data_updated = false;
  }
}

      
注意:需遵循Flash写入前必须擦除的原则。

总的来说,通过以上模板和策略,可显著降低Flash写入次数,同时提升调试效率
回复

使用道具 举报

9

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2026-2-9
在线时间
24 小时
 楼主| 发表于 3 天前 | 显示全部楼层
  首先非常感谢,但我还是不好云里雾里
  RAM (rwx) : ORIGIN = 0x80000000, LENGTH = 64K  /* 根据实际RAM大小调整 */
这个是RAM的地址吧?????
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /1 下一条

正点原子公众号

如发现本坛存在违规或侵权内容, 请点击这里发送邮件举报 (或致电020-38271790)。请提供侵权说明和联系方式。我们将及时审核依法处理,感谢配合。

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2026-6-14 18:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表