文在嵌入式开发中难免会涉及到很多flag的处理,尤其是玩单片机和裸机开发的朋友,比如用一些模块配合联调,会遇到到位、成功等各种信号,而这些信号大多是bool类型,可以用1位来标识。当然,如果只有几个flag的话,直接用一个uint8_t整数来标记也不会影响什么,但是如果太多了,就好像是在浪费RAM。但是,为了更好地管理这些标志等,有几种方法可以让你更好地管理这些标志:1.直接标识位域使用位域是一种更直接、更方便的管理这些标志的方法。代码如下所示:对这些标志位的操作无非就是置位、清零、读取。1typedefunion_tag_SystemFlag2{3uint16_tall;4结构5{6uint16_t运行:1;7uint16_t报警:1;8uint16_t在线:1;9uint16_tTimerOver:1;10uint16_t储备:12;121}位;;1415uSystemFlagunSystemFlag;1617intmain(intargc,char*argv[]){1819unSystemFlag.all=0x00;//系统标志清除2021unSystemFlag.bit.Run=1;//设置22unSystemFlag.bit.Alarm=1;23unSystemFlag.bit.Online=1;24unSystemFlag.bit.TimerOver=1;2526unSystemFlag.bit.Run=0;//清除27unSystemFlag.bit.Alarm=0;28unSystemFlag.bit.Online=0;29unSystemFlag.bit.TimerOver=0;3031return0;32}但是,代码中这样的操作方法在语句或语义表达上不够直观。Bug菌常说代码可以不写注释,但是你的每一个变量,函数名等都需要足够直观,所以很多朋友都习惯把这些标志封装起来。2.枚举+shift一般会将标志位进一步封装起来更好的表达,如下代码所示:当然封装成一个函数是比较耗时的,但是代码会更容易理解,如果真的能忍没有函数封装带来的时间消耗,将函数修改成宏代码片段或者内向函数也是可行的(当然前提是编译器支持)。1typedefenum_tag_Flag{2cEmRun=0,3cEmAlarm,4cEmOnline,5cEmTimerOver6}emSystemFlag;78uint16_t系统标志;9//设置10voidSetFlag(emSystemFlag标志)11{12SystemFlag|=((uint16_t)0x01;<1})<314//清除15voidClrFlag(emSystemFlag标志)16{17SystemFlag&=~(((uint16_t)0x01)<
