单片机,struct ,union定义标志,节约RAM
单片机的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的更多相关文章
- 关于C与C++的struct,union,enum用法差异
对着代码说话: #include <stdio.h> #include <stdlib.h> struct test { int abc; }; enum _enum {A,B ...
- enum,struct,union类型使用和长度
VC,C++ Builder和lcc三个编译器 间枚举类型enum长度的情况. 各种C编译器默认的字节对齐数不一致,要写通用的代码,经常就是使用 #pragma pack(1) ... #pragma ...
- 单片机内程序运行的时候ram空间是如何分配的?
转自:http://blog.sina.com.cn/s/blog_a575eb9401014tam.html 单片机内程序运行的时候ram空间是如何分配的?我现对一个程序进行减少片内ram的使用的优 ...
- 51单片机数组的定义方法(code与data的作用)
转自:http://blog.sina.com.cn/s/blog_94994f7b01010s1h.html 数组前不加“code”或“data”,则默认将数组存放在程序存储器中:code 指定数据 ...
- keil 编译器V6 定义函数在ram中运行-和在指定地址定义常量
之前一直是用v5编译,编译速度慢,换成V6编译速度差不多快50% ,而且arm后期只维护v5编译器不在更新v5编译器.切换到V6编译器大势所趋,把之前v5且换到v6需要如下更改: 1. CMSIS包需 ...
- C/C++中struct/union/class内存对齐
struct/union/class内存对齐原则有四个: 1).数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储 ...
- 单片机C语言中标志位的经典应用
/* 本例程是C语言的位域操作示例 这里为什么位域结构体与联合体一起使用? -->因为这样定义后,即可以单独使用标志位 也可同时使用整个字节数据 主要应用:单片机C语言 好处:用标志位可以节省R ...
- C语言的struct/union字节对齐
C语言的一大优势就是对内存空间的控制,当然,一般情况下对于开发人员来说都是透明的.看一个始终困扰初学者的问题:字节对齐! 先看四个重要的基本概念:1.数据类型自身的对齐值:对于char型数据,其自身对 ...
- 【转】单片机中volatile定义的作用详解
传送门:http://www.eeworld.com.cn/mcu/2011/0411/article_3928.html 一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译 ...
随机推荐
- 如何深入理解一套MQ消息中间件
怎样算是理解了一套MQ中间件呢?原来一知半解的我列了几个维度:demo跑起来,理解其投递次数的语义,理解其事务的特性等等.这是一种角度,但总有种看山不是山的一知半解的感觉.再问一层,比如为什么Kafk ...
- php红包生成随机算法
一.适用场景 红包总金额X,分配成Y个红包,每个红包随机金额. 二.生成算法 /** * 红包生成算法 * @param $money 总金额 * @param $number 红包数量 * @par ...
- mongodb 备份、还原、导入、导出
mongodump备份数据库 常用的备份命令格式 mongodump -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -o 文件存在路径 如果想导出所有数据库,可以去掉-d - ...
- (二)给Centos配置网络以及使用xshell远程连接Centos
好吧,我对网络协议以及ip配置知识的匮乏,让我在这里折腾了将近一天才搞定.可以说基本上网上遇到的问题我都遇到了.在这里,记下正确的步骤来给Centos配置网络.希望以后少走弯路. 首先我要说明的是,我 ...
- 移动端 Touch 事件
在移动端页面开发时,常常会用到touch事件,比如左滑右滑的轮播等.常用的触摸事件有touchstart,touchmove,touchend. 每个事件包含下面三个用于跟踪虎摸的属性: touche ...
- Docker创建镜像文件并在容器中运行
1.如何创建镜像文件 首先找到Docker ToolBox安装的路径,在路径下直接新建Dockerfile文件 在Dockerfile文件里写入的内容为: FROM docker/whalesay:l ...
- 前端面试题(copy)
前端开发面试知识点大纲: HTML&CSS: 对Web标准的理解.浏览器内核差异.兼容性.hack.CSS基本功:布局.盒子模型.选择器优先级及使用.HTML5.CSS3.移动端适应. Jav ...
- HDU 2021 发工资咯:)(最水贪心)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=2021 发工资咯:) Time Limit: 2000/1000 MS (Java/Others) ...
- 微信小程序开发——进阶篇
由于项目的原因,最近的工作一直围绕着微信小程序.现在也算告一段落,是时候整理一下这段时间的收获了.我维护的小程序有两个,分别是官方小程序和一个游戏为主的小程序.两个都是用了wepy进行开发,就是这个: ...
- STM32之系统时钟
转载:http://www.openedv.com/posts/list/302.htm 时钟系统是处理器的核心,所以在学习STM32所有外设之前,认真学习时钟系统是必要的,有助于深入理解STM32. ...