历史上的今天
返回首页

历史上的今天

今天是:2025年02月07日(星期五)

正在发生

2021年02月07日 | STM32 位域与联合体结合优化操作

2021-02-07 来源: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的值。


推荐阅读

史海拾趣

HBH-Microwave公司的发展小趣事

面对日新月异的电子技术和不断变化的市场需求,HBH-Microwave始终保持对技术创新的热情和投入。公司每年都会投入大量资金用于研发新产品和新技术,以确保在激烈的市场竞争中保持领先地位。同时,HBH还积极与高校和研究机构合作,共同开展前沿技术的探索和研究。这种持续的技术创新和研发投入为公司的长远发展提供了源源不断的动力。

AMI [American Megatrends Inc]公司的发展小趣事

随着技术的不断成熟,HBH-Microwave开始将目光投向更为广阔的航空航天市场。公司凭借其高质量的微波组件和子系统,成功参与了多个国际知名的航天项目,如卫星通信系统和运载火箭的微波子系统。这些项目的成功实施,不仅展示了HBH在极端环境下的产品可靠性,也进一步拓宽了公司的业务范围和市场影响力。

Connective Peripherals Pte Ltd公司的发展小趣事

在电子行业中,客户需求往往具有多样性和特殊性。HBH-Microwave深知这一点,因此始终将提供定制化解决方案作为公司的核心竞争力之一。公司拥有一支专业的研发团队和完善的生产体系,能够根据客户的具体需求,快速设计出符合要求的微波组件和子系统。这种灵活性和高效性使得HBH在众多竞争对手中脱颖而出,赢得了大量客户的信赖和好评。

Aristo-Craft/ L M P Inc公司的发展小趣事

随着公司产品的不断升级和优化,Aristo-Craft/L M P Inc开始积极寻求市场拓展的机会。他们不仅在国内市场建立了稳定的销售渠道,还通过参加国际展会、与海外企业建立合作关系等方式,成功打入国际市场。同时,公司还积极寻求与其他行业领导者的战略合作,共同推动电子行业的发展。

展恒电子(Broadic)公司的发展小趣事

2012年,展恒电子与FANSO(孚安特)签订战略合作协议,共同向智能电表厂家提供配套销售服务。这一合作不仅拓宽了展恒电子的销售渠道,也提升了公司在智能电表市场的影响力。此后,展恒电子继续与多家知名企业建立战略合作关系,通过资源共享和优势互补,实现了共赢发展。

光大芯业公司的发展小趣事

随着技术的不断进步,光大芯业的产品逐渐得到了市场的认可。公司的产品线涵盖了磁传感、DC/DC、AC/DC转换器、电机驱动等多个领域,广泛应用于消费电子、运动控制、电动工具、智能家居、汽车电子等多个行业。通过不断拓展市场,光大芯业的产品已经走进了千家万户,为人们的生活带来了便利和舒适。

问答坊 | AI 解惑

借人气问问如何连接两个GPRS模块?

最近我使用IWOW的TR800来做一个无线数传的项目,我在想移动既然分配给模块的ip是内网ip,那是否意味着两个模块连上GPRS网络之后,他们都是获得同一内网里的ip,就像连接到同一路由器里面的两台机器一样? 另外共享一下我觉得不错的技术QQ群 群5 ...…

查看全部问答>

通过MR16谈谈自己对LED行业的想法--antsin

本人一直在一家电源IC原厂华东区做FAE,07年公司从linear挖了一个团队进入LED驱动行业,我随之也开始进入这个行业。在勤勤勉勉的耕耘3年中,我从学习到与客户分享我的学习经验,很多客户都会跟我讲,王工,从你身上我学到了很多。但这时我告诫自己 ...…

查看全部问答>

小弟新学TMS320LF2407,请教一下加载程序的问题

原来用的6416的片子,现在用的2407,想问下怎么能一上电就让dsp芯片运行我的程序?小弟新手希望各位大侠教的详细点,有资料发我邮箱也可以hljlishen0517@gmail.com   多谢各位了…

查看全部问答>

vxworks下U盘的插拔问题

小弟最近遇到个问题: 在vxworks中包含usb mass storage的相关组件,启动目标板后,插入U盘,读写操作都正确,但是拔掉后,再插入,就报告dosFsDevCreate失败,查看错误号,说是设备已存在,使用 hdr = iosDevFind(\"/usb/bd\", 0); iosDevDelet ...…

查看全部问答>

请高手帮忙调试一块板子(报酬1.5w)

主板芯片: Intel 6700 PXH 64 bit PCI Express to PCI-X Hub,CPU是INTEL的 Sossaman。 现在就是没有仿真到芯片组,另外,因为没有Super I/O芯片,CPLD时序设置也有点不太清楚。 请高手帮忙调试出来。 我的msn:dq_lu@hotmail.com …

查看全部问答>

74系列芯片功能大全

74系列芯片功能大全 这里是常用74系列芯片功能大全很有收藏价值   7400 TTL 2输入端四与非门7401 TTL 集电极开路2输入端四与非门7402 TTL 2输入端四或非门7403 TTL 集电极开路2输入端四与非门7404 TTL 六反相器7405 TTL 集电极开路六反相 ...…

查看全部问答>

帮忙看看这个 三相三线制缺相保护电路

这个电路在很多网站都有   对它解释也是相同 “这是一种用于三相三线制电源缺相保护电路,A、B、C缺任何一相,光耦器输出电平低于比较器的反相输入端的基准电压,比较器输出低电平,封锁PWM驱动信号,关闭电源。比较器输入极性稍加变动 ...…

查看全部问答>

LCD液晶显示

LCD1604驱动模块 /*备注一:LCD1604只含有ASCII码表内字符的字库,无汉字字库,不能自行打点,不便画曲线*/ /*本模板功能一:在任意位置显示阿拉伯数字 */ /*本模板功能二:在任意位置显示字符及字符串 */ #include #include \"lcd1604.h\" /* ...…

查看全部问答>

TPS5430DDAR芯片过回流焊后无法正常工作,重新焊接上正常工作

如题,TPS5430DDAR芯片经过热风回流焊,峰值温度230℃左右,测试电源无法工作,将两片TPS5430DDAR用烙铁取下,交换下重新焊接上去,电源正常工作,请问这是什么原因??????…

查看全部问答>

TA 输出模式 疑问

输出信号由OUTx位决定,可我没在寄存器里找到它…

查看全部问答>