硬汉嵌入式论坛

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

[BOOT/IAP] 请教:Bootloader教程中HEX2BIN的一个问题,输出BIN文件达到几百兆

[复制链接]

20

主题

94

回帖

154

积分

初级会员

积分
154
发表于 2024-1-22 20:53:48 | 显示全部楼层 |阅读模式
我按照Bootloader教程操作,输出BIN文件达到几百兆的大小。

经过查看HEX文件,发现有如下内容:
[C] 纯文本查看 复制代码
:020000043004C6
:1000000000000000000000000000000000000000F0
:1000100000000000000000000000000000000000E0
:1000200000000000000000000000000000000000D0
:1000300000000000000000000000000000000000C0
:1000400000000000000000000000000000000000B0
:1000500000000000000000000000000000000000A0
:020000043004C6
:100060000000000000000000000000000000000090
:100070000000000000000000000000000000000080
:100080000000000000000000000000000000000070
:100090000000000000000000000000000000000060
:1000A0000000000000000000000000000000000050
:1000B0000000000000000000000000000000000040



从内容来看,应该是因为如下代码,导致HEX中有将这部分全局数组清0的代码。
[C] 纯文本查看 复制代码
/* Ethernet Rx DMA 描述符 */
//__attribute__((at(0x30040000))) ETH_DMADescTypeDef  DMARxDscrTab[ETH_RX_DESC_CNT]; 
ETH_DMADescTypeDef  DMARxDscrTab[ETH_RX_DESC_CNT] __attribute__((section(".ARM.__at_0x30040000")));

/* Ethernet Tx DMA 描述符 */
//__attribute__((at(0x30040060))) ETH_DMADescTypeDef  DMATxDscrTab[ETH_TX_DESC_CNT]; 
ETH_DMADescTypeDef  DMATxDscrTab[ETH_TX_DESC_CNT] __attribute__((section(".ARM.__at_0x30040060")));
/* Ethernet 接收缓冲 */
//__attribute__((at(0x30040200))) uint8_t Rx_Buff[ETH_RX_DESC_CNT][ETH_MAX_PACKET_SIZE]; 
uint8_t Rx_Buff[ETH_RX_DESC_CNT][ETH_MAX_PACKET_SIZE] __attribute__((section(".ARM.__at_0x30040200")));


由于0x3004000 与 0x08100000,地址相差很大,估计在bin文件中产生了大量的空白,导致BIN文件非常的大。

现在疑问是
1、为什么全局变量清0,会在HEX中占据空间?
2、如何让编译器不生成相关代码,不然BIN太大了,根本不可能放到TF卡一类的存储介质上实现bootloader的功能。



回复

使用道具 举报

20

主题

94

回帖

154

积分

初级会员

积分
154
 楼主| 发表于 2024-1-23 07:53:59 | 显示全部楼层
为了重现这个问题,我写了一个简单的测试程序。


[C] 纯文本查看 复制代码
#include <stdio.h>

unsigned int gTable[1024] __attribute__((section(".ARM.__at_0x30040000")));
int main(void)
{
	while(1)
	{
		
	}
}


使用的AC6编译器,得到的HEX就有如下一段
[C] 纯文本查看 复制代码
:020000043004C6
:1000000000000000000000000000000000000000F0
:1000100000000000000000000000000000000000E0
:1000200000000000000000000000000000000000D0
:1000300000000000000000000000000000000000C0
:1000400000000000000000000000000000000000B0
:1000500000000000000000000000000000000000A0
:100060000000000000000000000000000000000090
:100070000000000000000000000000000000000080


map文件可以看到,这个数组是分布在的RW区。



为啥编译器会在HEX中生成这个变量的代码呢?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106692
QQ
发表于 2024-1-23 08:10:48 | 显示全部楼层
这个是老问题了,是你的程序里面存储空间跨度太大了。应该在hex阶段就分割出来转换bin
回复

使用道具 举报

20

主题

94

回帖

154

积分

初级会员

积分
154
 楼主| 发表于 2024-1-23 08:22:05 | 显示全部楼层
eric2013 发表于 2024-1-23 08:10
这个是老问题了,是你的程序里面存储空间跨度太大了。应该在hex阶段就分割出来转换bin

但是,我发现,如果使用AC5的方式,如下定义,就不会在Hex里出现0x30040000这个地址
[C] 纯文本查看 复制代码
#include <stdio.h>

// AC6
// unsigned int gTable[1024] __attribute__((section(".ARM.__at_0x30040000")));
// AC5
__attribute__((at(0x30040000))) unsigned int gTable[1024];

int main(void)
{
	while(1)
	{
		
	}
}


HEX里面存储的应该是代码,这个RAM中的变量不应该出现在HEX中才对啊。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106692
QQ
发表于 2024-1-23 08:57:36 | 显示全部楼层
ifree 发表于 2024-1-23 08:22
但是,我发现,如果使用AC5的方式,如下定义,就不会在Hex里出现0x30040000这个地址
[mw_shl_code=c,tru ...

MDK5 AC6下载提示No Algorithm found for: 30040000H - 300400BFH解决办法
https://www.armbbs.cn/forum.php? ... 3585&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

20

主题

94

回帖

154

积分

初级会员

积分
154
 楼主| 发表于 2024-1-23 09:09:48 | 显示全部楼层
谢谢硬汉哥,确实在变量定义中加入了.bss后,就解决这个问题了。

这说明 __attribute__((section(".ARM.__at_0x30040000"))) 编译器会认为是在代码区。
__attribute__((section(".bss.ARM.__at_0x30040000"))) 才会被当作变量对待。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-30 06:22 , Processed in 0.177162 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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