5117|3

16

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

STM32数据段与bss段问题 [复制链接]

MDK编译环境,目标stm32f103,一般程序编译出来text(ro)段,data段,bss段等都在hex或者bin文件之中,烧写到目标的flash中,可是data段与bss(zi)段是怎么加载到SRAM(内存)中的,我没发现相关数据段搬用的代码啊,数据段是怎么搬运到内存之中????
此帖出自stm32/stm8论坛

最新回复

摘段mdk的一个做法,希望有所帮助. 程序的入口点在 C 库中的__main  处,在该点,库代码执行以下操作: 1. 将非根运行区(只读和读写)从其载入地址复制到运行地址。同如果任何区被压缩,将它们从载入地址解压到运行地址。更多 信息,请参阅链接器用户指南 。 2. 清零 ZI 区域。 3. 跳转到 __rt_entry。 库函数__rt_entry() 运行程序步骤如下: 1. 调用 __rt_stackheap_init() 建立栈和堆。 2. 调用 __rt_lib_init() 初始化引用的库函数、初始化语言环境 (locale),如果必要,还将为main()函数建立argc 和 argv。对于 C++,为任何顶级对象调用构造函数。 对于C++,为任何顶级对象调用构造函数作为 __cpp_initialize__aeabi_。更多信息,请参阅 C++ 初始化,建立和销毁 。 3. 调用 main()函数 ———— 应用程序的用户级根。 从main()函数中,应用程序除了调用其他函数,还可调用库函数。有关详细信息,请参阅从 main()函数中调用库函数。从main ()函数中调用库函数。 4. 使用main()函数返回的值调用exit()。 __rt_entry 符号 __rt_entry 是使用ARM C库的程序起始点。在所有分散加载区重定位到其运行地址后,控制将传递到 __rt_entry。 实现   __rt_entry 的默认实现: 1. 建立堆和栈。 2. 通过调用__rt_lib_init初始化 C 库。 3. 调用 main()函数。 4. 通过调用__rt_lib_shutdown关闭 C 库。 5. 退出。 __rt_entry 必须通过调用下列函数之一结束: exit()   调用atexit()- 注册函数并关闭库。 __rt_exit()   关闭库但不调用atexit()函数。 _sys_exit()   直接退出到运行环境。它不关闭库并且不调用 atexit() 函数。请参阅 _sys_exit()。   详情 回复 发表于 2014-12-30 13:23
点赞 关注
 

回复
举报

6423

帖子

16

TA的资源

版主

沙发
 
这个都是厂家做好的,可以看看start.S
此帖出自stm32/stm8论坛
 
个人签名training
 

回复

1976

帖子

0

TA的资源

五彩晶圆(初级)

板凳
 
你可以查看汇编代码,其中在进入main函数前有一段代码叫scatterload的函数,好像就是将这些变量搬移到内存中
此帖出自stm32/stm8论坛
 
 

回复

165

帖子

0

TA的资源

一粒金砂(中级)

4
 
摘段mdk的一个做法,希望有所帮助.
程序的入口点在 C 库中的__main  处,在该点,库代码执行以下操作:
1. 将非根运行区(只读和读写)从其载入地址复制到运行地址。同如果任何区被压缩,将它们从载入地址解压到运行地址。更多
信息,请参阅链接器用户指南 。
2. 清零 ZI 区域。
3. 跳转到 __rt_entry。

库函数__rt_entry() 运行程序步骤如下:
1. 调用 __rt_stackheap_init() 建立栈和堆。
2. 调用 __rt_lib_init() 初始化引用的库函数、初始化语言环境 (locale),如果必要,还将为main()函数建立argc 和 argv。对于
C++,为任何顶级对象调用构造函数。
对于C++,为任何顶级对象调用构造函数作为 __cpp_initialize__aeabi_。更多信息,请参阅 C++ 初始化,建立和销毁 。
3. 调用 main()函数 ———— 应用程序的用户级根。

从main()函数中,应用程序除了调用其他函数,还可调用库函数。有关详细信息,请参阅从 main()函数中调用库函数。从main
()函数中调用库函数。
4. 使用main()函数返回的值调用exit()。


__rt_entry
符号 __rt_entry 是使用ARM C库的程序起始点。在所有分散加载区重定位到其运行地址后,控制将传递到 __rt_entry。
实现  
__rt_entry 的默认实现:
1. 建立堆和栈。
2. 通过调用__rt_lib_init初始化 C 库。
3. 调用 main()函数。
4. 通过调用__rt_lib_shutdown关闭 C 库。
5. 退出。
__rt_entry 必须通过调用下列函数之一结束:
exit()  
调用atexit()- 注册函数并关闭库。
__rt_exit()  
关闭库但不调用atexit()函数。
_sys_exit()  
直接退出到运行环境。它不关闭库并且不调用 atexit() 函数。请参阅 _sys_exit()。


此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表