城市直播房产教育博客汽车
投稿投诉
汽车报价
买车新车
博客专栏
专题精品
教育留学
高考读书
房产家居
彩票视频
直播黑猫
投资微博
城市上海
政务旅游

分享几种管理C程序中标志位的方法

2月26日 眉梢欢投稿
  文章下方附学习资源,自助领取
  在嵌入式开发中,难免会涉及到非常多的标志位处理,特别是玩单片机、裸机开发的朋友,比如跟一些模块配合联调会遇到各种信号是否到位、成功等等状态,而这些信号大多都是bool类型,1个bit即可进行标识。
  当然,如果仅仅是几个标志,直接拿个uint8t的整形来进行标识也不会影响什么,但如果特别多的话似乎就比较废RAM了。
  然而,为了更好的管理这些标志位等,有个如下几种方式供大家更好的管理这些标志位:
  嵌入式物联网需要学的东西真的非常多,千万不要学错了路线和内容,导致工资要不上去!
  无偿分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!某鱼上买估计至少要好几十。
  点击这里找小助理0元领取:嵌入式物联网学习资料(头条)
  1hr位域直接标识
  采用位域是管理这些标志位比较直接且方便的方式,代码如下所示:1typedefuniontagSystemFlag2{3uint164struct5{6uint16tRun:1;7uint16tAlarm:1;8uint16tOnline:1;9uint16tTimerOver:1;10uint16tReserver:12;11}1213}uSystemF1415uSystemFlagunSystemF1617intmain(intargc,charargv〔〕){1819unSystemFlag。all0x00;系统标志清除2021unSystemFlag。bit。Run1;置位22unSystemFlag。bit。Alarm1;23unSystemFlag。bit。Online1;24unSystemFlag。bit。TimerOver1;2526unSystemFlag。bit。Run0;清零27unSystemFlag。bit。Alarm0;28unSystemFlag。bit。Online0;29unSystemFlag。bit。TimerOver0;3031return0;32}
  这些标志位的操作无非就是置位、清零,以及读取三种方式。
  但如代码中这样的操作方式在语句或语义表达上还是不够直观。
  我经常谈到,代码可以不写注释,不过你的每个变量、函数名称等需要足够的直观,所以很多朋友习惯把这些标志封装起来。
  2hr枚举移位
  为了更好的表达一般会对标志位进行进一步的封装,如下代码所示:1typedefenumtagFlag{2cEmRun0,3cEmAlarm,4cEmOnline,5cEmTimerOver6}emSystemF78uint16tSystemF9置位10voidSetFlag(emSystemFlagflag)11{12SystemFlag((uint16t)0x01)13}14清除15voidClrFlag(emSystemFlagflag)16{17SystemFlag(((uint16t)0x01)flag);18}19获得状态20uint8tGetFlag(emSystemFlagflag)21{22return(((SystemFlag(((uint16t)0x01)flag))!0)?true:false);23}2425intmain(intargc,charargv〔〕){2627SetFlag(cEmAlarm);2829if(GetFlag(cEmAlarm)true)30{31printf(ClrFlagr);32ClrFlag(cEmAlarm);33}34else35{36printf(SetFlagr);37SetFlag(cEmAlarm);38}39return0;40}
  当然,封装成函数是相对比较耗时的,不过代码也会更加的易懂,如果确实容忍不了函数封装带来的时间消耗,把函数修改为宏代码片段或者内敛函数(前提是编译器支持)也是可行的。
  3hr宏列表
  或许这里才是本文的重中之重
  以前跟大家介绍过,用宏自动化的生成各种代码片段,以使得代码更加的紧凑。当然可读性会相对降低一点,但对于重复性代码就不需要太多考虑了。1includestdio。h2includestdlib。h34typedefunsignedcharuint8t;5typedefunsignedintuint16t;6typedefsignedcharint8t;7typedefintint16t;89definetrue110definefalse0111213宏列表14defineTAGLIST(tag)15tag(Run)16tag(Alarm)17tag(Online)18tag(TimerOver)192021枚举处理22defineDEFINETAG(tag)tag,23enumFlag{24None0,25TAGLIST(DEFINETAG)26EmMAX27};28undefDEFINETAG2930位定义变量31uint16tSysFlag0x0000;323334通用方法定义35uint8tGetFlags(uint16tmask)36{37return((SysFlagmask)!0)?true:38}3940voidSetFlags(uint16tmask)41{42SysF43}4445voidClrFlags(uint16tmask)46{47SysF48}495051自动生成三类函数定义52defineFLAGOperater(flag)53uint8tgetflag(){54returnGetFlags(1flag);55}56voidsetflag(){57SetFlags(1flag);58}59voidclrflag(){60ClrFlags(1flag);61}6263反向函数关联64TAGLIST(FLAGOperater)6566intmain(intargc,charargv〔〕){6768setRun();69setAlarm();7071if(getAlarm()true)72{73printf(setr);74}75else76{77printf(clrr);78}7980return0;81}
  如果以前有过类似代码处理的朋友,应该看这段代码还是比较轻松的吧,如果有点生疏,可以一层一层展开了解。
  其主要的功能是,通过宏替换和代码拼接符号,自动的生成通用的代码片段。这样做的好处是,不再需要我们在代码中定义一大堆setflag、clrflag、getflag等函数。
  通过上面的代码当我们向TAGLIST宏中添加一个标识符,即可生成一系列相关的操作函数等。
  这样一方面可以及简化代码,同时也能避免一些人工编码带来的错误。
  END
  文章来源于最后一个bug,作者bug菌
  本文转载自嵌入式大杂烩,如有侵权,请联系删除
  原文链接:分享几种管理C程序中标志位的方法
  版权声明:本文来源网络,免费传达知识,版权归原作者所有。如涉及作品版权问题,请联系我进行删除。
