历史上的今天
返回首页

历史上的今天

今天是: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的值。


推荐阅读

史海拾趣

ELECTRONIC ASSEMBLY公司的发展小趣事

在环保日益受到重视的今天,一家名为“绿源电子组装”的公司积极响应国家号召,致力于推动绿色环保的产业发展。公司引进了一系列环保设备和材料,采用了低碳、节能的生产工艺和管理方式,实现了生产过程中的减排降耗。同时,绿源电子组装还积极参与社会公益活动,倡导绿色消费理念,为行业的可持续发展贡献了自己的力量。

Greenlee公司的发展小趣事

为了寻求新的增长点,GREEGOO公司开始尝试跨界合作。公司与一家知名汽车制造商达成合作协议,共同研发车载智能娱乐系统。通过整合双方在电子技术和汽车制造领域的优势资源,成功推出了多款具有创新性和竞争力的车载智能产品。这一跨界合作不仅为GREEGOO带来了新的业务增长点,还进一步提升了公司在电子行业中的影响力和地位。同时,也为公司未来的多元化发展奠定了坚实的基础。

请注意,以上故事均为虚构内容,旨在模拟“GREEGOO”公司可能的发展路径和故事。在实际的电子行业中,不同公司的发展经历和故事各不相同。

BOSER公司的发展小趣事

在国内市场取得一定成绩后,BOSER公司开始积极寻求海外市场的扩张。公司加强与国际知名企业的合作,通过参加国际展览、举办技术研讨会等方式,不断提升品牌知名度和影响力。同时,BOSER还针对不同国家和地区的市场需求,推出定制化的产品和服务,成功打开了多个海外市场。

Eaton公司的发展小趣事

伊顿公司起源于1911年,由Viggo Torbensen和年轻商人Joseph Eaton共同创建的Torbensen齿轮轴承公司,这是伊顿的前身。Joseph Eaton坚信战略收购是拓展业务的最佳方法,因此在公司的发展过程中,他积极推动了一系列重要的收购活动。随着时间的推移,公司的产品逐渐多元化,从最初的齿轮轴承扩展到更广泛的能源管理领域。到1932年,公司更名为伊顿制造公司,进一步彰显了其向多元化发展的决心。

General Instrument公司的发展小趣事
根据实际需要调整保护器的设定值,避免过于敏感。
风华(FH)公司的发展小趣事

为了进一步扩大市场覆盖和品牌影响力,福斯特半导体积极寻求战略合作。2023年2月,福斯特半导体与世强先进(深圳)科技股份有限公司签署授权代理协议,借助世强先进在技术分销和互联网推广方面的丰富经验,布局线上和线下功率器件渠道市场。这一合作不仅拓宽了福斯特半导体的产品应用领域,还提升了公司在新能源汽车、储能、照明等市场的知名度。通过世强硬创平台,福斯特半导体的功率MOS和二极管等产品得以快速覆盖目标市场,进一步降低了客户供应链成本。

问答坊 | AI 解惑

伟大的,图像比对技术在视频监测领域中的应用

在视频监控领域,常常会涉及到视频的检索问题。常用的方法是采用文本注释图像和视频信息,以基于文本的数据库管理系统进行图像和视频检索。把图像比对技术引入到视频监控领域,可以有效的提高视频的检索的效率,为视频监控提供更有力的支持。 &nb ...…

查看全部问答>

信道划分技术是怎么回事?用单片机怎么控制双工口的数据接收和发送?

我用stc51单片机控制语音芯片isd1720,在pdf中说 接受和发送数据是同时的,但是不是要有命令发送完才能确定要返回什么值吗?同时收发是怎么实现的?…

查看全部问答>

硬件驱动开发有前途吗

本人目前在一家SP企业工作2年多了,虽然工作上技术含量不高,但工资待遇还可以,也不用加班什么的,公司正在准备上市,如果上市成功还可以分到一定股份!但最大的一个缺点是公司管理很混乱,升职加薪的空间也不大,公司整体不太重视搞技术的,如果 ...…

查看全部问答>

寻熟悉开发研华pcm-4862工控板的人(急)

寻有熟悉开发研华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 ...…

查看全部问答>

zigbee协议栈分析

使用的协议栈版本信息: ZigBee2006\\ZStack-1.4.3-1.2.1 记录几个问题: ***********************************1、有关设备的启动模式选项:(有待完善): 非自动启动模式 HOLD_AUTO_START:HOLD_AUTO_START is a compile option that will surpres ...…

查看全部问答>

我想问一下怎么填加新的节点直接在PCB上

我想在PCB里直接添加一个新的节点,把这个12v的改成一个新的,如图但是,换的时候都是已有的,如图我怎么能新创造一个没有用过的节点呢? …

查看全部问答>