历史上的今天
今天是:2025年04月01日(星期二)
2019年04月01日 | STM32 位域与联合体结合优化操作
2019-04-01 来源:eefocus
1、位域
详细介绍参考文章:位域
位域可以实现在信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。
例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。
为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。
所谓“位域”是把一个字节中的二进位划分为几 个不同的区域, 并说明每个区域的位数。
每个域有一个域名,允许在程序中按域名进行操作。
这样就可以把几个不同的对象用一个字节的二进制位域来表示。
2、联合体
在进行某些算法的C语言编程的时候,需要使几种不同类型的变量存放到同一段内存单元中。
也就是使用覆盖技术,几个变量互相覆盖。
这种几个不同的变量共同占用一段内存的结构,在C语言中,被称作“共用体”类型结构,简称共用体,也叫联合体。
可以把联合体和位域结合起来定义数据类型。
3、示例
union
{
uint8_t value;
struct
{
uint8_t lowbit:2;
uint8_t middlebit:3;
uint8_t highbit:3;
}byte;
}test_data;
说明:
可以看出value和byte共用一个字节的内存空间,改变value的值,那么byte的值也就改变了,同样改变byte中的位(lowbit占两位, middlebit占3位,highbit也占3位;)value的值也就改变了;
一般情况下,我们要得到value中的高三位的值,需要得到这样(暂定高三位的值为x)x=(value>>5)&0x03,但是使用了位域,就可以直接得到了,省去了这样的一个计算的过程,当然位域的好处不止这些,需要大家灵活运用。
示例说明:
1) 位域定义部分
union
{
uint8_t value;
struct
{
uint8_t lowbit:2;
uint8_t middlebit:3;
uint8_t highbit:3;
}byte;
}test_data1,test_data2;
2) 赋值、打印说明
test_data1.value=15;
test_data2.byte.lowbit=3;
test_data2.byte.middlebit=3;
test_data2.byte.highbit=0;
printf("lowbit=%drn",test_data1.byte.lowbit);
printf("middlebit=%drn",test_data1.byte.middlebit);
printf("highbit=%drn",test_data1.byte.highbit);
printf("test_data2.value=%drn",test_data2.value);
说明:
test_data1中value直接赋值,打印看lowbit,middlebit,highbit各个位域的值;
test_data2中lowbit,middlebit,highbit给各个位域赋值,打印查看value的值。
史海拾趣
|
在视频监控领域,常常会涉及到视频的检索问题。常用的方法是采用文本注释图像和视频信息,以基于文本的数据库管理系统进行图像和视频检索。把图像比对技术引入到视频监控领域,可以有效的提高视频的检索的效率,为视频监控提供更有力的支持。 &nb ...… 查看全部问答> |
|
信道划分技术是怎么回事?用单片机怎么控制双工口的数据接收和发送? 我用stc51单片机控制语音芯片isd1720,在pdf中说 接受和发送数据是同时的,但是不是要有命令发送完才能确定要返回什么值吗?同时收发是怎么实现的?… 查看全部问答> |
|
本人目前在一家SP企业工作2年多了,虽然工作上技术含量不高,但工资待遇还可以,也不用加班什么的,公司正在准备上市,如果上市成功还可以分到一定股份!但最大的一个缺点是公司管理很混乱,升职加薪的空间也不大,公司整体不太重视搞技术的,如果 ...… 查看全部问答> |
|
寻有熟悉开发研华pcm-4862工控板的人, 能够将板子的DOS软件修复即可,要求在深圳,价格面议。 msn: mikehorse@hotmail.com… 查看全部问答> |
|
用VS2005怎么样制作一个WinCE的驱动程序在WM6模拟器上运行? 我按照书上的例子创建了一个VS2005的基于WM6 SDK的Win32 DLL工程,然后输入源代码,如下 #include #include #define MAX_LENGTH 1024 HANDLE ghFile = NULL; BOOL WINAPI DllEntryPoint(HANDLE hinstDLL, DWORD dwReason, LPVOID lpReserved ...… 查看全部问答> |
|
梦之旅同学LM3S811系列学习笔记和DIY示波器之USB选型和简介 为了能够实现USB通信,需要选择一款通用的USB接口芯片。既要考虑价格,又要考虑资料是否丰富以及购买是否方便,梦之旅同学初步考虑CY7C68013和PDIUSBD12芯片,但由于受限于LM3S811接口的速度限制和CY7C68013之间的通信速率限制,另外加上价 ...… 查看全部问答> |
|
本帖最后由 jameswangsynnex 于 2015-3-3 20:03 编辑 n GB/T2820.1-1997《往复式内燃机驱动的交流发电机组第1部分:用途、定额和性能》 n GB/2820.2-1997《往复式内燃机驱动的交流发电机组第2部分:发动机》 n GB/T2820.3-1 ...… 查看全部问答> |
|
使用的协议栈版本信息: ZigBee2006\\ZStack-1.4.3-1.2.1 记录几个问题: ***********************************1、有关设备的启动模式选项:(有待完善): 非自动启动模式 HOLD_AUTO_START:HOLD_AUTO_START is a compile option that will surpres ...… 查看全部问答> |