投诉 评论 转载

放弃OKR?谷歌上演绩效管理大逃亡图片来源视觉中国文穆胜近日,国内一则消息甚嚣尘上,称谷歌放弃使用了20多年的内卷神器OKRs。此消息迅速引爆全网,在各大平台流传开来。对于这种小题大作的流量事……海南周刊茶树古韵海南周刊聚焦海南热带雨林国家公园野生古茶树在海南热带雨林国家公园的核心区域分布着许多野生古茶树,海南先民亦有制茶、饮茶的传统,历史上,海南茶叶也曾作为土贡送往朝廷。古树茶……男人过了60岁,做好这三件事,避免晚年孤独前言:男人过了60岁之后,有很多事情,我们一定要认真考虑。在这个时候已经进入老年状态,就算是还没有进入老年状态,也不再年轻,有些事情我们可以做,但是有很多事情,我们是没必……晚上9点!中国乒乓球传来坏消息陈梦孙颖莎很意外,球迷吐槽声一北京时间8月6日晚上9点,针对WTT常规挑战赛突尼斯站的赛况,国内媒体《新浪体育》进行了跟踪报道,在女单决赛中,国乒选手张瑞遇到了很大的麻烦,她面对14岁的张本美和,仅仅以4比……盘点新赛季能跻身超级球星行列的年轻球员华子ampampamp昔日辉煌的伟大球星总会衰老过气,但NBA也永远不缺崭露头角的超级新星。新赛季又将会有一批打出球星风采的新人涌现,他们其中一些人甚至可能会定义联盟下一个时代。这份榜单排除了那些已……碎花裙该扔了,当下流行水滴裙,女生出门必备,显高又抢镜是个漂亮的姐姐,第一眼就有这种感觉,喀嚓喀嚓喀嚓喀嚓喀嚓,披在肩上很性感的样子。即使不看小姐姐的衣着,也已经被她吸引住了。(威廉莎士比亚,《哈姆雷特》,《美丽名言》)(以英语发……谁真正拥有皇家马德里?皇家马德里是欧洲历史上最成功的俱乐部,拥有创纪录的14个洲际冠军头衔,202223赛季将有大量奖杯可供争夺,以增加他们的奖杯。然而,自世纪之交以来已经赢得七次欧洲冠军的皇……女排重炮手王一梅立功,助攻丁霞做教练,又帮41岁赵蕊蕊找新工说到王一梅、丁霞、赵蕊蕊相信很多球迷朋友不陌生,她们都是非常出色的中国女排运动员,职业生涯可以说都拿到了很不错的成绩,同时也都创造了属于她们的神话。经常关注中国女排的球迷都知道……建议中老年人早餐少吃馒头和稀饭?多吃这5样,低脂饱腹又健康65岁的张阿姨退休后一直保持运动的习惯。一日张阿姨在早间晨练的时候突发腹胀腹痛,同伴连忙把张阿姨送到了医院。经过了一番检查后得知她患有严重的胃炎。随后张阿姨在和医生的沟通……分享几种管理C程序中标志位的方法文章下方附学习资源,自助领取在嵌入式开发中,难免会涉及到非常多的标志位处理,特别是玩单片机、裸机开发的朋友,比如跟一些模块配合联调会遇到各种信号是否到位、成功等等状态,而……美媒重排NBA历史10大球星,张伯伦落选库里垫底榜首没悬念NBA休赛期除了交易新闻外,那就是看各大媒体给出各种榜单。这种榜单每个赛季都可能改变,因为NBA要的就是这种不断超越,这也是NBA魅力所在。近日,美媒就重排了NBA历史10大球……欧洲没有!日本没有!韩国也没有!这种现象唯独在中国足球上才有中国国家男子足球队于当地时间7月17日抵达日本名古屋,立即前往酒店休息,随后前往训练场进行第一次集训。不过,主帅扬科维奇安排的训练时间不长,强度也不是很大,并提醒队员们:做好与……
比淘宝联盟更简单的拉新活动已有人日入越升级越卡?MIUI14第三批来了,劝你看看小米11用户的反女性白带多痒是怎么回事OppoFindN2Flip评测小中见大生活污水氨氮排放标准鼠年法姓女孩名字集合法姓女孩名字大全揭秘职业插画师的桌面设备深广造句用深广造句大全精囊炎吃什么药能治疗精囊炎的常见疗法三个字的抖音网名女气质女人味三个字的抖音昵称转会动态国安签欧冠中场,莫伊塞斯离队未果,大连水货外援留队秦良玉在历史上有多厉害唯一被载入正史的一位女将军

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找