硬汉嵌入式论坛

 找回密码
 立即注册
查看: 230|回复: 11
收起左侧

[技术讨论] STM32F103将代码加载到RAM运行时产生hardfault异常

[复制链接]

270

主题

605

回帖

1415

积分

至尊会员

积分
1415
发表于 2025-7-30 12:50:09 | 显示全部楼层 |阅读模式
在keil5环境下,使用.sct文件,将几个.c文件的函数加载到RAM内运行。
现在有一个很奇怪的问题,就是用keil5仿真调试时,不会产生什么问题。
但是一上电直接运行的话,就会在跳转到RAM内运行的函数时产生hardfault异常。
比如,一个函数 fun_a()加载到RAM地址 0x20001378 处运行。当在main()函数地址内调用fun_a()时,就会产生hardfault异常,但是单步调试的时候就不会。
这个会是什么原因呢?
回复

使用道具 举报

4

主题

81

回帖

93

积分

初级会员

积分
93
发表于 2025-7-30 13:38:25 | 显示全部楼层
地址+1试试
回复

使用道具 举报

270

主题

605

回帖

1415

积分

至尊会员

积分
1415
 楼主| 发表于 2025-7-30 14:51:38 | 显示全部楼层

为什么还要手动地址加1吗?代码中直接调用就可以了吧。
这个地地址+1要怎么操作呀?
如果是地址的问题话,单步调试应该也会出错的吧
回复

使用道具 举报

270

主题

605

回帖

1415

积分

至尊会员

积分
1415
 楼主| 发表于 2025-7-30 14:52:28 | 显示全部楼层

我反汇编看了下,调用没有错,好像是弄了个内建函数,直接使用的 bx r12进行跳转的,r12就是函数地址+1的
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2025-7-30 15:12:26 | 显示全部楼层
仿真可以使用,是下载运行不行,说明代码实现有问题。可以MDK直接右击设置指定文件在RAM运行范围测试下。
回复

使用道具 举报

270

主题

605

回帖

1415

积分

至尊会员

积分
1415
 楼主| 发表于 2025-7-30 15:19:13 | 显示全部楼层
eric2013 发表于 2025-7-30 15:12
仿真可以使用,是下载运行不行,说明代码实现有问题。可以MDK直接右击设置指定文件在RAM运行范围测试下。

代码实现有问题是指什么呢?是指代码没有被实际加载到RAM中吗?
我看.map文件是对的呀。除非是实际运行时代码没有copy到RAM地址吗?
回复

使用道具 举报

4

主题

81

回帖

93

积分

初级会员

积分
93
发表于 2025-7-30 15:19:43 | 显示全部楼层
我之前也遇到过,HardFault报错是arm state错误,强制地址+1就行。
代码大题逻辑如下

[C] 纯文本查看 复制代码
uint8_t fun_code[] = {
    ...
};

uint32_t addr = &fun_code;
addr += 1;
void (*f)(void) = typeof(f)addr;
f();



回复

使用道具 举报

270

主题

605

回帖

1415

积分

至尊会员

积分
1415
 楼主| 发表于 2025-7-30 15:24:29 | 显示全部楼层
eric2013 发表于 2025-7-30 15:12
仿真可以使用,是下载运行不行,说明代码实现有问题。可以MDK直接右击设置指定文件在RAM运行范围测试下。

好像是有问题啊。我看hex文件直接是有0x20000000这个地址了。按说hex文件应该只有0x08000000起始的flash地址呀。
这个sct的配置是不是有问题呀?




回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2025-7-30 15:25:56 | 显示全部楼层
jplzl10000 发表于 2025-7-30 15:19
代码实现有问题是指什么呢?是指代码没有被实际加载到RAM中吗?
我看.map文件是对的呀。除非是实际运行 ...

1、拷贝不要自己copy,按照我说的直接右击设置指定文件在RAM运行范围测试下。MDK的初始化函数会上电后自动加载到指定地址。
就跟我这个帖子一样,想放在那里执行,就放在那里执行。
爽,一种非常给力的STM32H7内部Flash和QSPI Flash混合运行程序的方式,不再需要用户单独制作BOOT和APP
https://forum.anfulai.cn/forum.php?mod=viewthread&tid=101011

2、你的程序问题,我觉得是你加载到RAM的程序无法正常执行。

回复

使用道具 举报

270

主题

605

回帖

1415

积分

至尊会员

积分
1415
 楼主| 发表于 2025-7-30 15:26:47 | 显示全部楼层
eric2013 发表于 2025-7-30 15:12
仿真可以使用,是下载运行不行,说明代码实现有问题。可以MDK直接右击设置指定文件在RAM运行范围测试下。

果然是有问题的,生成的bin文件巨大,包含了RAM地址了
回复

使用道具 举报

270

主题

605

回帖

1415

积分

至尊会员

积分
1415
 楼主| 发表于 2025-7-30 15:38:45 | 显示全部楼层
eric2013 发表于 2025-7-30 15:25
1、拷贝不要自己copy,按照我说的直接右击设置指定文件在RAM运行范围测试下。MDK的初始化函数会上电后自 ...

修改了下sct文件就可以了

回复

使用道具 举报

270

主题

605

回帖

1415

积分

至尊会员

积分
1415
 楼主| 发表于 2025-7-30 16:22:49 | 显示全部楼层
kingdjh 发表于 2025-7-30 15:19
我之前也遇到过,HardFault报错是arm state错误,强制地址+1就行。
代码大题逻辑如下

说的不是同一个东西吧
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-11 21:05 , Processed in 0.052110 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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