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

當(dāng)前位置:首頁 > 嵌入式 > 玩轉(zhuǎn)嵌入式
[導(dǎo)讀]在C語言中,按照生命周期來分,變量只有兩類:靜態(tài)變量和動(dòng)態(tài)變量。

在C語言中,按照生命周期來分,變量只有兩類:靜態(tài)變量動(dòng)態(tài)變量。

其中,靜態(tài)變量是指,在編譯時(shí)刻(Compiling-time)變量的地址和大小都已經(jīng)確定下來的變量。動(dòng)態(tài)變量是指,直到運(yùn)行時(shí)刻(Run-time),變量的地址(有時(shí)候包括確切大小)才能在某個(gè)時(shí)刻暫時(shí)性的確定下來的變量。

> 靜態(tài)變量 在嵌入式系統(tǒng)中,確定的(Deterministic)通常是“簡單可靠”的代名詞,因此在追求可靠性的嵌入式項(xiàng)目中盡可能使用靜態(tài)變量是有道理的。靜態(tài)變量是永恒的,如果一個(gè)程序就是一個(gè)世界,那么這些靜態(tài)變量從創(chuàng)世紀(jì)開始就存在了,直到末日它也依然在那里、地址、大小都不會(huì)變化。
靜態(tài)變量按照“語法上的作用范圍”可以劃分為:全局變量(Global Variable)和靜態(tài)變量(Static Variable)。
靜態(tài)變量的作用范圍受到花括號(hào)的限制——僅在對(duì)應(yīng)的花括號(hào)內(nèi)有效。

根據(jù)這一規(guī)則,我們?nèi)菀字溃谌魏位ɡㄌ?hào)內(nèi)的靜態(tài)變量,都是局部靜態(tài)變量(local static variable),其作用范圍受到對(duì)應(yīng)的花括號(hào)限制。有一類特殊的靜態(tài)變量,它們的頭頂上沒有任何花括號(hào)了,而且也沒有static關(guān)鍵字的限制,那么我們可以理解為,這類無人約束的變量,其作用范圍就是整個(gè)工程啦——也就是我們所說的全局變量。還有一類頭頂上沒有花括號(hào),但是由static修飾的靜態(tài)變量,我們稱為“模塊內(nèi)全局變量”——它僅在當(dāng)前.c文件內(nèi)是可以“全局”訪問的。
其實(shí),根據(jù)我們之前一篇關(guān)于指針的文章(《求求你,不要再糾結(jié)指針了……》,發(fā)送關(guān)鍵字“指針”進(jìn)行閱讀),我們知道,這種“語法上”的東西都是虛假的,騙小孩的,具體就不再贅述?;谶@一原因,后面將不對(duì)全局變量和靜態(tài)局部變量之流做區(qū)分,統(tǒng)一稱為靜態(tài)變量。
> 靜態(tài)變量放在哪里呢?
static uint32_t wExampleA = 0x12345678; static uint16_t hwExampleB = 0; static uint16_t *phwPointer = NULL; static uint8_t chExampleC[10]; static float fExampleD;
無論是代碼(Code)還是數(shù)據(jù)(Data),他們的容器都是“段”(section)。
> 對(duì)于 wExampleA 這樣有非0初始值的變量,編譯器視作 RW Data (Read/Write Data,也就是普通的可讀可寫的數(shù)據(jù)),簡稱RW,放在“.data”段(.data section)里。

> 對(duì)于 wExampleB、phwPointer 這樣被明確初始化為0的變量,編譯器視作 ZI RW Data(Zero Initialized Read/Write Data,初始化為0的可讀可寫數(shù)據(jù)),簡稱 ZI,放在“.bss”段( .bss section)。
> 對(duì)于 wExampleC 和 wExampleD 這樣沒有明確指定初始值的變量,編譯器會(huì)視作其默認(rèn)“應(yīng)該”用0進(jìn)行初始化,因此也作為 ZI,放在“.bss”段。
簡單說,除了有非0初始化值的變量放在.data段以外,( 記憶為 RW 放 .data section),其余所有變量都放在 .bss 段(記憶為 ZI 放 .bss section)。

