www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁(yè) > 公眾號(hào)精選 > 嵌入式大雜燴
[導(dǎo)讀]前篇 《由static來(lái)談?wù)勀K封裝》 基本實(shí)現(xiàn)了對(duì)外隱藏屬性,隱藏局部模塊函數(shù),開(kāi)放接口的功能。對(duì)于這個(gè)話題還有些點(diǎn)沒(méi)有深入探討:為什么要這樣做?以及這樣做的好處是什么?

前篇 《由static來(lái)談?wù)勀K封裝》 基本實(shí)現(xiàn)了對(duì)外隱藏屬性,隱藏局部模塊函數(shù),開(kāi)放接口的功能。對(duì)于這個(gè)話題還有些點(diǎn)沒(méi)有深入探討:為什么要這樣做?以及這樣做的好處?;蛟S很多剛剛開(kāi)始用C或者其他面向?qū)ο缶幊陶Z(yǔ)言(比如C++)的小伙伴們,常常在一個(gè)項(xiàng)目里為了圖省事,整了很多全局對(duì)象、全局變量滿天飛,這樣做其實(shí)是有很多弊端,本文來(lái)聊聊這個(gè)話題。


先談?wù)勅肿兞康奶攸c(diǎn)

全局變量(Global Variables):在計(jì)算機(jī)編程語(yǔ)言中,所謂全局變量是指具有全局作用域的變量,這意味著它在整個(gè)程序中是可見(jiàn)的,因此是可訪問(wèn)的。所謂可訪問(wèn),是指全局可讀、全局可寫(xiě)。在編譯語(yǔ)言中,全局變量通常是靜態(tài)變量,其范圍(生命周期)是程序的整個(gè)運(yùn)行時(shí)。當(dāng)然解釋性語(yǔ)言除外,解釋性語(yǔ)言包括命令行解釋器(比如python, Java script,shell等)中,全局變量通常在聲明時(shí)由解釋器動(dòng)態(tài)分配,這是由于解釋性語(yǔ)言是讀取>解釋>執(zhí)行模式,不像編譯性語(yǔ)言,運(yùn)行前可預(yù)知變量屬性,解釋性語(yǔ)言讀取解釋前無(wú)從獲取變量屬性。

在C/C++編程語(yǔ)言中,全局變量的這種全局可見(jiàn)性特點(diǎn),濫用全局變量會(huì)讓代碼表現(xiàn)當(dāng)相當(dāng)邪惡!如果使用全局變量,就意味著下面這些場(chǎng)景的存在:

  • 實(shí)際代碼可能有很多地方在讀、在寫(xiě)全局變量
  • 全局變量在多線程或多任務(wù)間共享
  • 全局變量在常規(guī)代碼和中斷服務(wù)程序間共享

為啥說(shuō)全局變量很邪惡?

單片機(jī)裸機(jī)編程

或許你會(huì)說(shuō),我就這樣用?咋了?軟件也跑的很好???來(lái)看看這個(gè)場(chǎng)景:

一個(gè)超字寬的變量(比如16位單片機(jī),字寬即為16位),正被一個(gè)常規(guī)代碼在寫(xiě)變量數(shù)據(jù)域時(shí)且還沒(méi)寫(xiě)完,啪嘰,來(lái)了個(gè)中斷!中斷一來(lái),CPU趕緊把手里的活兒停下來(lái),奔過(guò)去處理中斷了,不巧在中斷函數(shù)里,該變量因業(yè)務(wù)需求有需要寫(xiě)這個(gè)變量有經(jīng)驗(yàn)的不這么寫(xiě),僅為了方便說(shuō)明:

舉個(gè)栗子,還是以之前文章的傳感器為例,實(shí)際應(yīng)用中傳感器可能是下面這樣的數(shù)據(jù)結(jié)構(gòu)來(lái)描述:

#ifndef?_SENSOR_H_
#define?_SENSOR_H_
typedef?struct?_t_sensor{
???/*?測(cè)量值與測(cè)量范圍及單位有關(guān)?*/
???float?value;
???
???/*?測(cè)量范圍,根據(jù)采樣值映射??*/
???float?upper_range;
???float?lower_range;
???/*?溫度單位?*/
???
unsiged char unit;
}T_SENSOR;

/*假定是一個(gè)溫度測(cè)量產(chǎn)品*/
extern?T_SENSOR?temperature;

#endif?_SENSOR_H_


假定這個(gè)傳感器數(shù)據(jù)結(jié)構(gòu)有這樣一些被訪問(wèn)的可能:

  1. 上位機(jī)會(huì)改寫(xiě)測(cè)量數(shù)據(jù)的范圍及單位,串口通信中斷服務(wù)程序直接寫(xiě)這個(gè)全局變量中的上下限數(shù)據(jù)域
  2. LCD操作界面可改寫(xiě)溫度上下限范圍。
  3. 測(cè)量更新模塊根據(jù)當(dāng)前范圍及單位配置,將傳感器采集到的數(shù)據(jù)映射為測(cè)量值。

