c语言中标志位的设置问题

描述

玩单片机、裸机开发的朋友,比如跟一些模块配合联调会遇到各种信号是否到位、成功等等状态,而这些信号大多都是bool类型,1个bit即可进行标识。

当然,如果仅仅是几个标志,直接拿个uint8_t的整形来进行标识也不会影响什么,但如果特别多的话似乎就比较废RAM了。然而,为了更好的管理这些标志位等,有个如下几种方式供大家更好的管理这些标志位 :

两种方式:唯一直接标识。

typedef union _tag_SystemFlag
 {
     uint16_t all;
     struct 
     {
        uint16_t Run         :1;
        uint16_t Alarm       :1;
       uint16_t Online      :1;
        uint16_t TimerOver   :1;
        uint16_t Reserver    :12;
    }bit;

} uSystemFlag;

uSystemFlag  unSystemFlag;

int main(int argc, char *argv[]) {

    unSystemFlag.all = 0x00; //系统标志清除

    unSystemFlag.bit.Run       = 1; //置位
    unSystemFlag.bit.Alarm     = 1;
    unSystemFlag.bit.Online    = 1;
    unSystemFlag.bit.TimerOver = 1;

    unSystemFlag.bit.Run       = 0; //清零
    unSystemFlag.bit.Alarm     = 0;
    unSystemFlag.bit.Online    = 0;
    unSystemFlag.bit.TimerOver = 0;

    return 0;
}

这些标志位的操作无非就是置位、清零,以及读取三种方式。

但如代码中这样的操作方式在语句或语义表达上还是不够直观。

我经常谈到,代码可以不写注释,不过你的每个变量、函数名称等需要足够的直观,所以很多朋友习惯把这些标志封装起来。

枚举和位移

typedef enum _tag_Flag {
cEmRun = 0,
cEmAlarm,
cEmOnline,
cEmTimerOver
}emSystemFlag;

uint16_t SystemFlag ;
//置位
void SetFlag(emSystemFlag flag)
{
    SystemFlag |=  ((uint16_t)0x01) << flag;
}
//清除
void ClrFlag(emSystemFlag flag)
{
   SystemFlag &=  ~(((uint16_t)0x01) << flag);
}
//获得状态
uint8_t  GetFlag(emSystemFlag flag)
{
    return (((SystemFlag & (((uint16_t)0x01) << flag)) != 0)? true:false);  
}

int main(int argc, char *argv[]) {

    SetFlag(cEmAlarm);

    if(GetFlag(cEmAlarm) == true)
    {
        printf("ClrFlagrn");
        ClrFlag(cEmAlarm);
    }
    else
    {
        printf("SetFlagrn");
        SetFlag(cEmAlarm);
    }
    return 0;
}
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分