打印

关于STM32定义结构体的问题,求高手赐教!!

[复制链接]
4855|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 小黑黑兔子乖乖 于 2014-2-8 17:44 编辑

我在编写通信程序时,定义了一个共用体,这个结构体由许多的共用体组成:如下
struct YAOXIN_BITS1 {      
    u8 STOPRUN:1;         
    u8 MANUALAUTO:1;      
    u8 DEVICEERR:1;      
    u8 BOARDERR:1;         
    u8 UNITERROR:1;        
    u8 LCDERROE:1;         
    u8 SOURCEERR:1;      
    u8 CAPCABERR:1;      
};
union YAOXIN_DATA1 {
   char    all;
   struct YAOXIN_BITS1  bit;
};
//这是其中的一个union的具体定义,其他具体的位定义不同,结构体名分别位
YAOXIN_DATA1 、YAOXIN_DATA2.。。。。。。YAOXIN_DATA20

struct YAOXIN_BITSALL{
        union YAOXIN_DATA1 data1;
        union YAOXIN_DATA2 data2;     //其中每一个union都是8位
        union YAOXIN_DATA3 data3;
        union YAOXIN_DATA4 data4;
        union YAOXIN_DATA5 data5;
        union YAOXIN_DATA6 data6;
        union YAOXIN_DATA7 data7;
        union YAOXIN_DATA8 data8;
        union YAOXIN_DATA9 data9;
        union YAOXIN_DATA10 data10;
        union YAOXIN_DATA11 data11;
        union YAOXIN_DATA12 data12;
        union YAOXIN_DATA13 data13;
        union YAOXIN_DATA14 data14;
        union YAOXIN_DATA15 data15;
        union YAOXIN_DATA16 data16;
        union YAOXIN_DATA17 data17;
        union YAOXIN_DATA18 data18;
        union YAOXIN_DATA19 data19;
        union YAOXIN_DATA20 data20;
        union YAOXIN_DATAQuery_1 dataQuery_1;
        union YAOXIN_DATAQuery_2 dataQuery_2;
        
};

union YAOXIN_DATAS {
                char all[22];
                struct YAOXIN_BITSALL  bitsall;}
可是不知道为什么我的结构体bitsall与all存储空间不是一一对应的!有谁帮我找一下问题!
例如all[5]中存储的不是data6的值,经过测试如果YAOXIN_BITSALL中定义的union全部换成char类型就能一一对应上,如果换成union型只有data6和data13分别占用16位,其他正常占用8位。
all[0]对应data1,
all[1]对应data2,
all[2]对应data3,
all[3]对应data4,
all[4]对应data5,
all[5]对应0x00,错误在这里
all[6]对应data6,
all[7]对应data7,
all[8]对应data8,


大家快来帮帮忙啊,着急啊!

相关帖子

沙发
guangbiao| | 2014-2-8 15:26 | 只看该作者
你看一下C语言的“位段定义”,就知道问题所在了。

使用特权

评论回复
板凳
小黑黑兔子乖乖|  楼主 | 2014-2-8 15:43 | 只看该作者
guangbiao 发表于 2014-2-8 15:26
你看一下C语言的“位段定义”,就知道问题所在了。

看过没什么问题!

使用特权

评论回复
地板
小黑黑兔子乖乖|  楼主 | 2014-2-8 15:48 | 只看该作者
guangbiao 发表于 2014-2-8 15:26
你看一下C语言的“位段定义”,就知道问题所在了。

位是没有错误的,主要是我结构体中那22个union与数组all[22]不是一一对应!例如all[5]中存储的不是data6的值

使用特权

评论回复
5
guangbiao| | 2014-2-8 16:04 | 只看该作者
小黑黑兔子乖乖 发表于 2014-2-8 15:48
位是没有错误的,主要是我结构体中那22个union与数组all[22]不是一一对应!例如all[5]中存储的不是data6 ...

你把struct YAOXIN_BITSALL结构里面的union去掉,换成字节类型!
struct YAOXIN_BITSALL{
                byte data1;
                byte data2;     //其中每一个都是8位
                byte data3;
                byte data4;
                byte data5;
                byte data6;
                byte data7;
                byte data8;
                byte data9;
                byte data10;
                byte data11;
                byte data12;
                byte data13;
                byte data14;
                byte data15;
                byte data16;
                byte data17;
                byte data18;
                byte data19;
                byte data20;
                byte dataQuery_1;
                byte dataQuery_2;        
};

使用特权

