zoukankan      html  css  js  c++  java
  • 单片机,struct ,union定义标志,节约RAM

    单片机的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这么长了.

  • 相关阅读:
    Ubuntu linux 关机、重启、注销 命令
    通过 URL 协议实现从 Safari 等浏览器中跳转打开你的 app
    (暴力调试控的福音)在ios iphone编程中使用封装的NSLog来打印调试信息
    mac终端关机命令
    iPhone5采用的下一代incell显示屏五大优势
    拉丁方阵
    OD使用教程16 调试篇16
    线性表14 数据结构和算法19
    带环单链表
    OD使用教程16 调试篇16
  • 原文地址:https://www.cnblogs.com/chenzhong-w/p/9651956.html
Copyright © 2011-2022 走看看