位领法:状态位-union ,结构体用法,创造一个类似寄存器操作,可以节省空间,用于标志位状态切换

学过51单片机的小伙伴应该知道,bit这个变量,它为是C51编译器的一种扩充数据类型,利用它可定义一个位标量,但不能定义位指针,也不能定义位数组。它的值是一个二进制位,不是0就是1,类似一些高级语言中的Boolean类型中的True和False。
但是进一步学习32的小伙伴,发现STM32没有类似的扩展变量去做一个0、1变量,尤其是需要一种功能需要过多变量状态切换的时候。如果单独命令3/4个8bit变量或者16bit变量,那是极具浪费单片机性能的事情,而且还不好管理变量名称。
为此可以采用结构体和共联体的方式,去节约空间
如下采用的是16bit方式,改变0、1开关量。可以组合多种标志位(共联体)

//某个状态的结构体,相当于创建一个寄存器
//函数定义
struct Temp_BITS{   
  
    uint16_t  temp0            :1;
    uint16_t  temp1            :1;
    uint16_t  temp2            :1;
    uint16_t  temp3            :1;
    uint16_t  temp4            :1;
    uint16_t  temp5            :1;
    uint16_t  temp6            :1;
    uint16_t  temp7            :1;
    uint16_t  temp8            :1;
    uint16_t  temp9            :1;
    uint16_t  temp10           :1;
    uint16_t  temp11           :1;
    uint16_t  temp12           :1;
    uint16_t  temp13           :1;
    uint16_t  temp14           :1;
    uint16_t  temp15           :1;

};


union Temp_REG {
    uint16_t  all;
    struct  Temp_BITS  bit;
};

此为声明和用法

union Temp_REG tempFlag;
/*判断变量*/
tempFlag.bit.temp0=0;
{/*
功能1
*/
}
tempFlag.bit.temp0=1;
{/*
功能2
*/
}
tempFlag.bit.all=0x12;

//此可以赋值,作为某一个状态机的轮询


另一种结构体的用法,引用我在网上看到的一个例子,切记此刻结构体为两个字节,注意使用该方法,需要避坑,博主,没有仔细研究结构体所在空间大小,可能讲的有些出处

//声明
#include<stdio.h>
//结果:编译通过
//原因:常规形式(结构体占用两个字节)
typedef struct _tag_test1
{
  char a:1;
  char b:1;
  char c:1;
  char d:6;
}sTest1;
//结果:编译无法通过
//原因:d的位域长度10超过了char类型长度
/*
typedef struct _tag_test2
{
  char a:1;
  char b:1;
  char c:1;
  char d:10;
}sTest2;
*/
//结果:编译可通过
//原因:下面使用无名位域,且占8个字节
typedef struct _tag_test3
{
  int a:1;
  int b:1;
  int :0;//无名位域
  int c:1;
}sTest3;

int main(void)
{
    printf("%d\n",sizeof(sTest1));
    printf("%d\n",sizeof(sTest3));
 
 }




  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值