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;}
微软或将在十月份推出全新无线键盘和鼠标
以基于赛灵思 FPGA 的硬件加速技术打造高速系统
五大常用的大功率LED芯片制作方法
特斯拉Semi计划用Supercharger为半自动驾驶卡车的原型车充电
索尼表示24小时不间断运行生产线也难以满足新iPhone相机需求量
c语言中标志位的设置问题
三菱重工维特斯离岸风电与中钢机械等四家公司签署合作备忘录
PCB设计技巧百问
苹果MacBook Pro正式上市:搭载M1芯片+P3广色域屏 发货日期2-3工作日
移动物联卡是什么卡?移动VS联通VS电信物联网部
解析天线的三种极化类型
Alphasense的PID-AH传感器应用于VOC气体检测
松鼠AI · 智适应教育首席科学家崔炜讲述了他们在智适应教育技术的实践与落地
的卢深视利用3D识别的优势提供“三维全栈”技术支撑
紫光国微发布了2019年业绩报告实现了营业收入34.30亿元
移动宽带这么便宜,你还在坚持用电信宽带?
拜登政府仍将计划允许一项来自此前特朗普政府的规定生效
M23传感器连接器多芯航空插头
化妆镜什么牌子好?别让细节毁了妆容
完美的PCB快速布局指南