汉扬编程 编程大纲 嵌入式C语言中联合与位域的实际应用

嵌入式C语言中联合与位域的实际应用

C语言中,除了有结构体struct类型,还有联合体union类型。struct类型实际上是若干个相关的、不同的、基本数据类型的集合。在实际项目中,我们经常会用它来描述一些现实对象。而与之相对的union类型,我们可能会应用得比较少一些。

嵌入式C语言中联合与位域的实际应用

联合体union类型

其实,在嵌入式开发的场景下,使用union类型还是很合适的。比如在某个32位的系统中,定义字Word的数据类型,

typedef union{ t_uint32 Word; struct { t_uint16 Lo; t_uint16 Hi; }HalfWord; struct { t_uint8 Byte0; t_uint8 Byte1; t_uint8 Byte2; t_uint8 Byte3; }Byte;}un_uint32;这样我们在定义好一个32位的字变量后,无论是使用其中的半字HalfWord,还是字节Byte都会比较方便,

un_uint32 Word;Word. HalfWord.Lo = Word. HalfWord. Byte0 + Word. HalfWord. Byte1;如果再加上位域的定义,位操作也就可以支持了。

联合体和位域的结合使用

typedef union{ t_uint32 Word; struct { t_uint16 Lo; t_uint16 Hi; }HalfWord; struct { t_uint8 Byte0; t_uint8 Byte1; t_uint8 Byte2; t_uint8 Byte3; }Byte; struct { t_uint32 Bit0 :1; t_uint32 Bit1 :1; t_uint32 Bit2 :1; t_uint32 Bit3 :1; t_uint32 Bit4 :1; t_uint32 Bit5 :1; t_uint32 Bit6 :1; t_uint32 Bit7 :1; t_uint32 Bit8 :1; t_uint32 Bit9 :1; t_uint32 Bit10 :1; t_uint32 Bit11 :1; t_uint32 Bit12 :1; t_uint32 Bit13 :1; t_uint32 Bit14 :1; t_uint32 Bit15 :1; t_uint32 Bit16 :1; t_uint32 Bit17 :1; t_uint32 Bit18 :1; t_uint32 Bit19 :1; t_uint32 Bit20 :1; t_uint32 Bit21 :1; t_uint32 Bit22 :1; t_uint32 Bit23 :1; t_uint32 Bit24 :1; t_uint32 Bit25 :1; t_uint32 Bit26 :1; t_uint32 Bit27 :1; t_uint32 Bit28 :1; t_uint32 Bit29 :1; t_uint32 Bit30 :1; t_uint32 Bit31 :1; }Bit;}un_uint32;这样在针对某个32位变量做位操作时,会更加方便简洁。

在很多单片机的某些特殊寄存器中,经常会是其中某几个连续的数据位,来表示某些模块的具体状态。比如,

这样我们就需要根据实际情况,来灵活定义数据位。比如,

typedef union { t_uint8 Byte; struct { t_uint8 Bit0 :1; t_uint8 Bit1 :1; t_uint8 Bit2 :1; t_uint8 Bit3 :1; t_uint8 Bit4 :1; t_uint8 Bit5 :1; t_uint8 Bit6 :1; t_uint8 Bit7 :1; }Bit; struct { t_uint8 Bit01 :2; t_uint8 Bit23 :2; t_uint8 Bit45 :2; t_uint8 Bit67 :2; }Bit2s; struct { t_uint8 Bit03 :4; t_uint8 Bit47 :4; }Bit4s; struct { t_uint8 Bit03 :4; t_uint8 Bit46 :3; t_uint8 Bit7 :1; }Bit047;}un_uint8;小结

在嵌入式C语言中,联合和位域的使用,是非常有针对性的。在这一点上,也体现了C语言在驱动硬件上的高效性和实用性。

本文来自网络,不代表汉扬编程立场,转载请注明出处:http://www.hyzlch.com/mianfei/6052.html

C语言之,联合(union)

知识点:编程C语言进阶篇——自定义数据类型:共同体

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

返回顶部