這些需求用例,用圖描述一下:


比如用戶操作HMI界面正改寫(xiě)溫度范圍,而此時(shí)遠(yuǎn)程上位機(jī)也正改寫(xiě)溫度范圍,按上面這個(gè)做法,可能出現(xiàn)哪些邪惡的后果呢?

  1. 通過(guò)LCD界面寫(xiě)入上限為300.5(假定原下限為0),此時(shí)遠(yuǎn)程串口報(bào)文收到,程序直接在中斷服務(wù)程序?qū)⒎秶薷臑椋?100,200.5),此時(shí)中斷返回,用戶可能接著修改下限為-200,則最終設(shè)備內(nèi)的溫度范圍可能既不是(-100,200.5)也不是(-200,300.5),而可能是(-200,200.5)。這是一個(gè)易理解的數(shù)據(jù)混亂的場(chǎng)景。
  2. 現(xiàn)實(shí)中如果使用的單片機(jī)是8位/16位單片機(jī),一條指令無(wú)法完成操作一個(gè)32位立即數(shù),有可能才完成一個(gè)浮點(diǎn)數(shù)中某幾個(gè)字節(jié),此時(shí)就被中斷打斷寫(xiě)入200,然后中斷返回后繼續(xù)寫(xiě)入剩下字節(jié),數(shù)據(jù)可能會(huì)變得非常詭異!利用http://www.speedfly.cn/tools/hexconvert/ 在線工具轉(zhuǎn)換浮點(diǎn)數(shù)到16進(jìn)制:
0x43964000?/*?浮點(diǎn)數(shù)300.5的16進(jìn)制*/
0x43488000?/*?浮點(diǎn)數(shù)200.5的16進(jìn)制*/


假定中斷進(jìn)入時(shí),HMI界面程序?qū)懭肓?x4396前兩個(gè)字節(jié),中斷返回時(shí),上限改寫(xiě)為200.5(0x43488000),此時(shí)繼續(xù)執(zhí)行后面兩個(gè)字節(jié)寫(xiě)入,則上限變成為(0x43484000),來(lái)看看這個(gè)數(shù)是多大?變成了200.25,這是不是很邪惡?


或許有的朋友會(huì)說(shuō),可以在LCD寫(xiě)范圍時(shí)關(guān)中斷嘛。誠(chéng)然,可以這么做:

void?hmi_operate()
{
????/*關(guān)中斷*/
????_disable_interrupt();
????/*改寫(xiě)溫度范圍*/
????....
????/*開(kāi)中斷*/
????_enable_interrupt();
}


但是如果這個(gè)全局變量有很多地方在改寫(xiě),為了數(shù)據(jù)安全,勢(shì)必就到處開(kāi)/關(guān)中斷,這樣做的壞處:

  • 經(jīng)常開(kāi)關(guān)中斷,勢(shì)必影響中斷響應(yīng),會(huì)有概率丟失異步中斷處理(比如串口按字節(jié)接收中斷,可能就會(huì)漏收字節(jié)),程序不健壯,工作不穩(wěn)定。
  • 到處訪問(wèn)改寫(xiě),不易調(diào)試,群魔亂舞,代碼也不易維護(hù)。想加點(diǎn)東西,改點(diǎn)東西可能隨處都是坑,一不小心就掉坑里去了!
  • 初學(xué)者甚至不會(huì)用struct將相關(guān)的數(shù)據(jù)包在一起,其結(jié)果是代碼里到處都是基本類型的全局變量。一些簡(jiǎn)單的業(yè)務(wù)邏輯實(shí)現(xiàn)變成一個(gè)復(fù)雜的代碼,數(shù)據(jù)信息流向一團(tuán)亂麻。

裸機(jī)程序策略

對(duì)于上面這樣一個(gè)應(yīng)用場(chǎng)景,怎么解決這種混亂的現(xiàn)象呢。這里分享一下我的思路,這里將主要的串口以及測(cè)量模塊的設(shè)計(jì)思路用UML圖描述一下大體思路:


如此一來(lái),外部就看不到全局變量了,只需要調(diào)用對(duì)應(yīng)的set/get方法即可實(shí)現(xiàn)讀寫(xiě)訪問(wèn),由于是裸機(jī)前后臺(tái)程序,數(shù)據(jù)流向就變的非常清晰了。main函數(shù)的主循環(huán)大致就可能是這樣:

void?main(void)
{
???/*模塊初始化*/
???init_uart();
???init_temperature();
???....
???
???while(1)
???{
???????interprete_uart();
???????/*可能是周期性調(diào)用*/
???????if(timer_100ms)
???????{
??????????timer_100ms?=?0;
??????????update_temperature();
???????}????????
?????????
???????....
???}???
}


那么uart協(xié)議解析要怎么做呢?

