单片机的RAM是非常少的,像新唐,STC,合泰等一些国产的51单片机,RAM 512 byte,1k,2k,非常常见,

有时候我们的串口接收一串数据,或AD连续采集,这些数据是不能放到 flash 里的,没办法,只能想法节约一些变量空间了.

标志位很多时候只有两种状态,就像bool型一样,真/假,这样的话,我们可以用下面的方式定义,

 typedef union uFLG{
char Flg ; //定义整形数据 联合体成员
struct FLAG{ //位域定义
u8 Flg1 : ;
u8 Flg2 : ;
u8 Flg3 : ;
u8 Flg4 : ;
u8 Flg5 : ;
u8 Flg6 : ;
u8 Flg7 : ;
u8 Flg8 : ;
}tFlg;
}uFlg; uFlg uF1; //定义联合体变量

定义一个联合体产FLG类型,包含一个char变量和一个结构体,

在RAM中,联合体(union)只占用一个字节,

也就是说char Flg和struct FLAG在单片机的内存中,共用一个字节,改变了FLAG的值,Flg的值也被改变了,这在某些情况下会变得很方便,

Flg1~Flg8都只占用一个bit位,所以它们的值只能是0或1,这用来做标志位是足够了,如果改变了它们的值,相应的,char Flg的值也被改变了,

比如改变了Flg3的值,那么char Flg的第3位也被改了,这是对应的,因为他们共享同一个字节的RMA.

也可以这样定义:

 typedef union uFLG{
char Flg ; //定义整形数据 联合体成员
struct FLAG{ //位域定义
u8 Flg1 : ;
u8 Flg2 : ;
u8 Flg3 : ;
}tFlg;
}uFlg;
uFlg ; //定于联合体变量

这个时候,Flg1占8个bit中的1个bit,也就是和char Flg中8个bit(一个字节)的第1个bit共享RAM空间,

对应Flg2占8个bit中的2个bit,也就是和char Flg中8个bit(一个字节)的第2个和第3个bit共享RAM空间,

同样的, 对应Flg3占8个bit中的5个bit,也就是和char Flg中8个bit(一个字节)的第4,5,6,7,8bit共享RAM空间,

改变Flg1,Flg2,Flg3,的值,char Flg的值也会做出相应的改变.

Flg1,Flg2,Flg3这是位域变量名,你可以随意起名,只要不违反编译器的相应规则就可以了.

怎么使用那?

1.先定义一个uFlg(我们在上文自己定义的联合体)变量

uFlg uF1,;

2.给变量赋值

如果我们定义了一个char 变量,应该是这样的:

char p;
p=;

同理:

uF1.tFlg.Flg1 =;

这样,我们就给Flg1赋值了,因为他只占用一个bit,所以只能是1或0,

如果想把Flg1,Flg2,Flg3都赋值为0;

 uF1.tFlg.Flg1 =;
uF1.tFlg.Flg2 =;
uF1.tFlg.Flg3 =;

uF1.Flg =;

结果是一样的,因为他们共享同一个字节的RAM空间,这样可以一次性清除所有的标志位.

这样写会有些麻烦,必竟名字太长了.可以用#define

#define time_2s uF1.tFlg.Flg1

这样我们直接用time_2s就可以了,不用再写uF1.tFlg.Flg1这么长了.

