硬汉嵌入式论坛

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

[STM32CubeH7] STM32H7生成bin太大。

  [复制链接]

19

主题

72

回帖

129

积分

初级会员

积分
129
发表于 2020-8-31 18:37:58 | 显示全部楼层 |阅读模式
我是用STM32H743ZIT6, 使用了RAM_D1和RAM_D2, 生成的bin文件600多M。

RAM_D1和RAM_D2之间的内存地址不是连续的,导致生成bin文件时用0填充了。

如果不能生成的bin文件600多M,怎么保存在SoC的BANK1中?

如果SoC只有一个程序的话,可以是hex,elf或者其他格式的。但是如果需要用到软件升级的,生成的BIN文件这个大,,,该如何处理?

硬汉哥,帮忙分析分析,感谢。


回复

使用道具 举报

4

主题

27

回帖

39

积分

新手上路

积分
39
发表于 2020-8-31 20:14:31 | 显示全部楼层
不知道你的开发环境是什么,如果是keil用下面的命令,fromelf --bin --output "!L.bin" "!L",如果是gcc就用objcopy配合链接脚本
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106739
QQ
发表于 2020-9-1 00:19:43 | 显示全部楼层
估计没有转换好吧。

IAR和Embedded Studio可以直接生成bin,hex等

MDK要加脚本命令,不如直接拖到hex2bin就可以了,简单易测试


hex2bin小软件下载及其使用方法
http://www.armbbs.cn/forum.php?m ... 1044&fromuid=58
(出处: 硬汉嵌入式论坛)

回复

使用道具 举报

4

主题

27

回帖

39

积分

新手上路

积分
39
发表于 2020-9-1 08:48:44 | 显示全部楼层
题主要注意区分 程序(含数据)的存储地址与运行地址的区别, 对于stm32这类哈佛结构的mcu,一般情况下代码(含只读数据)的存储地址和运行地址是一样的(明面上),比如0x08000000;而可读写的数据运行地址一般是0x20000000,而它却存储在0x08000000开始的地址中.一般而言如果不是刻意为之,代码和数据存储在flash中的存储地址是连续的.
回复

使用道具 举报

19

主题

72

回帖

129

积分

初级会员

积分
129
 楼主| 发表于 2020-9-1 09:35:01 | 显示全部楼层
eric2013 发表于 2020-9-1 00:19
估计没有转换好吧。

IAR和Embedded Studio可以直接生成bin,hex等

硬汉哥,不是转换的问题。比如我们用STM32H743ZI这款,它的内存分成几个区域了,如果我们使用RAM_D1:0x24000000 和 RAM_D2: 0x3000000, 这个地址不连续, 导致生成的bin文件把不连续的地址用0填充了。我用hex2bin生成的bin文件也是这么大。
回复

使用道具 举报

19

主题

72

回帖

129

积分

初级会员

积分
129
 楼主| 发表于 2020-9-1 09:37:42 | 显示全部楼层
