電子產(chǎn)業(yè)一站式賦能平臺

PCB聯(lián)盟網(wǎng)

搜索
查看: 25|回復: 0
收起左側(cè)

嵌入式 C 語言,為什么全局變量越少越好?

[復制鏈接]

448

主題

448

帖子

537

積分

二級會員

Rank: 2

積分
537
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 昨天 17:50 | 只看該作者 |只看大圖 回帖獎勵 |正序瀏覽 |閱讀模式
我是老溫,一名熱愛學習的嵌入式工程師
8 R0 o0 M$ i$ h% g4 S關(guān)注我,一起變得更加優(yōu)秀!嵌入式開發(fā),特別是單片機os-less的程序,最易范的錯誤是全局變量滿天飛。! Z" T4 q: l, B6 Q: l; B' X8 D
這個現(xiàn)象在早期匯編轉(zhuǎn)型過來的程序員以及初學者中常見,這幫家伙幾乎把全局變量當作函數(shù)形參來用。( t) X' W9 D: G: [
在.h文檔里面定義許多雜亂的結(jié)構(gòu)體,extern一堆令人頭皮發(fā)麻的全局變量,然后再這個模塊里邊賦值123,那個模塊里邊判斷123分支決定做什么。
4 A: \0 J3 t' R/ M, g: f每當看到這種程序,我總要戚眉變臉而后拍桌怒喝。沒錯,就是怒喝。) o: G  |$ d+ o2 r9 B2 d" C
不否認全局變量的重要性,但我認為要十分謹慎地使用它,濫用全局變量會帶來其它更為嚴重的結(jié)構(gòu)性系統(tǒng)問題。9 z' E) t5 f- f; y
5 s$ k1 H/ }) M, |' ^
為什么全局變量要越少越好?
6 W" |6 E0 q5 B- o% @* L  Y/ K2 P它會造成不必要的常量頻繁使用,特別當這個常量沒有用宏定義“正名”時,代碼閱讀起來將萬分吃力。
& N/ J( M2 O% X它會導致軟件分層的不合理,全局變量相當于一條快捷通道,它容易使程序員模糊了“設(shè)備層”和“應用層”之間的邊界。寫出來的底層程序容易自作多情地關(guān)注起上層的應用。/ b' r3 @( o: t- ?" @$ f% j
這在軟件系統(tǒng)的構(gòu)建初期的確效率很高,功能調(diào)試進度一日千里,但到了后期往往bug一堆,處處“補丁”,雷區(qū)遍布。說是度日如年舉步維艱也不為過。
- W9 B3 j' x7 }5 S9 }( W2 ^由于軟件的分層不合理,到了后期維護,哪怕僅是增加修改刪除小功能,往往要從上到下掘地三尺地修改,涉及大多數(shù)模塊,
! S9 V% y! A2 f6 g! B而原有的代碼注釋卻忘了更新修改,這個時候,交給后來維護者的系統(tǒng)會越來越像一個“泥潭”,注釋的唯一作用只是使泥潭上方再加一些迷煙瘴氣。
! x7 s4 o' K# G8 a: X+ o1 ^全局變量大量使用,少不了有些變量流連忘返于中斷與主回圈程序之間。" W9 a3 U, i" P! _$ i
這個時候如果處理不當,系統(tǒng)的bug就是隨機出現(xiàn)的,無規(guī)律的,這時候初步顯示出病入膏肓的特征來了,沒有大牛來力挽狂瀾,注定慢性死亡。
. k. e, [& r& t  T無需多言,您已經(jīng)成功得到一個畸形的系統(tǒng),它處于一個神秘的穩(wěn)定狀態(tài)!
. W% M/ m5 H/ F- K你看著這臺機器,機器也看著你,相對無言,心中發(fā)毛。你不確定它什么時候會崩潰,也不曉得下一次投訴什么時候道理。# G( ?3 @; j/ y
全局變量大量使用有什么后果?
8 u0 Q* {4 j* q& H2 ]# E! i1 Z9 }“老人”氣昂昂,因為系統(tǒng)離不開他,所有“雷區(qū)”只有他了然于心。當出現(xiàn)緊急的bug時,只有他能夠搞定。你不但不能辭退他,還要給他加薪。
& d7 q  S6 w, F6 M* T, k新人見光死,但凡招聘來維護這個系統(tǒng)的,除了改出更多的bug外,基本上一個月內(nèi)就走人,到了外面還宣揚這個公司的軟件質(zhì)量有夠差夠爛。* y+ U* r) c6 X7 x' z) G1 _$ u
隨著產(chǎn)品的后續(xù)升級,幾個月沒有接觸這個系統(tǒng)的原創(chuàng)者會發(fā)現(xiàn),很多雷區(qū)他本人也忘記了,于是每次的產(chǎn)品升級維護周期越來越長,4 I0 g0 z2 ]( x7 I7 d& ^
因為修改一個功能會冒出很多bug,而按下一個bug,會彈出其他更多的bug。在這期間,又會產(chǎn)生更多的全局變量。" O: U" X2 M/ U' J
終于有一天他告訴老板,不行啦不行啦,資源不夠了,ram或者flash空間太小了,升級升級。3 R0 [2 S8 I/ r3 k' w7 C
客戶投訴不斷,售后也快崩潰了,業(yè)務(wù)員也不敢推薦此產(chǎn)品了,市場份額越來越小,公司形象越來越糟糕。4 ~4 v6 V3 s& }2 u* C% h
+ V( [; q$ c: I; V' r
. k3 m) M4 C) i( v
要問對策,只有兩個原則
- y4 a9 d( B! H3 ]能不用全局變量盡量不用,我想除了系統(tǒng)狀態(tài)和控制參數(shù)、通信處理和一些需要效率的模塊,其他的基本可以靠合理的軟件分層和編程技巧來解決。
; i7 ~2 P0 H/ \. S" K如果不可避免需要用到,那能藏多深就藏多深。
* j! }0 z! F) N1 E如果只有某.c文件用,就static到該文件中,順便把結(jié)構(gòu)體定義也收進來;如果只有一個函數(shù)用,那就static到函數(shù)里面去;( e- _6 q+ l8 u1 _- t! \  i
如果非要開放出去讓人讀取,那就用函數(shù)return出去,這樣就是只讀屬性了;
: W7 \) v  @( _4 v; H如果非要遭人蹂躪賦值,好吧,我開放函數(shù)接口讓你傳參賦值;實在非要extern侵犯我,我還可以嚴格控制包含我.h檔的對象,而不是放到公共的includes.h中被人圍觀,丟人現(xiàn)眼。+ N( r) v) O5 G+ H, w/ o( [& G4 f
如此,你可明白我對全局變量的感悟有多深刻,悲催的我,已經(jīng)把當年那些“老人”交給我維護的那些案子加班全部重新翻寫了。
& S" y3 i) S( l最后補充- ~' i% S4 Q# k6 i8 o' I$ `, E
全局變量是不可避免要用到的,每一個設(shè)備底層幾乎都需要它來記錄當前狀態(tài),控制時序,起承轉(zhuǎn)合。但是盡量不要用來傳遞參數(shù),這個很忌諱的。* ~) N# r0 `7 n7 O7 T" }! E
盡量把變量的作用范圍控制在使用它的模塊里面,如果其他模塊要訪問,就開個讀或?qū)懞瘮?shù)接口出來,嚴格控制訪問范圍。/ H/ I) d, x3 p2 K3 H
這一點,C++的private屬性就是這么干的,這對將來程序的調(diào)試也很有好處。- ]8 w) a5 g$ Z2 L: }3 Q
C語言之所以有++版本,很大原因就是為了控制它的靈活性,要說面向?qū)ο蟮乃枷,C語言早已有之,亦可實現(xiàn)。
! W' C! p4 |3 ?2 A" _當一個模塊里面的全局變量超過3個(含)時,就用結(jié)構(gòu)體包起來吧,要歸0便一起歸0,省得丟三落四的。" z3 S& D' C% n/ f+ S& }- Q
在函數(shù)里面開個靜態(tài)的全局變量,全局數(shù)組,是不占用棧空間的,只是有些編譯器對于大塊的全局數(shù)組,會放到和一般變量不同的地址區(qū)。* C% V0 n5 E# F0 A
若是在keil C51,因為是靜態(tài)編譯,棧爆掉了會報警,所以大可以盡情馳騁,注意交通規(guī)則就是了。+ g! v. f3 Y( J3 [
單片機的os-less系統(tǒng)中,只有棧沒有堆的用法,那些默認對堆分配空間的“startup.s”,可以大膽的把堆空間干掉。- h  f9 U6 l0 ]# y8 H
程序模型?如何分析抽象出來呢,從哪個角度進行模型構(gòu)建呢?很愿意聆聽網(wǎng)友的意見。
7 ]9 x# `1 q1 X5 X$ ^  Y" b本人一直以來都是從兩個角度分析系統(tǒng),事件--狀態(tài)機遷移圖 和 數(shù)據(jù)流圖,前者分析控制流向,完善UI,后者可知曉系統(tǒng)數(shù)據(jù)的緣起緣滅。' _, U0 V8 l3 a
這些理論,院校的《軟件工程》教材都有,大家不妨借鑒下。只不過那些理論,終究是起源于大型系統(tǒng)軟件管理的,牛刀殺雞,還是要裁剪一下的。: V6 x1 R* O7 M& B- m9 @
來源:網(wǎng)絡(luò)。& t4 r! G( q" I3 Z- O# l
-END-
! Y" }' O8 v+ J6 H3 c4 W" Q往期推薦:點擊圖片即可跳轉(zhuǎn)閱讀
, h7 A- b8 Z. S+ y7 L7 g2 E8 ~) {                                                       
3 U3 ]4 Y  Y$ t5 R: E                                                                7 i: {: ^+ U* F/ H0 d+ P3 i
                                                                        * X; Z$ @& L$ @' a3 O' {6 B
                                                                                , k& T# }+ X' q) @! P

. c  ?6 `0 t1 i; Q% ]( a* Y) I                                                                                + E: x4 E% P/ e1 B% w
                                                                                        嵌入式大佬分享,簡單易用的開發(fā)工具及解決方案!
9 {, o$ z5 n; {0 e! W+ m5 @                                                       
6 O! N& C+ Q) u; y                                                                " o% R1 J/ {0 [, ~4 F0 K( D
                                                                        2 k+ Q' [+ W, y6 Q, Y- z
                                                                               
2 e% Z: B8 H2 X4 j0 n! e& q
( I% s3 x  y' i* H1 r                                                                               
" b6 G6 k2 s& b; `. y                                                                                        一些非常全面的嵌入式軟件開發(fā)工具!' A. z- @( a5 C! t& b7 ^+ }
                                                                  y3 L) q& V! V4 }6 ^
                                                                       
; v; ]# W$ i2 f- L, \8 h                                                                                8 E1 V4 T; l3 ]- S# y, L  |; k5 X2 _

8 U# |6 o" Q6 Y3 ]. R                                                                                8 ~1 Y% u8 C( G9 r: y$ e
                                                                                        探討一下,嵌入式邊緣計算技術(shù),前景何在?
1 v% r6 ]% f$ d) x2 s                                                                               
4 S  ~) n' F+ @6 ]                                                                       
. E( }0 ?# A* A5 G                                                                ! ]& k# a8 y% }
                                                        我是老溫,一名熱愛學習的嵌入式工程師8 Y5 u/ }2 K- B0 z, U6 `
關(guān)注我,一起變得更加優(yōu)秀!
回復

使用道具 舉報

發(fā)表回復

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

關(guān)閉

站長推薦上一條 /1 下一條


聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表