经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C 语言 » 查看文章
单片机,struct ,union定义标志,节约RAM
来源:cnblogs  作者:晨钟_王  时间:2018/9/25 20:33:21  对本文有异议

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

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

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

  1. 1 typedef union uFLG{
  2. 2 char Flg ; //定义整形数据 联合体成员
  3. 3 struct FLAG{ //位域定义
  4. 4 u8 Flg1 : 1;
  5. 5 u8 Flg2 : 1;
  6. 6 u8 Flg3 : 1;
  7. 7 u8 Flg4 : 1;
  8. 8 u8 Flg5 : 1;
  9. 9 u8 Flg6 : 1;
  10. 10 u8 Flg7 : 1;
  11. 11 u8 Flg8 : 1;
  12. 12 }tFlg;
  13. 13 }uFlg;
  14. 14
  15. 15 uFlg uF1; //定义联合体变量

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

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

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

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

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

也可以这样定义:

  1. 1 typedef union uFLG{
  2. 2 char Flg ; //定义整形数据 联合体成员
  3. 3 struct FLAG{ //位域定义
  4. 4 u8 Flg1 : 1;
  5. 5 u8 Flg2 : 2;
  6. 6 u8 Flg3 : 5;
  7. 7 }tFlg;
  8. 8 }uFlg;
  9. 9 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(我们在上文自己定义的联合体)变量

 1 uFlg uF1,; 

2.给变量赋值

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

  1. char p;
  2. p=65;

同理:

 uF1.tFlg.Flg1 =1; 

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

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

  1. 1 uF1.tFlg.Flg1 =0;
  2. 2 uF1.tFlg.Flg2 =0;
  3. 3 uF1.tFlg.Flg3 =0;

  1. uF1.Flg =0;

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

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

   #define time_2s uF1.tFlg.Flg1   

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

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号