硬汉嵌入式论坛

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

[STM32CubeIDE] 求大佬!GCC链接文件中section的VMA和LMA不同,导致函数异常

[复制链接]
回帖奖励 50 个金币 回复本帖可获得 10 个金币奖励! 每人限 1 次(中奖概率 50%)

3

主题

10

回帖

19

积分

新手上路

积分
19
发表于 2024-8-5 11:23:07 | 显示全部楼层 |阅读模式
我用的是类似STM32的Cortex-M4芯片,现在想把一些常用的函数放在快速Flash区域,所以我写了以下代码:

[C] 纯文本查看 复制代码
  .flash_zw0 : ALIGN(4)
  {
    *(.flash_ex)
  } >FAST_FLASH AT> FLASH

编译后,我看到.map文件中该section的函数按照指定的区域存储,但是当程序运行到该section的函数时,会进入hardfault错误。
当我不使用 AT 时>:
[C] 纯文本查看 复制代码
  .flash_zw0 : ALIGN(4)
  {
    *(.flash_ex)
  } >FAST_FLASH

该程序不会有任何问题。
所以我认为 VMA 和 LMA 不同可能会导致程序异常,但我不知道原因和解决方案。这两个区域在内存中的地址相距很远,我必须对它们进行映射,否则生成的bin文件会太大而无法升级。



这个问题困扰了我很久,几乎全网都没有相关解答
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115434
QQ
发表于 2024-8-5 11:42:55 | 显示全部楼层
对比测试,试试放到RAM里面正常不
回复

使用道具 举报

3

主题

10

回帖

19

积分

新手上路

积分
19
 楼主| 发表于 2024-8-5 13:06:00 | 显示全部楼层
eric2013 发表于 2024-8-5 11:42
对比测试,试试放到RAM里面正常不

一样不正常,都对比过。只要是使用了AT>映射函数运行就异常
回复

使用道具 举报

3

主题

295

回帖

304

积分

高级会员

积分
304
发表于 2024-8-5 14:26:39 | 显示全部楼层
是哪款芯片,ld文件的memory怎么写的?先按从SRAM加载程序自己试一下能不能跑通,跑通了再搞这个快速flash.搞不定bin文件就直接用hex文件呗
回复

使用道具 举报

9

主题

171

回帖

198

积分

初级会员

积分
198
发表于 2024-8-5 15:59:11 | 显示全部楼层
楼主贴的链接脚本目测是有问题的:

FAST_FLASH AT > FLASH

1,FAST_FLAST 的 LMA 地址在 FLASH,VMA 在 FAST_FLASH
2,通常说就是说运行时从 FLASH 读取 FAST_FLASH 的内容写入到 FAST_FLASH 的地址
3,如果 FAST_FLASH 和 FLASH 都是闪存,这个操作是没有必要的,因为需要从 FLASH 编程数据到 FASH_FLASH,浪费 FLASH
4,如果 FAST_FLASH 是 RAM,也需要执行从 FLASH 读取 FAST_FLASH 的内容写入到 FAST_FLASH 的地址的操作,这个脚本看不出来做了没有(通常是在 startup.s 里),感觉是没做

PS:
1,按楼主的需要,最佳方案是优化升级程序,使用类似 HEX 的操作,将对应地址的内容编程到对应 FLASH 地址
2,次选方案是调用 FAST_FLASH 中函数或数据前,检查 FAST_FLASH 的内容与 FLASH 中是否一致,如果不一致,则将 FLASH 中 FAST_FLASH 对应区块编程的 FAST_FLASH 区域
3,建议按 eric2013 大佬说的先调通 RAM AT > FLASH 的方式,特别注意对应 RAM 区域的 MPU 属性是否为可取指执行
回复

使用道具 举报

0

主题

7

回帖

7

积分

新手上路

积分
7
发表于 2024-8-5 17:08:49 | 显示全部楼层
https://geek.csdn.net/65bc8286b8 ... RMMAcqIIWTRkVxy6V9c
这个帖子不知道对你有没有帮助。
回复

使用道具 举报

3

主题

10

回帖

19

积分

新手上路

积分
19
 楼主| 发表于 2024-8-5 17:50:57 | 显示全部楼层
我把memory的部分也贴出来:
[C] 纯文本查看 复制代码
MEMORY
{
FAST_FLASH (rx) : ORIGIN = 0x08014000, LENGTH = 48k
FAST_FLASH_1 (rx) : ORIGIN = 0x08020000, LENGTH = 128k
FLASH_0 (irx)   : ORIGIN = 0x0807f800, LENGTH = 2k
FLASH (rx)      : ORIGIN = 0x08080000, LENGTH = 512K
RAM (xrw)       : ORIGIN = 0x20000000, LENGTH = 96K
}

回复

使用道具 举报

3

主题

10

回帖

19

积分

新手上路

积分
19
 楼主| 发表于 2024-8-5 17:51:35 | 显示全部楼层
空世格 发表于 2024-8-5 17:08
https://geek.csdn.net/65bc8286b8e5f01e1e45adfd.html?dp_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.ey ...

我试过这个,但我这里面放的是函数,不是变量,还是不行
回复

使用道具 举报

3

主题

10

回帖

19

积分

新手上路

积分
19
 楼主| 发表于 2024-8-5 18:05:24 | 显示全部楼层
avita 发表于 2024-8-5 15:59
楼主贴的链接脚本目测是有问题的:

FAST_FLASH AT > FLASH

我没有做你说的「4」操作,这里的FAST_FLASH也可以等同SRAM
回复

使用道具 举报

3

主题

10

回帖

19

积分

新手上路

积分
19
 楼主| 发表于 2024-8-6 09:45:09 | 显示全部楼层
avita 发表于 2024-8-5 15:59
楼主贴的链接脚本目测是有问题的:

FAST_FLASH AT > FLASH

今天测了一下,确实是第「4」原因引起的,感谢大佬
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-26 07:10 , Processed in 0.508957 second(s), 30 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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