位域

                                                                                                       位域

       位域是C语言的一种变量结构,最主要的一个特点就是可以节省空间并且实现位操作的方式。最近在一个项目中要用到它,其实我理解位域但本来没想要用它,只是上司出于好心指导的目的让我用上了它。既然用了,而且对以后有很大的帮助,就顺便写下来。

       在这个项目中,之所以要用它,是因为它能够提高执行效率,至于为什么呢?先来了解位域的使用方法。

       如图1-1,在枚举体中包含一个unsigned int Choose_Num的变量和下面的一个位域,再要详细了解这种结构那就自个去百度了,度娘很多,这里就不多说了。这个结构变量呢我是为了方便操作单片机的IO口,我只要给 Choose_Num这个变量赋值,再把IO_0这堆位域赋值给IO口,非常方便。当然,如果再配合指针那就更有效率了,不过我没做过,今天也不讨论这个。图1-2就是IO口赋值,R_0这堆是IO口,那么用51单片机的也许会问,51可以直接位操作,干嘛还要这样绕弯。今天,我们讨论的就是这个。

                             图1-1

                图1-2

    首先,不是所有单片机都可以位操作,其次,IO口链接可能不连续,而位域是通用的。即使是51,在IO口不连续的情况下,我们用通用的方法实现,应该是用for语句来提取每一个位,然后再用switch语句给IO口赋值。学过汇编的会比较了解指令的操作,执行一次for循环至少要三条指令,再加上switch语句的判断跟跳转指令,最后才能执行io口的赋值指令。如果使用位域直接就可以执行io赋值指令,在执行效率上快了至少三倍以上。

   如果使用12M主频的CPU,假如取指令和执行指令各占一个机器周期,那么执行一轮8个IO的操作,位域将会节省32个us的时间。在普通的场合可能没有感觉,但假如刷新一次LCD屏,几千上万个点,那这个时间就不可忽略了。

原文地址:https://www.cnblogs.com/wcw12580/p/9739002.html