玩單片機、裸機開發(fā)的朋友,比如跟一些模塊配合聯(lián)調(diào)會遇到各種信號是否到位、成功等等狀態(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;
}
這些標志位的操作無非就是置位、清零,以及讀取三種方式。
但如代碼中這樣的操作方式在語句或語義表達上還是不夠直觀。
我經(jīng)常談到,代碼可以不寫注釋,不過你的每個變量、函數(shù)名稱等需要足夠的直觀,所以很多朋友習(xí)慣把這些標志封裝起來。
枚舉和位移
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;
}
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報投訴
-
單片機
+關(guān)注
關(guān)注
6076文章
45494瀏覽量
670260 -
C語言
+關(guān)注
關(guān)注
183文章
7644瀏覽量
145565 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4417瀏覽量
67499 -
變量
+關(guān)注
關(guān)注
0文章
616瀏覽量
29505 -
標志位
+關(guān)注
關(guān)注
0文章
2瀏覽量
6012
發(fā)布評論請先 登錄
相關(guān)推薦
熱點推薦
C語言程序中標識符號的意義
的熱情,但是在學(xué)校能學(xué)到最基礎(chǔ)的東西,一個程序的組成,緣由,如何實現(xiàn)等基本功能。之所以對C語言這門課程感興趣,因為從小我對任何一個電子產(chǎn)品愛不釋手,還有希望以后自己也能夠開發(fā)出一些有趣的東西。C
發(fā)表于 07-14 07:53
單片機C語言中標志位的經(jīng)典應(yīng)用,讓你快速學(xué)會單片機C語言
//====標志位應(yīng)用 定義聯(lián)合體實體====typedef union uFLG{ uint8 Flg ; //定義整形數(shù)據(jù) struct FLAG{ //位域定義
scanf在C語言中的作用
scanf在C語言中的作用? scanf是C語言中的輸入函數(shù),用于從標準輸入設(shè)備(如鍵盤)讀取數(shù)據(jù),并將其存儲到變量中。它是C
C語言中的socket編程基礎(chǔ)
Socket編程簡介 Socket是一種通信機制,允許程序之間進行通信。在C語言中,socket編程是網(wǎng)絡(luò)編程的基礎(chǔ)。通過使用socket,程序可以發(fā)送和接收數(shù)據(jù),實現(xiàn)不同計算機之間的通信
c語言中標志位的設(shè)置問題
評論