评论回复
6
小黑黑兔子乖乖|  楼主 | 2014-2-8 16:19 | 只看该作者
guangbiao 发表于 2014-2-8 16:04
你把struct YAOXIN_BITSALL结构里面的union去掉,换成字节类型!
struct YAOXIN_BITSALL{
                byte data1;

我刚刚测试过,这样是没有问题的!我把的公用体定义贴出来吧

使用特权

评论回复
7
香水橙| | 2014-2-8 16:56 | 只看该作者
看看有没有Alienment的描述,在VC里是#pragma pack()。

找找规律,例如all[0]与all[1]分别的对应关系。

使用特权

评论回复
8
小黑黑兔子乖乖|  楼主 | 2014-2-8 17:26 | 只看该作者
香水橙 发表于 2014-2-8 16:56
看看有没有Alienment的描述,在VC里是#pragma pack()。

找找规律,例如all[0]与all[1]分别的对应关系。 ...

all[0]对应data1,
all[1]对应data2,
all[2]对应data3,
all[3]对应data4,
all[4]对应data5,
all[5]对应0x00,错误在这里
all[6]对应data6,
all[7]对应data7,
all[8]对应data8,

使用特权

评论回复
9
guangbiao| | 2014-2-8 17:41 | 只看该作者
小黑黑兔子乖乖 发表于 2014-2-8 16:19
我刚刚测试过,这样是没有问题的!我把的公用体定义贴出来吧

嘿嘿,首先声明:我没有调试过楼主的代码,纯看代码回复。
楼主的类型里,union嵌套union,估计是这个把编译器搞晕了的,要看看编译原理了。。。
我估计在struct YAOXIN_BITSALL这个结构的时候,编译器有可能搞得清楚,楼主定义一个变量看看。
但是到union YAOXIN_DATAS这个联合的时候,估计编译器就“崩溃”了。。。呵呵。。。

按我个人的理解,可以把这个理解成派生类的实例化过程。
派生类在实例化时,实际是先利用父类的构造函数,再利用派生类的构造函数,这样构造出一个实例对象。
如果按照这种思路来理解,也就是先利用struct YAOXIN_BITSALL进行构造,这个时候char  all变量已经和struct YAOXIN_BITS1  bit;捆绑成一个内存模型了。这时候再用char all[22]与struct YAOXIN_BITSALL  bitsall;进行捆绑,就很有可能无法得出楼主想要的那个内存模型了。

建议楼主,减少一次“捆绑”,这样就不会有问题了。
以上信息仅供参考。

使用特权

评论回复
10
小黑黑兔子乖乖|  楼主 | 2014-2-8 17:49 | 只看该作者
guangbiao 发表于 2014-2-8 17:41
嘿嘿,首先声明:我没有调试过楼主的代码,纯看代码回复。
楼主的类型里,union嵌套union,估计是这个把 ...

谢谢你耐心的回答!我刚才试了,不用union,直接用struct定义也不可以如下:
struct YAOXIN_BITSALL{
        struct  YAOXIN_BITS1             data1;
        struct  YAOXIN_BITS2             data2;
        struct  YAOXIN_BITS3             data3;
        struct  YAOXIN_BITS4             data4;
        struct  YAOXIN_BITS5             data5;
        struct  YAOXIN_BITS6             data6;
        struct YAOXIN_BITS7              data7;
        struct  YAOXIN_BITS8             data8;
        struct  YAOXIN_BITS9             data9;
        struct  YAYAOXIN_BITS10       data10;
        ;
               
};

使用特权

评论回复
11
guangbiao| | 2014-2-8 17:57 | 只看该作者
小黑黑兔子乖乖 发表于 2014-2-8 17:49
谢谢你耐心的回答!我刚才试了,不用union,直接用struct定义也不可以如下:
struct YAOXIN_BITSALL{
        st ...

不是这个意思。。。
我是说你用下面这个类型直接定义一个变量处理,看看内存结构对不对。
struct YAOXIN_BITSALL{
        union YAOXIN_DATA1 data1;
        union YAOXIN_DATA2 data2;     //其中每一个union都是8位
        union YAOXIN_DATA3 data3;
        union YAOXIN_DATA4 data4;
        union YAOXIN_DATA5 data5;
        union YAOXIN_DATA6 data6;
        union YAOXIN_DATA7 data7;
        union YAOXIN_DATA8 data8;
        union YAOXIN_DATA9 data9;
        union YAOXIN_DATA10 data10;
        union YAOXIN_DATA11 data11;
        union YAOXIN_DATA12 data12;
        union YAOXIN_DATA13 data13;
        union YAOXIN_DATA14 data14;
        union YAOXIN_DATA15 data15;
        union YAOXIN_DATA16 data16;
        union YAOXIN_DATA17 data17;
        union YAOXIN_DATA18 data18;
        union YAOXIN_DATA19 data19;
        union YAOXIN_DATA20 data20;
        union YAOXIN_DATAQuery_1 dataQuery_1;
        union YAOXIN_DATAQuery_2 dataQuery_2;
        
}YAOXIN_BITSALL_var;

然后看看YAOXIN_BITSALL_var这个变量的内存模型对不对。
你仔细看看我上一个贴的内容。。。估计你没看明白我的意思。。。

使用特权

评论回复
12
QQ518132| | 2014-2-9 15:24 | 只看该作者
内容很不错。感谢论坛

使用特权

评论回复
13
香水橙| | 2014-2-9 17:52 | 只看该作者
LZ怎么做的测试?是否与测试方式有关?

使用特权

评论回复
14
小黑黑兔子乖乖|  楼主 | 2014-2-10 09:18 | 只看该作者
香水橙 发表于 2014-2-9 17:52
LZ怎么做的测试?是否与测试方式有关?

keil软件,把变量放在watch中看

使用特权

评论回复
15
香水橙| | 2014-2-10 10:33 | 只看该作者
我是问,怎么做的赋值?数据从哪里来的?怎么放进变量中?

使用特权

评论回复
16
小黑黑兔子乖乖|  楼主 | 2014-2-10 14:58 | 只看该作者
谢谢各位的耐心解答,问题已经解决,是我自己按位操作错误的缘故!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

94

帖子

0

粉丝