玩單片機(jī)、裸機(jī)開發(fā)的朋友,比如跟一些模塊配合聯(lián)調(diào)會(huì)遇到各種信號(hào)是否到位、成功等等狀態(tài),而這些信號(hào)大多都是bool類型,1個(gè)bit即可進(jìn)行標(biāo)識(shí)。
當(dāng)然,如果僅僅是幾個(gè)標(biāo)志,直接拿個(gè)uint8_t的整形來進(jìn)行標(biāo)識(shí)也不會(huì)影響什么,但如果特別多的話似乎就比較廢RAM了。然而,為了更好的管理這些標(biāo)志位等,有個(gè)如下幾種方式供大家更好的管理這些標(biāo)志位 :
兩種方式:唯一直接標(biāo)識(shí)。
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)志位的操作無非就是置位、清零,以及讀取三種方式。
但如代碼中這樣的操作方式在語句或語義表達(dá)上還是不夠直觀。
我經(jīng)常談到,代碼可以不寫注釋,不過你的每個(gè)變量、函數(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;
}
-
單片機(jī)
+關(guān)注
關(guān)注
6067文章
44991瀏覽量
650423 -
C語言
+關(guān)注
關(guān)注
180文章
7632瀏覽量
141725 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4381瀏覽量
64865 -
變量
+關(guān)注
關(guān)注
0文章
614瀏覽量
28951 -
標(biāo)志位
+關(guān)注
關(guān)注
0文章
2瀏覽量
5930
發(fā)布評(píng)論請(qǐng)先 登錄
C語言程序中標(biāo)識(shí)符號(hào)的意義
單片機(jī)C語言中標(biāo)志位的經(jīng)典應(yīng)用,讓你快速學(xué)會(huì)單片機(jī)C語言
C語言中必須要掌握的位運(yùn)算操作

評(píng)論