在C語言開發(fā)單片機(jī)時(shí),使用全局變量的確非常普遍。

這種編程風(fēng)格主要是出于幾個(gè)重要的原因:
1
性能和資源限制
在嵌入式系統(tǒng)中,資源(如內(nèi)存和CPU時(shí)間)往往非常有限。
使用全局變量可以減少棧空間的消耗,因?yàn)槿肿兞看鎯?chǔ)在靜態(tài)內(nèi)存區(qū)域,而局部變量則存儲(chǔ)在棧中。
對(duì)于一些資源緊張的微控制器來說,棧的深度是有限的,而全局變量可以在代碼中任何地方訪問,不需要頻繁的棧操作,這有助于節(jié)省時(shí)間和內(nèi)存。
尤其是在嵌入式環(huán)境中,實(shí)時(shí)性要求較高時(shí),減少函數(shù)參數(shù)傳遞或返回值賦值帶來的開銷,是一種優(yōu)化手段。
2
簡化狀態(tài)管理
嵌入式系統(tǒng)通常需要管理大量的狀態(tài)信息,比如傳感器數(shù)據(jù)、系統(tǒng)狀態(tài)標(biāo)志、任務(wù)間共享的數(shù)據(jù)等。
全局變量可以作為共享內(nèi)存,方便不同的模塊或任務(wù)訪問和修改。
在一個(gè)多任務(wù)或中斷驅(qū)動(dòng)的系統(tǒng)中,使用全局變量可以更方便地在不同的上下文間共享數(shù)據(jù),而不需要通過復(fù)雜的函數(shù)調(diào)用鏈傳遞數(shù)據(jù)。
例如,在飛控系統(tǒng)中,需要處理傳感器數(shù)據(jù)、姿態(tài)解算、控制算法等多個(gè)功能模塊。
這些模塊可能在不同的任務(wù)或中斷中執(zhí)行,而使用全局變量可以讓各個(gè)模塊之間更方便地共享狀態(tài)信息,從而減少參數(shù)傳遞的復(fù)雜性。
3
減少代碼復(fù)雜性
在一些情況下,函數(shù)返回值的使用可能會(huì)增加代碼的復(fù)雜性。
特別是在嵌入式開發(fā)中,如果一個(gè)系統(tǒng)涉及多個(gè)傳感器數(shù)據(jù)、控制參數(shù)等的處理,函數(shù)返回值可能需要多層傳遞和處理。
這不僅增加了代碼的復(fù)雜性,也容易引入錯(cuò)誤。使用全局變量,可以避免復(fù)雜的參數(shù)傳遞,使代碼更加簡潔。
例如,在一個(gè)多層處理鏈中,數(shù)據(jù)需要被多個(gè)函數(shù)處理和修改。
使用全局變量,數(shù)據(jù)可以在不同的函數(shù)間直接共享,而不用反復(fù)傳遞或多次拷貝。
4
中斷處理中的便捷性
在嵌入式系統(tǒng)中,中斷是非常常見的設(shè)計(jì)模式。
中斷服務(wù)程序(ISR)通常會(huì)修改系統(tǒng)的一些狀態(tài)或數(shù)據(jù),供主程序使用。
為了保證中斷處理和主程序之間的數(shù)據(jù)一致性,全局變量是較為簡單的選擇。
局部變量的生命周期在函數(shù)退出后會(huì)被銷毀,而全局變量的生命周期貫穿整個(gè)程序運(yùn)行周期,這就使得在中斷中修改全局變量成為一種天然的方式。
5
硬件寄存器的映射
在單片機(jī)開發(fā)中,硬件寄存器通常通過全局變量或宏定義來訪問。
雖然嚴(yán)格來說這些并不是“全局變量”,但這種編程習(xí)慣導(dǎo)致了大量代碼對(duì)全局變量的依賴。
這種編程方式可以直觀地操作硬件,并且對(duì)于嵌入式開發(fā)人員來說,這種風(fēng)格已經(jīng)非常普遍。
6
全局變量的缺點(diǎn)和替代方案
雖然全局變量有其優(yōu)勢(shì),但也帶來了一些問題,比如:
可維護(hù)性差:全局變量被任意函數(shù)訪問和修改,可能導(dǎo)致代碼難以跟蹤和調(diào)試。
數(shù)據(jù)不安全:如果多個(gè)任務(wù)同時(shí)訪問全局變量,容易引發(fā)數(shù)據(jù)競爭問題,需要加鎖或其他機(jī)制來保護(hù)數(shù)據(jù)一致性。
為了解決這些問題,有些替代方案可以被采用:
局部變量傳遞和返回值:這種方法更符合現(xiàn)代編程的“封裝性”原則,使函數(shù)之間的依賴性降低。
結(jié)構(gòu)體封裝:將相關(guān)變量封裝到一個(gè)結(jié)構(gòu)體中,并通過指針傳遞,使代碼的邏輯結(jié)構(gòu)更清晰。
模塊化編程:使用static關(guān)鍵字將變量限定在文件作用域,避免全局命名空間污染。
嵌入式開發(fā)中使用全局變量是一種權(quán)衡性能、內(nèi)存消耗和代碼復(fù)雜性的常見做法。
不過隨著系統(tǒng)復(fù)雜度的增加,合理管理全局變量,避免濫用,也是編程時(shí)需要特別注意的。
