91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C語言開發(fā)單片機(jī)為啥都是全局變量形式?

GReq_mcu168 ? 來源:玩轉(zhuǎn)單片機(jī) ? 2020-08-05 10:35 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

前言

全局變量簡直就是嵌入式系統(tǒng)的戈蘭高地。沖突最激烈的雙方是:

1. 做控制的工程師;

2. 做非嵌入式的軟件工程師。

做控制的工程師特點(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é)校里做搞自動(dòng)控制的人最重要的根本就是控制的結(jié)果,而不是代碼本身。代碼只要能工作就行。變量名污染,低耦合之類的和他們就不在同一個(gè)世界。進(jìn)了公司有些人代碼質(zhì)量會(huì)變好,但有的還是會(huì)延續(xù)之前的習(xí)慣。前公司代碼庫里面凡是看不懂的代碼一律都是那一兩個(gè)Control Engineer寫的,寫完了還會(huì)用自己的名字給函數(shù)命名的那種。 要成為一個(gè)資深的嵌入式工程師相當(dāng)難,一方面要有非常扎實(shí)的理論知識(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)目很多情況下對(duì)硬件的壓榨是很極端的,CPU利用率90%都不算什么,頂?shù)?7%都是有的。(注意下這些項(xiàng)目是實(shí)時(shí)性要求很高的,晚一個(gè)毫秒算不完都不行。不是跑在電腦上鼠標(biāo)卡一卡也無所謂的。)然后為了封裝性,在代碼里面塞這么多get/set嗎?

總結(jié)

總的來說嵌入式軟件里大部分的代碼都是中斷驅(qū)動(dòng)的,天生就有很多變量是沒法使用參數(shù)傳遞的。全局變量的存在是因?yàn)檎x站在這邊。但是嵌入式軟件遠(yuǎn)遠(yuǎn)沒有特殊到不需要按照正常軟件工程方法去管理的地步。要真有人認(rèn)為“嵌入式軟件只要能工作就成,代碼丑一點(diǎn)無所謂的”純粹是軟件工程水平不行,不是因?yàn)榭刂扑教摺?全局變量一定是要用的,管理它們也很重要。一些基本的代碼規(guī)則:

如果只是文件內(nèi)調(diào)用,全局變量只能寫在這個(gè).c文件里,不要寫進(jìn).h文件。

如果有文件外調(diào)用,全局變量要寫在.h文件里。

.h里面的全局變量全局可讀,但是只有本文件組可以寫。別的文件要寫請(qǐng)調(diào)用set函數(shù)。

