OpenEdv-开源电子网

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

裸机程序BSS段和Data段数据初始化的问题

[复制链接]

3

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2018-4-10
在线时间
21 小时
发表于 2020-7-22 16:25:51 | 显示全部楼层 |阅读模式
1金钱
--看到裸机程序.s的启动文件中有初始化.bss段,我心生疑惑,那全局变量的.data段是在哪里初始化的呢?
假设1:.data区编译的时候直接将值写入内存对应的地址中了。每次重启的时候,将初始化值从SD卡copy到DDR中。
问题1-1:为什么.bss段的初始化不按这种方式做呢?

延伸:另外,对于stm32而言,没有这个将code 批量copy到ram中执行的过程,那每次重启时,全局变量的值是如何被初始化的呢?
请大家帮忙解答疑惑

最佳答案

查看完整内容[请看2#楼]

1、你的假设1是对的 2、bss段不按这种方式来做的原因很简单,因为这个段的数据都是0 你只需把这段所占的内存区域全部清零即可! 3、我不太懂STM32,但是我觉得也是有的,只是你不知道或者说不需要你去做,IDE底层的代码帮你实现了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

712

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2179
金钱
2179
注册时间
2018-8-27
在线时间
258 小时
发表于 2020-7-22 16:25:52 | 显示全部楼层
1、你的假设1是对的
2、bss段不按这种方式来做的原因很简单,因为这个段的数据都是0  你只需把这段所占的内存区域全部清零即可!
3、我不太懂STM32,但是我觉得也是有的,只是你不知道或者说不需要你去做,IDE底层的代码帮你实现了
森罗万象
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2020-7-23 02:15:49 | 显示全部楼层
帮顶
回复

使用道具 举报

56

主题

343

帖子

0

精华

高级会员

Rank: 4

积分
977
金钱
977
注册时间
2016-3-8
在线时间
267 小时
发表于 2020-7-28 21:53:10 | 显示全部楼层
1.如楼上,你的假设对的。
2.bss段其实就是为了省code空间而设的。编译过程中把未初始化的或初始化为0的变量定义在这。 然后认为这里边都是0。。。但是这里是不是0呢?要知道芯片上电后RAM里的数据是不确定的。所以要写bss清零保证这里的变量初始是0。一般成熟的IDE会自己帮你分配好bss然后嵌入清零代码。你不需要去写清bss,因为编译器伴你写了。
3.32怎么初始化data?就一个个赋值咯。flash的code中用代码把一个个值写到对应地址。你可以认为就是一开始写了一堆 a=1;b=2;c=3;abc是变量,123是初始值。当然这些赋值代码成熟IDE会帮你写。你只管int a=xxx;
4.为什么bss不像data一样? 如上解释了data的初始化。如果bss也如data一样。你把bss看做一个大数组,比如bss[100000],按data的方式要一行一行的bss[0]=0;bss[1]=0;....
  那肯定是写一段从bss_start-bss_end的请您函数要省空间吧。
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2020-7-23
在线时间
6 小时
发表于 2020-8-11 18:42:23 | 显示全部楼层
那就是说,没有赋初始值的变量,通过BSS段,进行清零,这些变量的初始值为零,可以这样理解吗?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-24 08:42

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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