野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 454|回复: 4

结构体变量需要定义2次,才能用

[复制链接]
发表于 2023-10-31 13:08:50 | 显示全部楼层 |阅读模式
遇到一个很奇怪的事情,当然很有可能是自己没有掌握透彻。

现象如下:
1、在.h文件中用typedef申明了一个结构体类型,包含11个成员,第1、2是U8类型,其他是u16类型。
2、在.c文件中定义了该结构体类型的变量。

         /* USER CODE BEGIN 0 */
        #include "Control.h"

        u32    uiSampleValue[ADC_NUM] ;
        u16    uiSampleBUF[ADC_DMA_NUM] ;

        SAMPLE  gstabc ;
        SAMPLE  gstSAMPLE ;

         .............................     
3、在debug时,keil编译器分别分配了22字节的地址给gstabc和gstSAMPLE。
4、调试时,程序真实需要用到的gstSAMPLE结构体的个成员变量得到了有效的数值。

问题如下:1、必须在定义SAMPLE  gstSAMPLE 之前,定义另外一个结构体变量(程序中随意定义的一个SAMPLE  gstabc ;),应该是只要空间大小相同即可。
                2、不事先定义一个结构体变量,程序需要用到的gstSAMPLE的成员变量没有任何响应,无数值更新。

使用环境:
1、keil  mdk  v5.38
2、SAMPLE定义的结构体大小为22字节。
3、编译器优化级别是0.
4、默认编译器版本是5.
5、map分配地址如下:
         gstabc                                   0x200000aa   Data          22  adc.o(.bss)
         gstSAMPLE                             0x200000c0   Data          22  adc.o(.bss)
6、定义2个结构体变量后的内存值如下:
野火论坛202310311303458444..png
上面2行的22字节是结构体变量gstabc的成员值(随意定义的)
下面2行的22字节是结构体变量gstSAMPLE的成员值(程序中需要用到的)

不知道具体哪里出问题了,感觉像是内存空间没有真实给到gstSAMPLE。
大神请指教,感谢。



回复

使用道具 举报

 楼主| 发表于 2023-10-31 15:23:59 | 显示全部楼层
补充:stm32f103RET6单片机
回复 支持 反对

使用道具 举报

发表于 2023-11-1 08:44:33 | 显示全部楼层
赋值后没变化吗?看这些没问题,未赋初始值的全局变量在bss段没问题
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-11-1 18:31:53 | 显示全部楼层
是的,赋值后结构体变量没变化。
昨晚想通了,找到原因了。
是因为u16    uiSampleBUF[ADC_DMA_NUM] ;,这个数组定义的是U16,但是这个数组用来ADC-DMA传输的,而DMA传输必须是U32格式的,长度超过这里定义且被编译器分配的22个地址,实际使用是44个地址。

虽然原因找到了,也解决了,但是不是最优解决方法。把这个数组长度加大,相当于预留一部分空间。
但是疑惑的是,我把u16    uiSampleBUF[ADC_DMA_NUM] ;改成U32定义,ADC-DMA也采用字传送,也没达到想要的正确结果。
目前没搞明白,ADC-DMA采用字传输,数组定义,数据处理到底应该怎么弄。
回复 支持 反对

使用道具 举报

发表于 2023-11-7 15:13:25 | 显示全部楼层
确实是环环相扣呀...解决了就不错
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-4-29 02:24 , Processed in 0.135503 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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