结构体与联合体

2020-01-21 21:33发布

最近接手了别人做的一个项目,问题不少。
在阅读程序的过程中看到其变量定义上的做法很是让我费解,也让我很郁闷。
他的做法如下,是在联合体里嵌套了多个结构体:

typedef  union  _RUN_PARAM{
        unsigned char         array[21];       
        struct
        {
                unsigned char         name;                                // 0                       
                unsigned char         run_status;                        // 1
                unsigned char         wash_pos;
                unsigned char         solvent_num;
                unsigned char         spe_num;                        //4// 4
                unsigned long                 count;                                // 5
                unsigned int                 atuo_wash;
                unsigned int                 speed_last;
                unsigned int                 second;
                unsigned int                 speed;
                unsigned long                 recycle;       
        }path_sol;
        struct
        {
                unsigned char         name;                                // 0                       
                unsigned char         run_status;                        // 1
                unsigned char         wash_pos;
                unsigned char         back_num;
                unsigned char         spe_num;                        //4// 4
                unsigned long                 count;                                // 5
                unsigned int                 speed_push;
                unsigned int                 count_push;
                unsigned int                 second_push;
                unsigned int                 speed;
                unsigned long                 recycle;       
        }path_sam;
        struct
        {
                unsigned char         name;                                // 0
                unsigned char         run_status;                        // 1
                unsigned int                 temperature;
                unsigned char                spe_num;                        //4// 4
                unsigned long                 count;                                // 5
                unsigned long                 times;
                unsigned int                 second;
                unsigned int                 speed;
                unsigned long                 recycle;
        }path_other;
}run_param;

而据我用过的新唐单片机里的写法刚好跟他相反,是结构体里嵌套联合体。
众所周知,union模型是共用一段内存,如果是里面再嵌套了struct,那在后续变量操作时难免会互相修改,从而增加产生BUG的机率。
我不知道这个人这样做的目的何在,可能是为了省内存(因为公司想要马儿跑又要马儿不吃草,用资源很少的单片机来做太多的事),但是会想到省内存的人
不会不考虑到互相更改的可能。也许这样的写法有其巨大的好处但我确实看不出来,因为我也是遇到问题才去研究。
当然若有论坛牛人经过也请放缓脚步,为我这种新手普及一下知识。
此只是发发唠骚,不喜勿喷。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
92条回答
blavy
1楼-- · 2020-01-22 03:01
本帖最后由 blavy 于 2014-11-5 22:37 编辑

最近学习到一个联合体的好用的方法,可以把几个不在同一个PORT口的引脚结合起来,比如PA1,PB1,PC1,PD1,可以把这几个脚放到一个字节里面用,详细如下:
typedef union         
{
        uint8_t byte;
        struct
        {
                uint8_t B0:1;
                uint8_t B1:1;
                uint8_t B2:1;
                uint8_t B3:1;
                uint8_t B4:1;
                uint8_t B5:1;
                uint8_t B6:1;
                uint8_t B7:1;
        }BITS;
}BYTE_T;
先定义一个联合体分位定义的,这样里面的结构体就和byte共享同一段内存。
void DATA_RESOLVE (uint8_t DATAS)
{
        BYTE_T BUFF;
        BUFF.byte = DATAS;
        PA1 = BUFF.BITS.B0;
        PB1 = BUFF.BITS.B1;
        PC1 = BUFF.BITS.B2;
        PD1 = BUFF.BITS.B3;
//        =BUFF.BITS.B4;
//        =BUFF.BITS.B5;
//        =BUFF.BITS.B6;
//        =BUFF.BITS.B7;
}
这样一来,如果你想要四个脚输出PA1=1,PB1=0,PC1=0,PD2=0;只要用一条调用语句 DATA_RESOLVE (0x01);即可,可以把分散的引脚整合到一起,象一个PORT口里的一样。
CaineStrong
2楼-- · 2020-01-22 03:19
 精彩回答 2  元偷偷看……
czg1411
3楼-- · 2020-01-22 08:12
省内存,可共享使用也可交替使用
carolxr
4楼-- · 2020-01-22 13:48
这种用法很常见啊。
unsigned char   array[21]定义了一个char类型的数组,长度是21,后面的几个结构体都是跟这个数组共享同一个数据空间。
或者这么说,这段程序定义了一段内存空间,使用union结构体可以有多种方式去访问这段内存。你可以使用数组方式去访问,比如要对这段内存初始化清零的时候,使用数组就方便多了。同样的,如果你只需要访问内存中的某个字段,就用结构体的方式。定义多个结构体,可能是因为不同的对象,其属性不完全相同。
不好意思,说的不是很清楚。
单片机编程,本来就是要考虑节省内存,在哪里都一样,嵌入式编程就是这样,不比计算机编程,想怎么样就怎么样。
danielyuan
5楼-- · 2020-01-22 16:50
carolxr 发表于 2014-9-29 17:21
这种用法很常见啊。
unsigned char   array[21]定义了一个char类型的数组,长度是21,后面的几个结构体都是 ...

正解,这样写,对内存操作很灵活
javenreal
6楼-- · 2020-01-22 21:56
他这个联合体定义了4个东西(一个数组+三个结构体),这样只是为了方便存取,并不是想拿这一份内存保持4份内容,实际也是不可能的。

一周热门 更多>