搜索
bottom↓
回复: 11

stm32工程.data和.bss混乱,求救!!

[复制链接]

出10入4汤圆

发表于 2022-2-23 12:04:31 | 显示全部楼层 |阅读模式
由于项目需要,手头这个stm32的工程需要用 arm-none-eabi-gcc编译。
我把keil配置成了这种编译方式。
现在是所有配置和文件都改了一遍。编译也过了。但是debug出错了。
调试了一下,发现好多初始化了的全局变量地址指向了.bss段。当然这些变量也没有被初始化。导致这些变量的初始状态不对。程序崩溃。
能发现这个问题是因为gcc编译需要配置STM32H743VIHx_FLASH.ld文件。因为你这款u的ram有好几段,所以  .bss和.data段一个ram放不下,被我分段放了。才碰巧发现了这个问题。
由于keil里面编译链接的配置都别我调了一遍。现在也不知道为什么会出现这种问题。大佬们,求救啊!!!!!!!!!

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入442汤圆

发表于 2022-2-23 12:15:19 来自手机 | 显示全部楼层
bss需要手动去清,而且标量貌似是sbss,向量是bss,没有默认值的都在bss。data是有默认值的,但是这个也需要你去手动加载。默认的crt链接入口会自动从flash加载data段并清零bss段。

出10入4汤圆

 楼主| 发表于 2022-2-23 14:30:34 | 显示全部楼层
wye11083 发表于 2022-2-23 12:15
bss需要手动去清,而且标量貌似是sbss,向量是bss,没有默认值的都在bss。data是有默认值的,但是这个也需 ...
(引用自2楼)

噢,这么说我搞错了,bss段初始化确实也清零了。那个全局变量之所以在bss段是因为他的初始值是0。
那我再找找变量什么时候出问题了。

出10入4汤圆

 楼主| 发表于 2022-2-23 15:06:56 | 显示全部楼层
本帖最后由 achild 于 2022-2-23 15:16 编辑
wye11083 发表于 2022-2-23 12:15
bss需要手动去清,而且标量貌似是sbss,向量是bss,没有默认值的都在bss。data是有默认值的,但是这个也需 ...
(引用自2楼)


又单步调试了一下,执行SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM1EN);开定时器时钟的时候。bss段大面积存储单元从0随机跳变。
现在好晕啊,这个看不出有什么关系! .data段和.stack .heap段不会变化。

出10入4汤圆

 楼主| 发表于 2022-2-23 15:31:04 | 显示全部楼层
wye11083 发表于 2022-2-23 12:15
bss需要手动去清,而且标量貌似是sbss,向量是bss,没有默认值的都在bss。data是有默认值的,但是这个也需 ...
(引用自2楼)

stm32h743的ram空间如下。
DTCMRAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 128K
RAM_D1 (xrw)      : ORIGIN = 0x24000000, LENGTH = 512K
RAM_D2 (xrw)      : ORIGIN = 0x30000000, LENGTH = 288K
RAM_D3 (xrw)      : ORIGIN = 0x38000000, LENGTH = 64K
ITCMRAM (xrw)      : ORIGIN = 0x00000000, LENGTH = 64K

问题找到了。在执行定时器tim1时钟开启的时候,RMA_D2里面的数据会乱掉。我把数据放到其他的ram里面,程序正常执行了。
这是什么情况啊,是器件问题,还是我使用问题啊?

出0入442汤圆

发表于 2022-2-23 17:07:43 来自手机 | 显示全部楼层
achild 发表于 2022-2-23 15:31
stm32h743的ram空间如下。
DTCMRAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 128K
RAM_D1 (xrw)      ...

(引用自5楼)

你要查查你的stack放哪了。你说的地址可能是stack或者中断服务之类的地址,或者进中断时跑飞了也说不定,比如你没有设置好中断向量。所以你得仔细查查流程了,实在不济汇编从中断指令开始查。另外,你用objdump可以生成bin文件的asm代码可以用来分析中断流程。

出10入4汤圆

 楼主| 发表于 2022-2-23 18:10:45 | 显示全部楼层
wye11083 发表于 2022-2-23 17:07
你要查查你的stack放哪了。你说的地址可能是stack或者中断服务之类的地址,或者进中断时跑飞了也说不定, ...
(引用自6楼)

应该不是我的问题了,我试了之前的keil-mdk的老工程,这个工程用了很久了,监测了这个ram,也是一样的现象,然后看了一下,这个工程的keil设置里面正好没有用到这个ram。真是巧啊

出0入442汤圆

发表于 2022-2-23 21:40:33 来自手机 | 显示全部楼层
achild 发表于 2022-2-23 18:10
应该不是我的问题了,我试了之前的keil-mdk的老工程,这个工程用了很久了,监测了这个ram,也是一样的现 ...
(引用自7楼)

那么这块ram可能是哪里映射过来的,所以会改变

出10入4汤圆

 楼主| 发表于 2022-2-24 10:04:30 | 显示全部楼层
wye11083 发表于 2022-2-23 21:40
那么这块ram可能是哪里映射过来的,所以会改变
(引用自8楼)

好像确实是这样,这个ram是给外设做dma空间的。好像是这样
D2 domain, AHB SRAM:
– AHB SRAM1 is mapped at address 0x3000 0000 and accessible by all system
masters except BDMA through D2 domain AHB matrix. AHB SRAM1 can be used
as DMA buffers to store peripheral input/output data in D2 domain, or as code
location for Cortex®-M4 CPU (application code available when D1 is powered off.
– AHB SRAM2 is mapped at address 0x3002 0000 and accessible by all system
masters except BDMA through D2 domain AHB matrix. AHB SRAM2 can be used
as DMA buffers to store peripheral input/output data in D2 domain, or as readwrite segment for application running on Cortex®-M4 CPU.
– AHB SRAM3 is mapped at address 0x3004 0000 and accessible by all system
masters except BDMA through D2 domain AHB matrix. AHB SRAM3 can be used
as buffers to store peripheral input/output data for Ethernet and USB,.

出0入42汤圆

发表于 2022-2-24 10:47:37 | 显示全部楼层
achild 发表于 2022-2-24 10:04
好像确实是这样,这个ram是给外设做dma空间的。好像是这样
D2 domain, AHB SRAM:
– AHB SRAM1 is mapped ...
(引用自9楼)

正常情况,keil工程里面链接用scatter file的 .sct 文件里面指定各个段的链接地址,包括起始地址和size,通用单片机都很简单都是完整块,以前遇到过蓝牙芯片的,
因为协议栈是官方带的,所以官方在 .sct文件做了比较复杂的分配,这个对楼主的疑问有没有帮助。

出10入4汤圆

 楼主| 发表于 2022-2-24 14:23:26 | 显示全部楼层
liyang121316 发表于 2022-2-24 10:47
正常情况,keil工程里面链接用scatter file的 .sct 文件里面指定各个段的链接地址,包括起始地址和size, ...
(引用自10楼)

我这种没怎么关注过编译原理的。遇到这种问题真的是要吐了。

出0入42汤圆

发表于 2022-2-24 14:54:13 | 显示全部楼层
achild 发表于 2022-2-24 14:23
我这种没怎么关注过编译原理的。遇到这种问题真的是要吐了。
(引用自11楼)

这就跟大学时写论文似的,需要绞尽脑汁,不过也能尽可能多的掌握一些知识。提高的机会。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-8 18:56

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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