void?interprete_uart(void)
{
????if(rx_msg.flag)
????{
????????rx_msg.flag?=?false;
????????/*報(bào)文完整性檢查*/
????????...
????????????
????????/*設(shè)置溫度配置*/
????????set_upper_range(xxx);
????????set_lower_range(xxx);
????????set_unit(xxx);
????}
????
????if(tx_msg.flag)
????{
????????tx_msg.flag?=?false;
????????start_send();
????}
}

static?start_send(T_UART_MSG?*pMsg)
{
????/*負(fù)責(zé)底層操作,啟動(dòng)中斷傳輸*/
}

/*提供應(yīng)答數(shù)據(jù)接口*/
void?reply_temperature_setting(T_SENSOR?sensor)
{
????/*解析傳入?yún)?shù)并封裝應(yīng)答報(bào)文*/
}


如此一來(lái),數(shù)據(jù)流向?qū)⒆兊煤芮逦诮邮盏綌?shù)據(jù)更新范圍配置時(shí),也無(wú)需開(kāi)關(guān)中斷了,從應(yīng)用角度幾乎見(jiàn)不到全局變量。當(dāng)然這樣做的代價(jià)就是會(huì)增加一些棧開(kāi)銷(xiāo)。但是這種代價(jià)還是值得的。

對(duì)于測(cè)量模塊的set函數(shù)思路稍做說(shuō)明:

int?set_upper_range(float?range)
{
????T_SENSOR?temp?=?temperature;
????temp.upper_range?=?range;
????/*實(shí)現(xiàn)范圍合理性檢查*/
????if(check_range(temp))
????{
????????/*兩個(gè)結(jié)構(gòu)體變量可以直接賦值*/
????????temperature?=?temp;
????????return?0;
????}
????else
????{
???????return?-1;
????}
}

int?set_unit(E_UNIT?unit)
{
????if(unit>E_UNIT_F)
????????return?-1;
????adjust_range(&temperature,unit);
????temperature.unit?=?unit;????
}


上述代碼旨在分享個(gè)人的一些思路,其中或有不夠嚴(yán)謹(jǐn)?shù)牡胤?,但通過(guò)這樣的設(shè)計(jì)思路,應(yīng)能大幅度遠(yuǎn)離滿天飛的全局變量。

多任務(wù)/多線程環(huán)境

上面描述其實(shí)本質(zhì)上描述了裸機(jī)程序里,普通模式運(yùn)行程序與中斷服務(wù)程序?qū)τ谂R界資源的競(jìng)爭(zhēng)。事實(shí)上現(xiàn)在不管是單片機(jī),還是處理器,大多都是基于一個(gè)操作系統(tǒng)進(jìn)行應(yīng)用開(kāi)發(fā)。甚至還可能是多核芯片,這里就存在并發(fā)競(jìng)爭(zhēng)訪問(wèn)資源的問(wèn)題。

臨界資源:各任務(wù)/線程采取互斥的方式,實(shí)現(xiàn)共享的資源稱作臨界資源。屬于臨界資源的硬件串口打印、顯示等,軟件有消息緩沖隊(duì)列、變量、數(shù)組、緩沖區(qū)等。多任務(wù)/線程間應(yīng)采取互斥方式,從而實(shí)現(xiàn)對(duì)這種資源的共享。

多任務(wù)/多線程情況下在寫(xiě)模塊時(shí),只需要封裝進(jìn)保護(hù)機(jī)制即可。常見(jiàn)的保護(hù)機(jī)制有關(guān)中斷、信號(hào)量、互斥鎖等。在Linux內(nèi)核中為應(yīng)對(duì)多核并發(fā)訪問(wèn)還有自旋鎖機(jī)制。由于篇幅所限,本文就不做展開(kāi)了,先挖個(gè)坑,以后有機(jī)會(huì)再分享吧。

總結(jié)一下

在前文介紹static文章的基礎(chǔ)上,相對(duì)更深入的介紹了為何需要隱藏屬性以及開(kāi)放接口的做法。以及如何遠(yuǎn)離邪惡的全局變量漫天飛舞的不良設(shè)計(jì)風(fēng)格。

辛苦原創(chuàng)總結(jié),如果覺(jué)得有價(jià)值也請(qǐng)幫忙點(diǎn)贊/在看/轉(zhuǎn)發(fā)支持,不勝感激!

END

往期精彩推薦,點(diǎn)擊即可閱讀




猜你喜歡

干貨 | 嵌入式必備技能之Git的使用

CPU中的程序是怎么運(yùn)行起來(lái)的

嵌入式系統(tǒng)軟件架構(gòu)設(shè)計(jì)

Linux下應(yīng)用開(kāi)發(fā)基礎(chǔ)

【Linux筆記】Pinctrl子系統(tǒng)與GPIO子系統(tǒng)


免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問(wèn)題,請(qǐng)聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車(chē)的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車(chē)技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車(chē)工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車(chē)。 SODA V工具的開(kāi)發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車(chē) 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