struct和union的存储精确使用

本文介绍了一种使用C语言进行寄存器级操作的方法,通过struct和union结合使用,实现了对寄存器中各个bit位的精细控制,特别适用于嵌入式软件开发中的寄存器操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

struct和union的存储精确使用


直接见代码 第一次看到这样的代码,真的很神奇,终于知道C语言是怎么操作寄存器的了,本职 嵌入式!

/********************************************************************** 
测试功能:主要用于模拟寄存器操作;
 
操作:寄存器中设置bit,也可以通过all进行一个字节的设置(一般是32bit机型) 

Autor: BOBO 
**********************************************************************/
#include <stdio.h>  

//typedef struct BITS
typedef struct
{
	unsigned char b0 : 1;
	unsigned char b1 : 1;
	unsigned char b2 : 1;
	unsigned char b3 : 1;	
	unsigned char b4 : 1;
	unsigned char b5 : 1;
	unsigned char b6 : 1;	
	unsigned char b7 : 1;	
}BITS;

typedef union
{
	unsigned char  all;
	BITS bit;
}REG_MSG;


int main()
{
	REG_MSG m_reg; 
	printf("=======test20200423=======\r\n");	
	m_reg.all = 0xAA;
	printf("b7:%d\t", m_reg.bit.b7);	
	printf("b6:%d\t", m_reg.bit.b6);	
	printf("b5:%d\t", m_reg.bit.b5);	
	printf("b4:%d\t", m_reg.bit.b4);
	printf("b3:%d\t", m_reg.bit.b3);	
	printf("b2:%d\t", m_reg.bit.b2);
	printf("b1:%d\t", m_reg.bit.b1);
	printf("b0:%d\t", m_reg.bit.b0);
	printf("\n");
	printf("------------------------------\r\n");		
	//重置每一位的值 将all的value变成:0x88 -> bit7 = 1   bit3 = 1
	m_reg.bit.b7 = 1;
	m_reg.bit.b6 = 0;
	m_reg.bit.b5 = 0;
	m_reg.bit.b4 = 0;	
	m_reg.bit.b3 = 1;
	m_reg.bit.b2 = 0;	 
	m_reg.bit.b1 = 0;
	m_reg.bit.b0 = 0;	
	printf("ALL: 0x%02X\r\n", m_reg.all);
	
	printf("\r\n------------------------------\r\n");
	return 0;
}

前言

1.基本上像是在模拟寄存器的操作一样,如果从事嵌入式软件开发的寄存器操作都知道的;

2.这种操作可以最大化的利用内存;


程序解析

//用union联合体定义unsigned char类型进行的数据
typedef union
{
	unsigned char  all;
	BITS bit;
}REG_MSG;
//此时,REG_MSG调用 all和bit的时候是操作的同一片地址,同样大小的内存;
//下面用struct定义的每一个bit的变量,b0-b7;这同样是struct的一个用法,详情可以自己查找,以b0为例,b0:5; 也就是表示b0占用总字节的5bit;
typedef struct 
{
	unsigned char b0 : 1;
	unsigned char b1 : 1;
	unsigned char b2 : 1;
	unsigned char b3 : 1;	
	unsigned char b4 : 1;
	unsigned char b5 : 1;
	unsigned char b6 : 1;	
	unsigned char b7 : 1;	
}BITS;
//这样就可以对一个字节的每一位进行管控了。

//因为union操作的同样内存及存储,则REG_MSG中的all就相当于BITS bit;又因为BITS bit对位进行调控,所以 all <-> b0-b7

如果有什么解释不妥,还请留言,多谢批评指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值