成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

三種管理 C 程序中標(biāo)志位的方法,最后一種比較秀

開發(fā) 后端
在嵌入式開發(fā)中難免會(huì)涉及到非常多的標(biāo)志位處理,特別是玩單片機(jī)、裸機(jī)開發(fā)的朋友,比如跟一些模塊配合聯(lián)調(diào)會(huì)遇到各種信號(hào)是否到位、成功等等狀態(tài),而這些信號(hào)大多都是bool類型,1個(gè)bit即可進(jìn)行標(biāo)識(shí)。

正文

在嵌入式開發(fā)中難免會(huì)涉及到非常多的標(biāo)志位處理,特別是玩單片機(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)志位 :

1.位域直接標(biāo)識(shí)

采用位域是管理這些標(biāo)志位比較直接且方便的方式,代碼如下所示:

這些標(biāo)志位的操作無非就是置位,清零、以及讀取三種方式。

1typedef union _tag_SystemFlag
2{
3 uint16_t all;
4 struct
5 {
6 uint16_t Run :1;
7 uint16_t Alarm :1;
8 uint16_t Online :1;
9 uint16_t TimerOver :1;
10 uint16_t Reserver :12;
11 }bit;
12
13} uSystemFlag;
14
15uSystemFlag unSystemFlag;16
17int main(int argc, char *argv[]) {
18
19 unSystemFlag.all = 0x00; //系統(tǒng)標(biāo)志清除
20
21 unSystemFlag.bit.Run = 1; //置位
22 unSystemFlag.bit.Alarm = 1;
23 unSystemFlag.bit.Online = 1;
24 unSystemFlag.bit.TimerOver = 1;
25
26 unSystemFlag.bit.Run = 0; //清零
27 unSystemFlag.bit.Alarm = 0;
28 unSystemFlag.bit.Online = 0;
29 unSystemFlag.bit.TimerOver = 0;
30
31 return 0;
32}

但如代碼中這樣的操作方式在語句或語義表達(dá)上還是不夠直觀。

bug菌經(jīng)常談到,代碼可以不寫注釋,不過你的每個(gè)變量、函數(shù)名稱等需要足夠的直觀,所以很多朋友習(xí)慣把這些標(biāo)志封裝起來。

2.枚舉+移位

為了更好的表達(dá)一般會(huì)對(duì)標(biāo)志位進(jìn)行進(jìn)一步的封裝,如下代碼所示:

當(dāng)然封裝成函數(shù)是相對(duì)比較耗時(shí)的,不過代碼也會(huì)更加的易懂,如果確實(shí)容忍不了函數(shù)封裝帶來的時(shí)間消耗,把函數(shù)修改為宏代碼片段或者內(nèi)斂函數(shù)(當(dāng)然前提是編譯器支持)也是可行的。

1typedef enum _tag_Flag {
2cEmRun = 0,
3cEmAlarm,
4cEmOnline,
5cEmTimerOver
6}emSystemFlag;
7
8uint16_t SystemFlag ;
9//置位
10void SetFlag(emSystemFlag flag)
11{
12 SystemFlag |= ((uint16_t)0x01) << flag;
13}
14//清除
15void ClrFlag(emSystemFlag flag)
16{
17 SystemFlag &= ~(((uint16_t)0x01) << flag);
18}
19//獲得狀態(tài)
20uint8_t GetFlag(emSystemFlag flag)
21{
22 return (((SystemFlag & (((uint16_t)0x01) << flag)) != 0)? true:false);
23}
24
25int main(int argc, char *argv[]) {
26
27 SetFlag(cEmAlarm);
28
29 if(GetFlag(cEmAlarm) == true)
30 {
31 printf("ClrFlag\r\n");
32 ClrFlag(cEmAlarm);
33 }
34 else
35 {
36 printf("SetFlag\r\n");
37 SetFlag(cEmAlarm);
38 }
39 return 0;
40}

3.宏列表

或許這里才是本文的重中之重~

以前跟大家介紹過,用宏自動(dòng)化的生成各種代碼片段,以使得代碼更加的緊湊。當(dāng)然可讀性會(huì)相對(duì)降低一點(diǎn),但對(duì)于重復(fù)性代碼就不需要太多考慮了。

如果以前有過類似代碼處理的朋友,應(yīng)該看這段代碼還是比較輕松的吧,如果有點(diǎn)生疏,可以一層一層展開了解。