lizimu 发表于 2020-9-1 08:48
题主要注意区分 程序(含数据)的存储地址与运行地址的区别, 对于stm32这类哈佛结构的mcu,一般情况下代码(含 ...

一般来说地址确实是连续的,但是有些情况却不同,比如对于STM32H753, 它的内存被分成了几个区域,我同时使用两个内存区域,生成的bin文件就变成了现在的情况。
回复

使用道具 举报

19

主题

72

回帖

129

积分

初级会员

积分
129
 楼主| 发表于 2020-9-1 09:39:20 | 显示全部楼层
lizimu 发表于 2020-8-31 20:14
不知道你的开发环境是什么,如果是keil用下面的命令,fromelf --bin --output "!L.bin" "!L",如果是gcc就用ob ...

你好,和环境无关,我用的STM32H743,内存分成好几个区域,我使用两个区域的内存,生成的bin文件就非常大,如果只使用一个内存区域,生成的bin文件就没有问题。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106739
QQ
发表于 2020-9-1 09:39:27 | 显示全部楼层
血染风采2017 发表于 2020-9-1 09:35
硬汉哥,不是转换的问题。比如我们用STM32H743ZI这款,它的内存分成几个区域了,如果我们使用RAM_D1:0x2 ...

上传个例子,我试试。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106739
QQ
发表于 2020-9-1 09:42:14 | 显示全部楼层
不方便上传的话,参考我这个额,我的这个是同时都开启了。
设置的分散加载

IAR和MDK都提供了
http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980&extra=page%3D1

44.png
回复

使用道具 举报

19

主题

72

回帖

129

积分

初级会员

积分
129
 楼主| 发表于 2020-9-1 10:02:40 | 显示全部楼层
eric2013 发表于 2020-9-1 09:42
不方便上传的话,参考我这个额,我的这个是同时都开启了。
设置的分散加载

硬汉哥,我刚刚用MDK试了一下这个Demo,生成bin文件没问题。我用的环境是STM32CubeIDE, 我在链接器脚本里面添加了.RAM_D2和.RAM_D3的内存。

2020-09-01_100146.png
回复

使用道具 举报

19

主题

72

回帖

129

积分

初级会员

积分
129
 楼主| 发表于 2020-9-1 10:08:28 | 显示全部楼层
eric2013 发表于 2020-9-1 09:39
上传个例子,我试试。

Demo.rar (1.13 MB, 下载次数: 21)

我在main.c里面使用了一下RAM_D2的内存,编译出来的bin文件就特别大。


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106739
QQ
发表于 2020-9-1 10:11:46 | 显示全部楼层
血染风采2017 发表于 2020-9-1 10:08
我在main.c里面使用了一下RAM_D2的内存,编译出来的bin文件就特别大。

CubeIDE帮不上了,我基本不用,现在用的Embedded Studio的GCC
回复

使用道具 举报

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
发表于 2020-9-1 10:13:55 | 显示全部楼层
地址连续的bin文件必然是这么大的了。 mdk生成bin的时候,可以是个文件夹,根据地址的段落,里面有分开的文件。
回复

使用道具 举报

19

主题

72

回帖

129

积分

初级会员

积分
129
 楼主| 发表于 2020-9-1 10:24:35 | 显示全部楼层
caicaptain2 发表于 2020-9-1 10:13
地址连续的bin文件必然是这么大的了。 mdk生成bin的时候,可以是个文件夹,根据地址的段落,里面有分开的文 ...

那就尴尬了,,,如果生成不了合适的bin文件,我怎么做远程升级,,,,,
回复

使用道具 举报

19

主题

72

回帖

129

积分

初级会员

积分
129
 楼主| 发表于 2020-9-1 10:25:40 | 显示全部楼层
eric2013 发表于 2020-9-1 10:11
CubeIDE帮不上了,我基本不用,现在用的Embedded Studio的GCC

我下一个Embedded Studio试试看。
回复

使用道具 举报

4

主题

27

回帖

39

积分

新手上路

积分
39
发表于 2020-9-1 10:32:17 | 显示全部楼层
你的脚本写法是错误的
我修改了你的  你自己再试试
  1.   /* libang add */
  2.   .RAM_D2 :
  3.   {
  4.     KEEP(*(.RAM_D2))
  5.   } >RAM_D2 AT>FLASH
  6.   
  7.   .RAM_D3 :
  8.   {
  9.     KEEP(*(.RAM_D3))
  10.   } >RAM_D3 AT>FLASH
复制代码
回复

使用道具 举报

4

主题

27

回帖

39

积分

新手上路

积分
39
发表于 2020-9-1 10:43:17 | 显示全部楼层
lizimu 发表于 2020-9-1 10:32
你的脚本写法是错误的
我修改了你的  你自己再试试

我这边已经测试通过大小70KB左右.
mcu在断电时代码数据全部存在flash中,上电之后才会根据需要把可读写数据分散加载.
回复

使用道具 举报

19

主题

72

回帖

129

积分

初级会员

积分
129
 楼主| 发表于 2020-9-3 15:05:36 | 显示全部楼层
lizimu 发表于 2020-9-1 10:43
我这边已经测试通过大小70KB左右.
mcu在断电时代码数据全部存在flash中,上电之后才会根据需要把可读写数 ...

多谢老兄的回答,我这种做法也不算错误,我把定义的数据放在内存里面,不放在Flash. 我找到了一种更好的方式,objcopy有一个only-section 和 remove-section的链接做法。 在Post-build step里面添加一段代码:
arm-none-eabi-objcopy.exe -O binary --only-section=.RAM_D2 "${BuildArtifactFileBaseName}.elf" RAM_D2.bin;arm-none-eabi-objcopy.exe -O binary --remove-section=.RAM_D2 "${BuildArtifactFileBaseName}.elf" ${BuildArtifactFileBaseName}.bin
我们可以忽略我们定义的section.

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106739
QQ
发表于 2020-9-3 15:24:32 | 显示全部楼层
血染风采2017 发表于 2020-9-3 15:05
多谢老兄的回答,我这种做法也不算错误,我把定义的数据放在内存里面,不放在Flash. 我找到了一种更好的 ...

你们这种的设置有点麻烦,整整我的吧,有机会可以试试,无需任何设置,就跟用MDK和IAR没啥区别

分享个Embedded Studio使用STM32H7的TCM,SRAM等五块内存方法,无需任何配置,简单易用
http://www.armbbs.cn/forum.php?m ... 9721&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

4

主题

27

回帖

39

积分

新手上路

积分
39
发表于 2020-9-3 17:23:35 | 显示全部楼层
血染风采2017 发表于 2020-9-3 15:05
多谢老兄的回答,我这种做法也不算错误,我把定义的数据放在内存里面,不放在Flash. 我找到了一种更好的 ...

既然不需要数据只需要空间,那直接uint8_t array[size] __attribute__((section(".Section")));不香么?
回复

使用道具 举报

19

主题

72

回帖

129

积分

初级会员

积分
129
 楼主| 发表于 2020-9-4 11:00:24 | 显示全部楼层
lizimu 发表于 2020-9-3 17:23
既然不需要数据只需要空间,那直接uint8_t array __attribute__((section(".Section")));不香么?

现在就是这样弄的,只不过这个".Section"换成了".RAM_D2", 我希望内存放在RAM_D2中。但是要生成一个正常大小的bin文件,就需要objcopy了,起码当前在STM32CubeIDE里面需要这样做。
回复

使用道具 举报

19

主题

72

回帖

129

积分

初级会员

积分
129
 楼主| 发表于 2020-9-4 11:28:11 | 显示全部楼层
eric2013 发表于 2020-9-3 15:24
你们这种的设置有点麻烦,整整我的吧,有机会可以试试,无需任何设置,就跟用MDK和IAR没啥区别

分享个 ...

试过了,确实可以的。
回复

使用道具 举报

262

主题

578

回帖

1364

积分

至尊会员

积分
1364
发表于 2021-1-6 15:39:15 | 显示全部楼层
对于不连续的地址而言,生成bin文件的话,会分成几个文件的,不会只生成一个吧
回复

使用道具 举报

3

主题

66

回帖

75

积分

初级会员

积分
75
发表于 2021-1-7 08:53:59 | 显示全部楼层
ld文件对应的section上加入(NOLOAD)标识就不会出现这种情况了
回复

使用道具 举报

5

主题

196

回帖

211

积分

高级会员

积分
211
发表于 2021-1-10 22:57:09 | 显示全部楼层
ld脚本没写好,需要加载的数据段没有指定好LMA。导致linker默认按VMA=LMA的情况分配地址了
回复

使用道具 举报

1

主题

1

回帖

4

积分

新手上路

积分
4
发表于 2021-6-8 15:59:25 | 显示全部楼层
血染风采2017 发表于 2020-9-3 15:05
多谢老兄的回答,我这种做法也不算错误,我把定义的数据放在内存里面,不放在Flash. 我找到了一种更好的 ...

兄弟,你把这个section编进工程的bin文件又拷贝移出来最后的bin文件会不会很大,我的有1G多,而且整个编译过程会创造大文件,频繁编译会减少磁盘读写寿命,这个怎么解决,加NOLOAD这个section又拷不出来
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106739
QQ
发表于 2021-6-9 09:40:30 | 显示全部楼层
JJlllin 发表于 2021-6-8 15:59
兄弟,你把这个section编进工程的bin文件又拷贝移出来最后的bin文件会不会很大,我的有1G多,而且整个编 ...

你的也是CubeIDE吗
回复

使用道具 举报

2

主题

7

回帖

13

积分

新手上路

积分
13
发表于 2022-1-13 18:12:01 | 显示全部楼层
你好,楼主怎么解决的,我也遇到同样的问题,开发环境STM32CubeIDE,生成的bin文件特别大。有没有具体的教程,谢谢。
回复

使用道具 举报

4

主题

140

回帖

152

积分

初级会员

积分
152
发表于 2022-1-13 19:29:43 | 显示全部楼层
cubeide有找到添加自己bat编译的位置吗
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-3 13:45 , Processed in 0.342954 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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