在嵌入式開發中,難免會涉及到非常多的標志位處理,特別是玩單片機、裸機開發的朋友,比如跟一些模塊配合聯調會遇到各種信號是否到位、成功等等狀態,而這些信號大多都是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)<13} 14//清除 15voidClrFlag(emSystemFlagflag) 16{ 17SystemFlag&=~(((uint16_t)0x01)<18} 19//獲得狀態 20uint8_tGetFlag(emSystemFlagflag) 21{ 22return(((SystemFlag&(((uint16_t)0x01)<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文章
4747瀏覽量
68349 -
C程序
+關注
關注
4文章
254瀏覽量
35996
原文標題:教你3種管理C程序中標志位的方法
文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論