1#include <stdio.h>
2#include <stdlib.h>
3
4typedef unsigned char uint8_t;
5typedef unsigned int uint16_t;
6typedef signed char int8_t;
7typedef int int16_t;
8
9#define true 1
10#define false 0
11
12
13//宏列表
14#define TAG_LIST(tag) \
15tag(Run)\
16tag(Alarm)\
17tag(Online)\
18tag(TimerOver)
19
20
21//枚舉處理
22#define DEFINE_TAG(_tag) _tag,
23enum Flag {
24None = 0,
25TAG_LIST(DEFINE_TAG)
26EmMAX
27};
28#undef DEFINE_TAG
29
30//位定義變量
31uint16_t SysFlag = 0x0000;
32
33
34//通用方法定義
35uint8_t GetFlags(uint16_t mask)
36{
37 return ((SysFlag & mask) != 0)? true:false;
38}
39
40void SetFlags(uint16_t mask)
41{
42 SysFlag |= mask;
43}
44
45void ClrFlags(uint16_t mask)
46{
47 SysFlag &= ~mask;
48}
49
50
51//自動(dòng)生成三類函數(shù)定義
52#define FLAG_Operater(flag) \
53uint8_t get##flag() {\
54return GetFlags(1 << flag);\
55}\
56void set##flag() {\
57SetFlags(1 << flag);\
58}\
59void clr##flag() {\
60ClrFlags(1 << flag);\
61}
62
63//反向函數(shù)關(guān)聯(lián)
64TAG_LIST(FLAG_Operater)
65
66int main(int argc, char *argv[]) {
67
68 setRun();
69 setAlarm();
70
71 if(getAlarm() == true)
72 {
73 printf("set \r\n");
74 }
75 else
76 {
77 printf("clr \r\n");
78 }
79
80 return 0;
81}

其主要的功能就是通過宏替換和代碼拼接符號(hào),自動(dòng)的生成通用的代碼片段,這樣做的好處就是不再需要我們?cè)诖a中定義一大堆setflag、clrflag、getflag等函數(shù)。

通過上面的代碼當(dāng)我們向TAGLIST宏中添加一個(gè)標(biāo)識(shí)符,即可生成一系列相關(guān)的操作函數(shù)等。

這樣一方面可以及簡(jiǎn)化代碼,同時(shí)也避免一些人工編碼帶來的錯(cuò)誤。

責(zé)任編輯:龐桂玉 來源: C語言與C++編程
相關(guān)推薦

2009-07-30 16:27:33

C#比較時(shí)間

2010-07-19 14:43:21

SQL Server查

2018-01-24 15:50:16

2012-03-26 12:23:25

JavaSwing

2010-06-12 11:03:02

UML應(yīng)用

2022-08-02 13:56:37

C開發(fā)段錯(cuò)誤

2025-02-10 08:43:31

Java異步編程

2009-06-09 16:53:22

Java Swing處理方法比較

2024-04-24 14:46:40

人工智能編碼助手

2024-08-13 08:25:16

C#外部程序方式

2009-08-26 18:10:44

C# using的用法

2022-04-28 07:26:17

PythonDocker容器

2009-07-08 12:56:32

編寫Servlet

2010-06-28 17:43:44

SQL Server

2023-02-24 16:45:02

2024-01-02 07:56:13

ReactuseEffect數(shù)據(jù)驅(qū)動(dòng) UI

2024-05-27 00:20:00

2012-08-07 10:02:06

JSP

2014-07-30 17:10:38

LVS集群負(fù)載均衡

2009-07-03 18:32:18

JSP頁面跳轉(zhuǎn)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 中文字幕在线视频精品 | 日日夜夜精品视频 | 日韩精品成人免费观看视频 | av手机在线免费观看 | 玖玖爱365| 亚洲免费在线观看 | 欧美精品在线一区二区三区 | 免费永久av| 中文字幕第二区 | 亚洲第一区国产精品 | 国产精品久久久久永久免费观看 | 久久丝袜 | 国产欧美精品一区二区三区 | 精品在线一区 | 在线成人av | 成人午夜精品 | 午夜视频在线观看一区二区 | 亚洲五码在线 | 欧美a区 | 人人草天天草 | 国产原创视频 | 最新国产在线 | 日韩av黄色 | 国产精品久久久久久久久久久久久 | 日韩免费视频一区二区 | 男人天堂手机在线视频 | 国产精品一区二区三区久久久 | 五月激情综合 | 日本电影免费完整观看 | 日韩精品在线看 | 欧美精品一区二区在线观看 | 日韩午夜网站 | 欧美一a| 天天综合天天 | 中文字幕一区二区三区精彩视频 | 免费在线播放黄色 | 一区二区av | 成人一级视频在线观看 | 亚洲国产成人av好男人在线观看 | www日韩高清| 国产96在线|