在使用联合的使用,我们通常用来判断大小端,但是其实不仅仅有这个用处。

我在网上看到还有其他的用途:

1、分离高低字节

这个需要结合cpu大小端来判断,原文如下:

这样的操作,而一个除法消耗四个机器周期,取余也需要进行一系列复杂的运算,如果在短时间内需要进行很多次这样的运算无疑会给程序带来巨大的负担。

其实进行这些操作的时候我们需要的仅仅是高低字节的数据分离而已,这样利用联合体我们很容易降低这部分开销。

联合体内数据是按地址对齐的。具体是高位数据还是低位数据要看平台的大小端模式,51是大端,stm32默认是小端,如果其他编译器还请自测。

仅仅用了一条减法指令就达到了除法、取余的操作,在进行高频率定时时尤为有用。

2、寄存器封装

看看TI固件库中寄存器是怎么封装的:

c语言联合union的使用用途-LMLPHP

c语言联合union的使用用途-LMLPHP

所有的寄存器被封装成联合体类型的变量,联合体里边的成员是一个32bit的整数及一个结构体,该结构体以位域的形式体现。这样就可以达到直接操控寄存器的某些位了。

比如,我们要设置PA0引脚的GPAQSEL1寄存器的[1:0]两位都为1,则我们只操控两个bit就可以很方便的这么设置:

GpioCtrlRegs.GPAQSEL1.bit.GPIO0 = 3

或者直接操控整个寄存器:

GpioCtrlRegs.GPAQSEL1.all |=0x03 

以上就是关于联合体的一点总结笔记

05-11 21:57