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

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

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

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

全局變量簡直就是嵌入式系統(tǒng)的戈蘭高地

MCU開發(fā)加油站 ? 來源:MCU開發(fā)加油站 ? 作者:MCU開發(fā)加油站 ? 2021-01-18 16:26 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

前言

全局變量簡直就是嵌入式系統(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

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

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

掃碼添加小助手

加入工程師交流群

    評論

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

    知識分享-嵌入式系統(tǒng)可靠性模型

    嵌入式系統(tǒng)可靠性設(shè)計(jì)技術(shù)及案例解析1.3嵌入式系統(tǒng)可靠性模型嵌入式系統(tǒng)可靠性模型分為兩種:串聯(lián)結(jié)
    的頭像 發(fā)表于 03-11 16:43 ?98次閱讀
    知識分享-<b class='flag-5'>嵌入式</b><b class='flag-5'>系統(tǒng)</b>可靠性模型

    嵌入式系統(tǒng)安全設(shè)計(jì)原則

    隨著物聯(lián)網(wǎng)、工業(yè)控制和智能設(shè)備的普及,嵌入式系統(tǒng)的安全問題越來越突出。一個(gè)小小的漏洞,就可能導(dǎo)致設(shè)備被入侵、數(shù)據(jù)泄露,甚至對人身安全產(chǎn)生威脅。因此,從設(shè)計(jì)階段開始就考慮安全,是每一個(gè)嵌入式開發(fā)者必須
    的頭像 發(fā)表于 01-19 09:06 ?348次閱讀
    <b class='flag-5'>嵌入式</b><b class='flag-5'>系統(tǒng)</b>安全設(shè)計(jì)原則

    什么是嵌入式應(yīng)用開發(fā)?

    概述 所謂的嵌入式應(yīng)用開發(fā)就是嵌入式操作系統(tǒng)下進(jìn)行開發(fā)、軟硬件綜合開發(fā) ?嵌入式應(yīng)用開發(fā)?是指在嵌入
    發(fā)表于 01-12 16:13

    嵌入式系統(tǒng)應(yīng)用熱門的原因主要有幾個(gè)方面

    的內(nèi)核?簡直沒有可比性。2. 專用性強(qiáng)。嵌入式系統(tǒng)的個(gè)性化很強(qiáng),其中的軟件系統(tǒng)和硬件的結(jié)合非常緊密,一般要針對硬件進(jìn)行系統(tǒng)的移植,即使在同
    發(fā)表于 01-08 06:37

    嵌入式C語言中各變量存儲位置

    的存儲是放在一塊的,初始化的全局變量和靜態(tài)變量在一塊區(qū)域, 未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域。 4、文字常量區(qū) —常量字符串
    發(fā)表于 12-25 07:54

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

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

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

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

    什么是嵌入式操作系統(tǒng)?

    要理解嵌入式操作系統(tǒng)(Embedded Operating System,簡稱 RTOS/EOS),我們可以從本質(zhì)定義→核心區(qū)別→實(shí)際作用→典型特征→嵌入式開發(fā)場景適配,五個(gè)維度來拆解, 一
    發(fā)表于 12-09 10:33

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

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

    常用變量的介紹

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

    嵌入式系統(tǒng)的定義和應(yīng)用領(lǐng)域

    嵌入式系統(tǒng),簡而言之,就是一種專為特定設(shè)備或裝置設(shè)計(jì)的計(jì)算機(jī)系統(tǒng)。它們通常配備一個(gè)嵌入式處理器,其控制程序被存儲在ROM中。這些
    發(fā)表于 11-17 06:49

    嵌入式實(shí)時(shí)操作系統(tǒng)的特點(diǎn)

    實(shí)時(shí)嵌入式操作系統(tǒng)(Real-Time Embedded Operating System)是專門設(shè)計(jì)用于嵌入式系統(tǒng)的實(shí)時(shí)操作系統(tǒng)。
    發(fā)表于 11-13 06:30

    請問Modus Toolbox下針對CYW20719B2編程,能否指定全局變量地址?

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

    運(yùn)行在嵌入式系統(tǒng)上的emApps

    在當(dāng)今快節(jié)奏的嵌入式系統(tǒng)世界中,靈活性和適應(yīng)性是嵌入式系統(tǒng)實(shí)現(xiàn)的關(guān)鍵。SEGGER推出了其最新創(chuàng)新:Embedded apps(emApps)應(yīng)用,類似于手機(jī)上的應(yīng)用程序,可以運(yùn)行在
    的頭像 發(fā)表于 06-18 09:53 ?893次閱讀
    運(yùn)行在<b class='flag-5'>嵌入式</b><b class='flag-5'>系統(tǒng)</b>上的emApps

    Python在嵌入式系統(tǒng)中的應(yīng)用場景

    你想把你的職業(yè)生涯提升到一個(gè)新的水平?Python在嵌入式系統(tǒng)中正在成為一股不可缺少的新力量。盡管傳統(tǒng)上嵌入式開發(fā)更多地依賴于C和C++語言,Python的優(yōu)勢在于其簡潔的語法、豐富的庫和快速的開發(fā)周期,這使得它在某些
    的頭像 發(fā)表于 03-19 14:10 ?1516次閱讀