昏昏欲睡的高手們,福利來了: 在MDK中(其實(shí)是 ARM Compiler中),默認(rèn)情況下,所有尺寸小于8個(gè)字節(jié)、本應(yīng)放在 .bss 段的 ZI Data,都會(huì)被作為普通RW Data放在 “.bss” 段——之所以這么做是因?yàn)榫幾g器覺得:通過循環(huán)賦值的方法給這幫小變量初始化成0太不劃算了,初始化他們的程序都比變量本身還大呢,干脆放幾個(gè)0到RW的初始值表里,由RW數(shù)據(jù)的初始化程序順手處理好了——說了這么多,如果不好理解,簡單理解成出于優(yōu)化的目的就行了。 要想關(guān)閉這個(gè)優(yōu)化,在命令行中加入“--bss_threshold=0”就可以了。順便說下,默認(rèn)設(shè)置相當(dāng)于“--bss_threshold=8”。

.data section 和 .bss section是兩個(gè)默認(rèn)的section,你還以定義自己的section,并自己指定將哪些變量放到里面。具體怎么實(shí)現(xiàn),請(qǐng)查閱對(duì)應(yīng)編譯器的使用手冊(cè)。
你可以忘記上面這些,只要記住:變量和代碼都是放在段里面的,段具體放在哪里(什么地址上)則是由 linker 的腳本控制的。

在MDK中(也就是ARM Compiler中),這個(gè)腳本叫做scatter-loading file;在IAR和GCC也有對(duì)應(yīng)的LinkerScript,只不過語法規(guī)則不同,感興趣的人可以查閱對(duì)應(yīng)的手冊(cè),這里只為讀者提供一個(gè)自行研究的方向,避免屋上架屋,不再贅述。
> 動(dòng)態(tài)變量 C語言原生態(tài)支持的動(dòng)態(tài)變量就只有局部變量了(Local Variable)。理論上說,局部變量只在程序進(jìn)入變量所在的花括號(hào)范圍內(nèi)時(shí)才從棧(stack)中進(jìn)行分配,一旦程序出了花括號(hào),它的聲明就結(jié)束了——夏蟲不可語冰說的就是局部變量那可憐的一生……
看著新近分配的局部變量,靜態(tài)局部變量深深的吸了一口煙,又長長的吐了出去:時(shí)間對(duì)它是沒有意義的存在。俗話說“鐵打的花括號(hào),流水的局部變量”,看了太多的生生死死,它已經(jīng)麻木了……然而,命運(yùn)枷鎖禁錮了靜態(tài)局部變量的腳步,它是多么的向往花括號(hào)外面的世界,企盼著有一天一個(gè)指針腳踏七彩祥云,將自己拉出牢籠,不再只看著“高墻上四角的天空”……
請(qǐng)從下列成語中選擇出與 “將局部變量的地址傳遞到函數(shù)外部”的做法意義相近的成語: A. 刻舟求劍  B. 刻舟求劍  C. 刻舟求劍 D. 刻舟求劍

與浮萍一般生命短暫、作用范圍有限的局部變量相對(duì),堆(Head)變量是一個(gè)奇葩的存在:
首先,堆變量的作用范圍不受花括號(hào)限制,但具體在哪個(gè)范圍內(nèi)有效,完全由程序邏輯決定(掌握在程序員的手里);
其次,堆變量的生存時(shí)間不受花括號(hào)限制,但正常情況下都是有限的,指不定什么時(shí)候就被Free掉了;少數(shù)比較悲慘的堆變量則滑落到了命運(yùn)的深淵中,從此被人們所遺忘,陷入了痛苦的永生……
堆變量不是C語言原生態(tài)所支持的變量類型(C++、Java、C#原生態(tài)支持),而是開發(fā)人員通過程序邏輯所構(gòu)造出的特殊變量類型。堆從哪里來呢?我們既可以定義一個(gè)很大的數(shù)組(你肯定不會(huì)在意數(shù)組的初值對(duì)吧),將它交給堆函數(shù)(此時(shí),堆就在ZI里面);也可以告訴編譯器,把 .bss后面的一定RAM區(qū)域化歸特區(qū)——編譯器將不再這個(gè)區(qū)域分配靜態(tài)變量——交給堆函數(shù)(此時(shí),堆既不在RW里,也不在ZI里)。堆不是一個(gè)聽話的好孩子,經(jīng)常和它的鄰居,ZI、RW和Stack打架。有些嚴(yán)厲的家長為了家族的繁榮和穩(wěn)定,直接就將Heap丟棄了——沒弄清楚它的脾氣之前,你可輕易不要撿回來哦。

免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場,如有問題,請(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)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢抑制與過流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問題卻十分常見,不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車場照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對(duì)周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