所有的全局變量無論在.h還是.c里面都要包成同名struct。哪怕只有一個(gè)變量也要寫進(jìn)struct里面。比如PID.c里面有一個(gè)pid_S,PID.h里面有個(gè)PID_S。這樣其他人不僅可以立即識(shí)別出一個(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。而且對(duì)unit test非常不友好。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5202

    文章

    20516

    瀏覽量

    335280
  • C語言
    +關(guān)注

    關(guān)注

    183

    文章

    7645

    瀏覽量

    145849
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4972

    瀏覽量

    74132

原文標(biāo)題:C語言開發(fā)單片機(jī)為啥都是全局變量形式?

文章出處:【微信號(hào):mcu168,微信公眾號(hào):硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    飛凌嵌入式ElfBoard-環(huán)境變量之獲取環(huán)境變量

    、Mac OS)中,main 函數(shù)的一個(gè)常見擴(kuò)展是增加了第三個(gè)參數(shù) char **env,用來傳遞環(huán)境變量。雖然這種形式不是C語言標(biāo)準(zhǔn)規(guī)定的一部分,但它是類Unix操作系統(tǒng)上的慣用寫法
    發(fā)表于 03-13 08:50

    手把手教你學(xué)51單片機(jī)-C語言

    和規(guī)范,都是與實(shí)際項(xiàng)目開發(fā)相結(jié)合的,這樣讀者在入門后,能夠很快的投入到實(shí)際開發(fā)中去。 5、重點(diǎn)關(guān)注實(shí)用技術(shù) 本書的內(nèi)容偏重于單片機(jī)的應(yīng)用而非詳盡的理論闡述。傳統(tǒng)的書籍一般會(huì)把和
    發(fā)表于 03-05 11:47

    嵌入式C語言中各變量存儲(chǔ)位置

    局部變量、局部靜態(tài)變量、全局變量、全局靜態(tài)變量區(qū)別如下: 局部變量: 棧區(qū); 局部靜態(tài)
    發(fā)表于 12-25 07:54

    如何搞定嵌入式 C語言中的全局變量問題?

    大家好,今天分享一篇關(guān)于嵌入式C編程中全局變量問題的文章。希望對(duì)大家有所啟發(fā)。 嵌入式特別是單片機(jī)os-less的程序,最易范的錯(cuò)誤是全局變量滿天飛。 這個(gè)現(xiàn)象在早期匯編轉(zhuǎn)型過來的程
    發(fā)表于 12-16 06:54

    C語言全局變量重點(diǎn)使用

    全局變量絕不會(huì)位于寄存器中。使用指針或者函數(shù)調(diào)用,可以直接修改全局變量的值。 因此,編譯器不能將全局變量的值緩存在寄存器中,但這在使用全局變量時(shí)便需要額外的 (常常是不必要的)讀取和存
    發(fā)表于 12-12 06:58

    請(qǐng)問C語言開發(fā)單片機(jī)為什么大多數(shù)都采用全局變量形式?

    C語言代碼,大多數(shù)都是使用全局變量,也就是用很多函數(shù)來操作這些變量,比如函數(shù)1把一個(gè)全局變量經(jīng)過
    發(fā)表于 12-04 07:47

    為什么單片機(jī)還在用C語言編程?

    的存儲(chǔ)空間非常有限,我們使用者需要靠精打細(xì)算來設(shè)計(jì)程序,根本經(jīng)不起高級(jí)語言臃腫的代碼體積。高級(jí)語言也無法實(shí)現(xiàn)精確的時(shí)序控制。 三、C語言是一個(gè)折中選擇 其實(shí)用
    發(fā)表于 11-28 07:37

    常用變量的介紹

    extern:用在全局變量上表示該變量在其他文件中已經(jīng)定義;用在函數(shù)上作用同全局變量; static:用在全局變量上,和非靜態(tài)全局變量相比,
    發(fā)表于 11-21 07:05

    C語言單片機(jī)C語言有什么差異

    單片機(jī)c語言相對(duì)于普通C語言增加了一些基本的指令,還有變量的賦值是16進(jìn)制,當(dāng)然
    發(fā)表于 11-14 07:55

    C語言開發(fā)單片機(jī)為什么大多數(shù)都采用全局變量形式?

    單片機(jī)的芯片資源從來都是 “精打細(xì)算” 的級(jí)別,CPU 主頻普遍不高,RAM 總?cè)萘勘揪途o張,分給棧空間的更是少得可憐。要是像普通軟件那樣,依賴函數(shù)返回值傳遞數(shù)據(jù)、頻繁用局部變量周轉(zhuǎn),一來二去占用
    的頭像 發(fā)表于 11-12 14:29 ?466次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>開發(fā)單片機(jī)</b>為什么大多數(shù)都采用<b class='flag-5'>全局變量</b>的<b class='flag-5'>形式</b>?

    開發(fā)單片機(jī)需要學(xué)習(xí)什么?軟件編程的 4 個(gè)關(guān)鍵層次

    ,缺一不可。 第一層是 C 語言基礎(chǔ)語法。這是單片機(jī)編程的 “通用語言”,需熟練掌握變量(字符型、整型、浮點(diǎn)型)、函數(shù)(定義、調(diào)用、返回值)
    的頭像 發(fā)表于 08-25 11:32 ?911次閱讀

    請(qǐng)問Modus Toolbox下針對(duì)CYW20719B2編程,能否指定全局變量地址?

    請(qǐng)問Modus Toolbox 下針對(duì)CYW20719B2編程,能否指定全局變量地址?
    發(fā)表于 07-08 07:20

    單片機(jī)c語言編程實(shí)例大全

    單片機(jī)c語言編程實(shí)例大全_18
    發(fā)表于 04-30 16:11 ?7次下載

    新概念51單片機(jī)C語言教程入門、提高、開發(fā)、拓展全攻略

    1.6 單片機(jī)C51基礎(chǔ)知識(shí)介紹 1.6.1 利用C語言開發(fā)單片機(jī)的優(yōu)點(diǎn) 1.6.2 C51
    發(fā)表于 04-15 13:57

    static在單片機(jī)中的妙用

    了呢?一起來看下吧一、修飾變量第一個(gè)作用修飾變量,變量又分為局部變量全局變量,但它們都存在內(nèi)存的靜態(tài)區(qū)。 對(duì)于靜態(tài)區(qū),堆棧等等這些區(qū)域的概
    發(fā)表于 04-02 13:50 ?1次下載