前言
全局變量簡直就是嵌入式系統(tǒng)的戈蘭高地。沖突最激烈的雙方是:
做控制的工程師;
做非嵌入式的軟件工程師。
做控制的工程師特點(diǎn)
他們普遍的理解就是“變量都寫成全局該有多方便”。我之前面試過一個(gè)非常有名的做控制實(shí)驗(yàn)室里出來的PhD/Master,前前后后陸續(xù)有快十個(gè)人。面試問題是用C寫PID。到后面的幾位面試的時(shí)候我都覺得沒有看的意義了,因?yàn)槿紝懙氖峭粋€(gè)風(fēng)格。
大概就是這樣的:
float SetSpeed;float err;float err_last;float Kp,Ki,Kd;float integral;float result;
float PID(float speed){ err=SetSpeed-speed; integral+=err; result=Kp*err+Ki*integral+Kd*(err-err_last); err_last=err; return result;}
代碼的特點(diǎn)就是所有的變量一定定義在函數(shù)外面。問他們?yōu)槭裁矗卮鹗恰叭肿兞糠奖阏{(diào)試”。事實(shí)上在學(xué)校里做搞自動控制的人最重要的根本就是控制的結(jié)果,而不是代碼本身。代碼只要能工作就行。變量名污染,低耦合之類的和他們就不在同一個(gè)世界。
進(jìn)了公司有些人代碼質(zhì)量會變好,但有的還是會延續(xù)之前的習(xí)慣。前公司代碼庫里面凡是看不懂的代碼一律都是那一兩個(gè)Control Engineer寫的,寫完了還會用自己的名字給函數(shù)命名的那種。
要成為一個(gè)資深的嵌入式工程師相當(dāng)難,一方面要有非常扎實(shí)的理論知識,同時(shí)也要有相當(dāng)?shù)哪欠N大型的、高頻CPU、多層PCB板的設(shè)計(jì)經(jīng)驗(yàn)。嵌入式硬件工程師要學(xué)的課程主要有模擬電路設(shè)計(jì)、數(shù)字電路設(shè)計(jì)、電磁波理論等。熟悉常用的放大電路、濾波電路、電源電路設(shè)計(jì)和分析。
做非嵌入式的軟件工程師特點(diǎn)
代碼的特點(diǎn)就是所有的靜態(tài)變量都不可以定義在.h文件里,必須寫在.c文件里以確保別的文件沒法訪問它們。別的文件真要訪問怎么辦?那就給每一個(gè)變量寫get/set函數(shù)啊!問題是靜態(tài)變量寫在.c文件里編譯器是沒法優(yōu)化get/set的。
結(jié)果就大面積的變量訪問要花幾倍的CPU時(shí)間去做get/set的函數(shù)調(diào)用。嵌入式項(xiàng)目很多情況下對硬件的壓榨是很極端的,CPU利用率90%都不算什么,頂?shù)?7%都是有的。(注意下這些項(xiàng)目是實(shí)時(shí)性要求很高的,晚一個(gè)毫秒算不完都不行。不是跑在電腦上鼠標(biāo)卡一卡也無所謂的。)然后為了封裝性,在代碼里面塞這么多get/set嗎?
總結(jié)
總的來說嵌入式軟件里大部分的代碼都是中斷驅(qū)動的,天生就有很多變量是沒法使用參數(shù)傳遞的。全局變量的存在是因?yàn)檎x站在這邊。但是嵌入式軟件遠(yuǎn)遠(yuǎn)沒有特殊到不需要按照正常軟件工程方法去管理的地步。要真有人認(rèn)為“嵌入式軟件只要能工作就成,代碼丑一點(diǎn)無所謂的”純粹是軟件工程水平不行,不是因?yàn)榭刂扑教?。全局變量一定是要用的,管理它們也很重要?/p>
一些基本的代碼規(guī)則:
如果只是文件內(nèi)調(diào)用,全局變量只能寫在這個(gè).c文件里,不要寫進(jìn).h文件。
如果有文件外調(diào)用,全局變量要寫在.h文件里。
.h里面的全局變量全局可讀,但是只有本文件組可以寫。別的文件要寫請調(diào)用set函數(shù)。
所有的全局變量無論在.h還是.c里面都要包成同名struct。哪怕只有一個(gè)變量也要寫進(jìn)struct里面。比如PID.c里面有一個(gè)pid_S,PID.h里面有個(gè)PID_S。這樣其他人不僅可以立即識別出一個(gè)變量是project內(nèi)global/文件內(nèi)static/函數(shù)內(nèi)local,同時(shí)還能輕松追溯到這個(gè)函數(shù)是屬于哪個(gè)文件的。
不要寫函數(shù)內(nèi)的static變量。函數(shù)內(nèi)的static變量在實(shí)際的項(xiàng)目中幾乎就是bug生成器,沒法簡單的reset。而且對unit test非常不友好。
責(zé)任編輯:lq
-
單片機(jī)
+關(guān)注
關(guān)注
6076文章
45501瀏覽量
670868 -
C語言
+關(guān)注
關(guān)注
183文章
7644瀏覽量
145681 -
代碼
+關(guān)注
關(guān)注
30文章
4970瀏覽量
74022 -
變量
+關(guān)注
關(guān)注
0文章
616瀏覽量
29513 -
軟件工程師
+關(guān)注
關(guān)注
8文章
243瀏覽量
21646
原文標(biāo)題:C語言開發(fā)單片機(jī)為啥都是全局變量形式?
文章出處:【微信號:mcugeek,微信公眾號:MCU開發(fā)加油站】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
知識分享-嵌入式系統(tǒng)可靠性模型
嵌入式系統(tǒng)安全設(shè)計(jì)原則
什么是嵌入式應(yīng)用開發(fā)?
嵌入式系統(tǒng)應(yīng)用熱門的原因主要有幾個(gè)方面
嵌入式C語言中各變量存儲位置
如何搞定嵌入式 C語言中的全局變量問題?
C語言全局變量重點(diǎn)使用
什么是嵌入式操作系統(tǒng)?
請問C語言開發(fā)單片機(jī)為什么大多數(shù)都采用全局變量的形式?
常用變量的介紹
嵌入式系統(tǒng)的定義和應(yīng)用領(lǐng)域
嵌入式實(shí)時(shí)操作系統(tǒng)的特點(diǎn)
請問Modus Toolbox下針對CYW20719B2編程,能否指定全局變量地址?
運(yùn)行在嵌入式系統(tǒng)上的emApps
全局變量簡直就是嵌入式系統(tǒng)的戈蘭高地
評論