玩單片機、裸機開發(fā)的朋友,比如跟一些模塊配合聯(lián)調(diào)會遇到各種信號是否到位、成功等等狀態(tài),而這些信號大多都是bool類型,1個bit即可進行標(biāo)識。
當(dāng)然,如果僅僅是幾個標(biāo)志,直接拿個uint8_t的整形來進行標(biāo)識也不會影響什么,但如果特別多的話似乎就比較廢RAM了。然而,為了更好的管理這些標(biāo)志位等,有個如下幾種方式供大家更好的管理這些標(biāo)志位 :
兩種方式:唯一直接標(biāo)識。
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; //系統(tǒng)標(biāo)志清除
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;
}
這些標(biāo)志位的操作無非就是置位、清零,以及讀取三種方式。
但如代碼中這樣的操作方式在語句或語義表達上還是不夠直觀。
我經(jīng)常談到,代碼可以不寫注釋,不過你的每個變量、函數(shù)名稱等需要足夠的直觀,所以很多朋友習(xí)慣把這些標(biāo)志封裝起來。
枚舉和位移
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);
}
//獲得狀態(tài)
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;
}
-
單片機
+關(guān)注
關(guān)注
6043文章
44622瀏覽量
638667 -
C語言
+關(guān)注
關(guān)注
180文章
7614瀏覽量
137752 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4346瀏覽量
62983 -
變量
+關(guān)注
關(guān)注
0文章
613瀏覽量
28467 -
標(biāo)志位
+關(guān)注
關(guān)注
0文章
2瀏覽量
5830
發(fā)布評論請先 登錄
相關(guān)推薦
評論