c/c++语言开发共享单片机,struct ,union定义标志,节约RAM

单片机的RAM是非常少的,像新唐,STC,合泰等一些国产的51单片机,RAM 512 byte,1k,2k,非常常见, 有时候我们的串口接收一串数据,或AD连续采集,这些数据是不能放到 flash 里的,没办法,只能想法节约一些变量空间了. 标志位很多时候只有两种状态,就像bool型一样,真/假,这 …

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

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

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

 1 typedef union uflg{  2     char flg ;     //定义整形数据           联合体成员  3     struct flag{        //位域定义  4         u8   flg1   : 1;  5         u8   flg2   : 1;  6         u8   flg3   : 1;  7         u8   flg4   : 1;  8         u8   flg5   : 1;  9         u8   flg6   : 1; 10         u8   flg7   : 1; 11         u8   flg8   : 1; 12     }tflg;   13 }uflg; 14  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 typedef union uflg{ 2     char flg ;     //定义整形数据           联合体成员 3     struct flag{        //位域定义 4         u8   flg1   : 1; 5         u8   flg2   : 2; 6         u8   flg3   : 5; 7     }tflg;   8 }uflg; 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 变量,应该是这样的:

char p; p=65;

同理:

 uf1.tflg.flg1 =1; 

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

如果想把flg1,flg2,flg3都赋值为0;

1 uf1.tflg.flg1 =0; 2 uf1.tflg.flg2 =0; 3 uf1.tflg.flg3 =0;

uf1.flg =0;

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

这样写会有些麻烦,必竟免费精选名字大全太长了.可以用#define

   #define time_2s uf1.tflg.flg1   

这样我们直接用time_2s就可以了,不用再写uf1.tflg.flg1这么长了.

 

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/607902.html

(0)
上一篇 2021年5月14日
下一篇 2021年5月14日

精彩推荐