无情的搬砖机器= =
一、大小端
1.1 大小端含义
大端小端的含义可以看这位博主的:轻松记住大端小端的含义(附对大端和小端的解释)
1.2 大端小端哪里用到?
当涉及到数据拆解(例如一个32位数据拆分成两个16位数据来用) 的时候,就需要注意大小端。因为我们一般存数据和取数据都是一个一个或着一组一组,不会涉及到拆分数据,这样就不涉及大小端。
举个例子,当你有一个int类型的数据,你不是把数据直接取出来,而是把int变量中的一个字节数据提取出来,想做一些类似位操作的操作。当一个数据拆解取出来的时候,就会设计到数据的存储顺序,即大小端。
但是,由于一般现在所用的cpu基本上是采用的小端模式。基本上,平常撸代码都不会被涉及(影响到)到,因此简单了解一下其概念就行。以下的情况才有可能是被大小端模式影响到:
- 在(不熟悉的)平台撸代码,用到union之类的语法。发现读写数据出现异常
- 正常稳定的代码,迁移新的平台。发现读写数据出现异常
二、联合体
联合体:使几个不同类型的变量共占一段内存(相互覆盖)。所占内存长度是各最长的成员占的内存长度。
结构体:把不同类型的数据组合成一个整体。所占内存长度是各成员占的内存长度的总和。
由于嵌入式C基本都是用小端模式:字数据的高字节存储在高地址中,而字数据的低字节则存放在低地址中。小端就是我们(平常逻辑)认知的顺序,因此后面(默认小端)不再提及大小端对联合体的影响。
寄存器(联合体和结构体的妙用)
先声明一个结构体
1 | //结构体中的冒号表示位域 |
再声明一个联合体
1 | union TBCTL_REG |
可以再申明一个寄存器结构体:
1 | typedef struct |
这样的话,我就写了一个关于PWM配置的寄存器,例如我现在想改PWM的Mode1为模式1;如下:
1 | PWM_REGS PWM1; |
理解了这个方法后,再来看样例对寄存器的操作是不是就很轻松了?掌握这个方法以后,你也可以设计一个带全局或者位操作的结构体来完成自己的程序数据的应用了。