完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
在STM32F10X项目中使用了C++的特性,使用arm-none-eabi-g++编译,程序可以正常运行。
问题: C++定义的全局变量,其类的构造函数不被执行,在构造函数中设置的变量值都无效(实际全部为0)。 当把全局变量改为函数内部的临时变量时,是有效的。 猜想是因为程序写到FLASH上去了,全局变量都为0,而不考虑对应类的构造函数。 需要怎么修改才能实现全局变量的初始化呢? |
|
相关推荐
17个回答
|
|
顶一下
|
|
|
|
|
|
|
|
7762642422d 发表于 2018-10-10 06:39 本帖最后由 whg-421854 于 2015-7-25 09:05 编辑 我使用的ARM-NONE-EABI-G++ 的。当前情况只是全局的变量(类对象)不执行构造函数,而局部变量是可以执行的。C++编译器应该没有问题。 试个多个不能参数的构造函数,都没有执行。 没有有可能是全局变量给放到程序DATA段中,而不能执行其构造函数? |
|
|
|
楼主很有想法啊。
|
|
|
|
顶一下
|
|
|
|
一个项目中需要自已调用GCC,无法使用Keil., 而且GCC编译的东西比Keil小很多耶。 |
|
|
|
jsdfjsdfew 发表于 2018-10-10 06:49 会不会是因为全局变量构造函数初始化会占用太多的时间,而GCC对此有相关的配置项(比如默认关闭全局的构造)?建议再看看GCC相关。 或者你调试下,在复位向量中就开始逐行看 |
|
|
|
不知道GCC中C库的部分是不是透明的。 |
|
|
|
顶一下。
|
|
|
|
目测是运行库调用有问题
|
|
|
|
顶一下,,,,,,,,,,
|
|
|
|
解决了问题,先说修改的地方,
在startup 中增加 bl __libc_init_array,来显示调用这个函数(注意仅修改这一处系统不能正常运行),修改LD文件增加 . = ALIGN(4); KEEP(*(.init)) . = ALIGN(4); __preinit_array_start = .; KEEP (*(.preinit_array)) __preinit_array_end = .; . = ALIGN(4); __init_array_start = .; KEEP (*(SORT(.init_array.*))) KEEP (*(.init_array)) __init_array_end = .; . = ALIGN(4); KEEP (*(.fini)) . = ALIGN(4); __fini_array_start = .; KEEP (*(.fini_array)) KEEP (*(SORT(.fini_array.*))) __fini_array_end = .; 参考文件: QDK_ARM-Cortex_STM32-GNU书籍 网上要点: 在C/C++语言中,全局变量、静态变量将被放在global数据段,当elf文件被加载到系统中时,global段的数据直接被映射到内存中。但是,对于C++来说,全局和静态类对象,还必须调用构造函数,这些构造函数的调用,就被放在了init段。这个段是一个代码段,在elf被载入时被执行。 在编译器为每个编译单元生成一份特殊函数之后,链接器在连接这些目标文件时,会将同名的段合并在一起,这样,每个目标文件的.ctors段将会被合并为一个.ctors段,其中的内容是各个目标文件的.ctors段的内存拼接而成。由于每个目标文件的.ctors段都只存储了一个指针(指向该目标文件的全局构造函数),因此拼接起来的.ctors段就成为了一个函数指针数组,每一个元素都指向一个目标文件的全局构造函数。这个指针数组不正是我们想要的全局构造函数的地址列表吗?如果能得到这个数组的地址,岂不是构造的问题就此解决了?没错,得到这个数组的地址其实也不难,我们可以效仿前面".init"和".finit"拼凑的办法,对".ctor"段也进行拼凑。还记得在链接的时候,各个用户产生的目标文件的前后分别还要链接上一个crtbegin.o和crtend.o吧?这两个glibc自身的目标文件同样具有.ctors段,在链接的时候,这两个文件的.ctors段的内容也会被合并到最终的可执行文件中。那么这两个文件的.ctors段里有什么呢? |
|
|
|
不错,很好的经验分享,辛苦麻烦了,欠缺这方面的资料,非常感谢。
|
|
|
|
不错,很好的经验分享,辛苦麻烦了,欠缺这方面的资料,非常感谢。
|
|
|
|
不错,很好的经验分享,辛苦麻烦了,欠缺这方面的资料,非常感谢。
|
|
|
|
不错,很好的经验分享,辛苦麻烦了,欠缺这方面的资料,非常感谢。
|
|
|
|
不错,很好的经验分享,辛苦麻烦了,欠缺这方面的资料,非常感谢。
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
STM32串口接受中断使用C++STL中的queue导致所有中断失效
3507 浏览 1 评论
2717 浏览 0 评论
STM32配合可编程加密芯片SMEC88ST的防抄板加密方案设计
1289 浏览 0 评论
3571 浏览 1 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
3375 浏览 4 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-2-2 18:29 , Processed in 0.941190 second(s), Total 73, Slave 67 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号