单片机,struct ,union定义标志,节约RAM的更多相关文章

  1. 关于C与C++的struct,union,enum用法差异

    对着代码说话: #include <stdio.h> #include <stdlib.h> struct test { int abc; }; enum _enum {A,B ...

  2. enum,struct,union类型使用和长度

    VC,C++ Builder和lcc三个编译器 间枚举类型enum长度的情况. 各种C编译器默认的字节对齐数不一致,要写通用的代码,经常就是使用 #pragma pack(1) ... #pragma ...

  3. 单片机内程序运行的时候ram空间是如何分配的?

    转自:http://blog.sina.com.cn/s/blog_a575eb9401014tam.html 单片机内程序运行的时候ram空间是如何分配的?我现对一个程序进行减少片内ram的使用的优 ...

  4. 51单片机数组的定义方法(code与data的作用)

    转自:http://blog.sina.com.cn/s/blog_94994f7b01010s1h.html 数组前不加“code”或“data”,则默认将数组存放在程序存储器中:code 指定数据 ...

  5. keil 编译器V6 定义函数在ram中运行-和在指定地址定义常量

    之前一直是用v5编译,编译速度慢,换成V6编译速度差不多快50% ,而且arm后期只维护v5编译器不在更新v5编译器.切换到V6编译器大势所趋,把之前v5且换到v6需要如下更改: 1. CMSIS包需 ...

  6. C/C++中struct/union/class内存对齐

    struct/union/class内存对齐原则有四个: 1).数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储 ...

  7. 单片机C语言中标志位的经典应用

    /* 本例程是C语言的位域操作示例 这里为什么位域结构体与联合体一起使用? -->因为这样定义后,即可以单独使用标志位 也可同时使用整个字节数据 主要应用:单片机C语言 好处:用标志位可以节省R ...

  8. C语言的struct/union字节对齐

    C语言的一大优势就是对内存空间的控制,当然,一般情况下对于开发人员来说都是透明的.看一个始终困扰初学者的问题:字节对齐! 先看四个重要的基本概念:1.数据类型自身的对齐值:对于char型数据,其自身对 ...

  9. 【转】单片机中volatile定义的作用详解

    传送门:http://www.eeworld.com.cn/mcu/2011/0411/article_3928.html 一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译 ...

随机推荐

  1. Net编译原理简单

    转载:http://blog.csdn.net/sundacheng1989/article/details/20941893 首先简单说一下计算机软件运行.所谓软件运行,就是一步一步做一些事情.计算 ...

  2. Hyperledger Fabric 1.0 学习搭建 (二)--- 源码及镜像文件处理

    2.1下载Fabric源码下载Fabric源码是因为要用到源码中提到的列子和工具, 工具编译需要用到go语言环境, 因此需要把源码目录放到$GOPATH下. 通过1.3中go的安装配置, $GOPAT ...

  3. 学习Road map Part 02 机器学习和图像识别

    方法:结合项目.竞赛.mentor计划

  4. Java对象表示方式1:序列化、反序列化的作用

    1.序列化是的作用和用途 序列化:把对象转换为字节序列的过程称为对象的序列化. 反序列化:把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存 ...

  5. Handler的简单使用介绍

    Handler在android程序开发中使用的非常频繁.我们知道android是不允许在子线程中更新UI的,这就需要借助Handler来实现,那么你是否想过为什么一定要这个这样子做呢?而且Handle ...

  6. redis持久化那些事(kēng)儿

    这是一篇包含了介绍性质和吐槽性质的日志.主要介绍一下我学习redis持久化时候被坑的经历.redis的使用介绍现在没有打算写,因为比较多,以我如此懒的性格...好吧,还是有点这方面想法的,不过一篇博客 ...

  7. Impala 加载Hive的UDF

    Impala的UDF有两种: Native Imapal UDF:使用C++开发的,性能极高,官方性能测试比第二种高出将近10倍 Hive的UDF:是Hive中的UDF,直接加载到Impala中,优点 ...

  8. PHP中使用substr()截取字符串出现中文乱码问题该怎么办

    一.使用mbstring扩展库的mb_substr()截取就不会出现乱码了. 可以用mb_substr()/mb_strcut()这个函数,mb_substr()/mb_strcut()的用法与sub ...

  9. 从零一起学Spring Boot之LayIM项目长成记(一) 初见 Spring Boot

    项目背景 之前写过LayIM的.NET版后端实现,后来又写过一版Java的.当时用的是servlet,websocket和jdbc.虽然时间过去很久了,但是仍有些同学在关注.偶然间我听说了Spring ...

  10. EasyPoi导入Excel

    EasyPoi的导出Excel功能和导入功能同样简单.我之前强调过,EasyPoi的原理本质就是Poi,正如MyBatis Plus的本质原理就是MyBatis. POI导入功能可以参考如下地址:ht ...