玩單片機、裸機開發(fā)的朋友,比如跟一些模塊配合聯(lián)調會遇到各種信號是否到位、成功等等狀態(tài),而這些信號大多都是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; //系統(tǒng)標志清除
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;
}
這些標志位的操作無非就是置位、清零,以及讀取三種方式。
但如代碼中這樣的操作方式在語句或語義表達上還是不夠直觀。
我經常談到,代碼可以不寫注釋,不過你的每個變量、函數(shù)名稱等需要足夠的直觀,所以很多朋友習慣把這些標志封裝起來。
枚舉和位移
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;
}
-
單片機
+關注
關注
6067文章
44992瀏覽量
650682 -
C語言
+關注
關注
180文章
7632瀏覽量
141834 -
函數(shù)
+關注
關注
3文章
4381瀏覽量
64926 -
變量
+關注
關注
0文章
614瀏覽量
28967 -
標志位
+關注
關注
0文章
2瀏覽量
5930
發(fā)布評論請先 登錄
評論