在嵌入式开发中,难免会涉及到非常多的标志位处理,特别是玩单片机、裸机开发的朋友,比如跟一些模块配合联调会遇到各种信号是否到位、成功等等状态,而这些信号大多都是bool类型,1个bit即可进行标识。
当然,如果仅仅是几个标志,直接拿个uint8_t的整形来进行标识也不会影响什么,但如果特别多的话似乎就比较废RAM了。然而,为了更好的管理这些标志位等,有个如下几种方式供大家更好的管理这些标志位 :1
位域直接标识
采用位域是管理这些标志位比较直接且方便的方式,代码如下所示:
1typedefunion_tag_SystemFlag 2{ 3uint16_tall; 4struct 5{ 6uint16_tRun:1; 7uint16_tAlarm:1; 8uint16_tOnline:1; 9uint16_tTimerOver:1; 10uint16_tReserver:12; 11}bit; 12 13}uSystemFlag; 14 15uSystemFlagunSystemFlag; 16 17intmain(intargc,char*argv[]){ 18 19unSystemFlag.all=0x00;//系统标志清除 20 21unSystemFlag.bit.Run=1;//置位 22unSystemFlag.bit.Alarm=1; 23unSystemFlag.bit.Online=1; 24unSystemFlag.bit.TimerOver=1; 25 26unSystemFlag.bit.Run=0;//清零 27unSystemFlag.bit.Alarm=0; 28unSystemFlag.bit.Online=0; 29unSystemFlag.bit.TimerOver=0; 30 31return0; 32}
这些标志位的操作无非就是置位、清零,以及读取三种方式。
但如代码中这样的操作方式在语句或语义表达上还是不够直观。
我经常谈到,代码可以不写注释,不过你的每个变量、函数名称等需要足够的直观,所以很多朋友习惯把这些标志封装起来。
2
枚举+移位
为了更好的表达一般会对标志位进行进一步的封装,如下代码所示:
1typedefenum_tag_Flag{ 2cEmRun=0, 3cEmAlarm, 4cEmOnline, 5cEmTimerOver 6}emSystemFlag; 7 8uint16_tSystemFlag; 9//置位 10voidSetFlag(emSystemFlagflag) 11{ 12SystemFlag|=((uint16_t)0x01)<< flag; 13} 14//清除 15voidClrFlag(emSystemFlagflag) 16{ 17SystemFlag&=~(((uint16_t)0x01)<< flag); 18} 19//获得状态 20uint8_tGetFlag(emSystemFlagflag) 21{ 22return(((SystemFlag&(((uint16_t)0x01)<< flag)) != 0)?true:false); 23} 24 25intmain(intargc,char*argv[]){ 26 27SetFlag(cEmAlarm); 28 29if(GetFlag(cEmAlarm)==true) 30{ 31printf("ClrFlag "); 32ClrFlag(cEmAlarm); 33} 34else 35{ 36printf("SetFlag "); 37SetFlag(cEmAlarm); 38} 39return0; 40}
当然,封装成函数是相对比较耗时的,不过代码也会更加的易懂,如果确实容忍不了函数封装带来的时间消耗,把函数修改为宏代码片段或者内敛函数(前提是编译器支持)也是可行的。
3
宏列表
或许这里才是本文的重中之重~
以前跟大家介绍过,用宏自动化的生成各种代码片段,以使得代码更加的紧凑。当然可读性会相对降低一点,但对于重复性代码就不需要太多考虑了。
1#include
如果以前有过类似代码处理的朋友,应该看这段代码还是比较轻松的吧,如果有点生疏,可以一层一层展开了解。
其主要的功能是,通过宏替换和代码拼接符号,自动的生成通用的代码片段。这样做的好处是,不再需要我们在代码中定义一大堆setflag、clrflag、getflag等函数。
通过上面的代码当我们向TAGLIST宏中添加一个标识符,即可生成一系列相关的操作函数等。
这样一方面可以及简化代码,同时也能避免一些人工编码带来的错误。
-
代码
+关注
关注
30文章
4732浏览量
68273 -
C程序
+关注
关注
4文章
254浏览量
35976
原文标题:教你3种管理C程序中标志位的方法
文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式微处理器】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论