硬汉嵌入式论坛

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

[有问必答] 请问下,Reset_Handler函数中直接就跳到SystemInit函数,此时data段、bss段还没有初始化,如何理解呢?

[复制链接]

3

主题

9

回帖

18

积分

新手上路

积分
18
发表于 2019-5-5 11:42:39 | 显示全部楼层 |阅读模式
在启动代码的Reset_Handler函数中,直接就跳转到C代码的SystemInit函数了,而此时此时data段、bss段还没有从flash复制到ram中。
我的理解是C函数的运行需要依赖data段和bss段,请问下为什么这样没有问题呢?
回复

使用道具 举报

36

主题

2040

回帖

2148

积分

至尊会员

积分
2148
发表于 2019-5-5 11:56:15 | 显示全部楼层
google,__main函数都实现了啥。
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

4

主题

140

回帖

152

积分

初级会员

积分
152
发表于 2019-5-5 18:01:30 | 显示全部楼层
我也是这么理解的,不过sysinit里面基本都是寄存器操作和内联函数,而且如果自己写启动代码的话也是通过C语言的方式将bss段和data段清零拷贝的,当然还有textrw段和中断向量表拷贝到ram
回复

使用道具 举报

3

主题

9

回帖

18

积分

新手上路

积分
18
 楼主| 发表于 2019-5-5 18:17:49 | 显示全部楼层
zl1215 发表于 2019-5-5 18:01
我也是这么理解的,不过sysinit里面基本都是寄存器操作和内联函数,而且如果自己写启动代码的话也是通过C语 ...

“自己写启动代码的话也是通过C语言的方式将bss段和data段清零拷贝的” -------- 请问下,自己写启动代码,在keil环境里怎样才能找到data段和bss段的起始地址即大小呢, 有了解吗?从map文件里没看到类似相关的信息呢。
回复

使用道具 举报

5

主题

196

回帖

211

积分

高级会员

积分
211
发表于 2019-5-5 20:03:43 | 显示全部楼层
严格来说,只使用局部变量的C代码是不需要预先初始化bss和data段的,因为所有的变量操作都发生在堆栈中。

只有程序中使用了rwdata数据段,例如static或者全局变量,才必须在启动前完成rw数据的初始化。

而且代码也不是必须拷贝到ram里才能执行,通常都是从flash Xip执行。STM32中,因为cache预取的缘故,程序在sram中执行的速度,往往还要慢于flash Xip(非f7/h7的sram本身就不快,而f7/h7中提供了和内核同速的tcm)。
回复

使用道具 举报

4

主题

140

回帖

152

积分

初级会员

积分
152
发表于 2019-5-6 09:00:37 | 显示全部楼层
张山峰 发表于 2019-5-5 18:17
“自己写启动代码的话也是通过C语言的方式将bss段和data段清零拷贝的” -------- 请问下,自己写启动代码 ...

.bss和.data是IDE保留的,IAR里面是加__section_start(段名)就能找到地址
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-2 17:46 , Processed in 0.247140 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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