首页 > 行业资讯 > 正文

玩单片机、裸机开发的朋友,比如跟一些模块配合联调会遇到各种信号是否到位、成功等等状态,而这些信号大多都是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; }

猜你喜欢