日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

全局變量簡直就是嵌入式系統的戈蘭高地

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

掃碼添加小助手

加入工程師交流群

前言

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

做控制的工程師;

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

做控制的工程師特點

他們普遍的理解就是“變量都寫成全局該有多方便”。我之前面試過一個非常有名的做控制實驗室里出來的PhD/Master,前前后后陸續(xù)有快十個人。面試問題是用C寫PID。到后面的幾位面試的時候我都覺得沒有看的意義了,因為全都寫的是同一個風格。

大概就是這樣的:

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;}

代碼的特點就是所有的變量一定定義在函數外面。問他們?yōu)槭裁?,回答是“全局變量方便調試”。事實上在學校里做搞自動控制的人最重要的根本就是控制的結果,而不是代碼本身。代碼只要能工作就行。變量名污染,低耦合之類的和他們就不在同一個世界。

進了公司有些人代碼質量會變好,但有的還是會延續(xù)之前的習慣。前公司代碼庫里面凡是看不懂的代碼一律都是那一兩個Control Engineer寫的,寫完了還會用自己的名字給函數命名的那種。

要成為一個資深的嵌入式工程師相當難,一方面要有非常扎實的理論知識,同時也要有相當的那種大型的、高頻CPU、多層PCB板的設計經驗。嵌入式硬件工程師要學的課程主要有模擬電路設計、數字電路設計、電磁波理論等。熟悉常用的放大電路、濾波電路、電源電路設計和分析。

做非嵌入式的軟件工程師特點

代碼的特點就是所有的靜態(tài)變量都不可以定義在.h文件里,必須寫在.c文件里以確保別的文件沒法訪問它們。別的文件真要訪問怎么辦?那就給每一個變量寫get/set函數?。栴}是靜態(tài)變量寫在.c文件里編譯器是沒法優(yōu)化get/set的。

結果就大面積的變量訪問要花幾倍的CPU時間去做get/set的函數調用。嵌入式項目很多情況下對硬件的壓榨是很極端的,CPU利用率90%都不算什么,頂到97%都是有的。(注意下這些項目是實時性要求很高的,晚一個毫秒算不完都不行。不是跑在電腦上鼠標卡一卡也無所謂的。)然后為了封裝性,在代碼里面塞這么多get/set嗎?

總結

總的來說嵌入式軟件里大部分的代碼都是中斷驅動的,天生就有很多變量是沒法使用參數傳遞的。全局變量的存在是因為正義站在這邊。但是嵌入式軟件遠遠沒有特殊到不需要按照正常軟件工程方法去管理的地步。要真有人認為“嵌入式軟件只要能工作就成,代碼丑一點無所謂的”純粹是軟件工程水平不行,不是因為控制水平太高。全局變量一定是要用的,管理它們也很重要。

一些基本的代碼規(guī)則:

如果只是文件內調用,全局變量只能寫在這個.c文件里,不要寫進.h文件。

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

.h里面的全局變量全局可讀,但是只有本文件組可以寫。別的文件要寫請調用set函數。

所有的全局變量無論在.h還是.c里面都要包成同名struct。哪怕只有一個變量也要寫進struct里面。比如PID.c里面有一個pid_S,PID.h里面有個PID_S。這樣其他人不僅可以立即識別出一個變量是project內global/文件內static/函數內local,同時還能輕松追溯到這個函數是屬于哪個文件的。

不要寫函數內的static變量。函數內的static變量在實際的項目中幾乎就是bug生成器,沒法簡單的reset。而且對unit test非常不友好。

責任編輯:lq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯系本站處理。 舉報投訴
  • 單片機
    +關注

    關注

    6078

    文章

    45596

    瀏覽量

    674071
  • C語言
    +關注

    關注

    183

    文章

    7646

    瀏覽量

    146208
  • 代碼
    +關注

    關注

    30

    文章

    4977

    瀏覽量

    74425
  • 變量
    +關注

    關注

    0

    文章

    616

    瀏覽量

    29581
  • 軟件工程師
    +關注

    關注

    8

    文章

    243

    瀏覽量

    21692

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

文章出處:【微信號:mcugeek,微信公眾號:MCU開發(fā)加油站】歡迎添加關注!文章轉載請注明出處。

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    嵌入式軟件安全解決之道-堆棧分析篇

    引言 做嵌入式開發(fā),最怕遇到什么樣的 Bug? 不是語法報錯,也不是邏輯寫反,而是設備運行中毫無征兆地死機、重啟,或是某個無關緊要的全局變量被靜默篡改。當你連接仿真器復現時,往往發(fā)現PC指針已經
    的頭像 發(fā)表于 04-23 14:16 ?628次閱讀
    <b class='flag-5'>嵌入式</b>軟件安全解決之道-堆棧分析篇

    飛凌嵌入式ElfBoard-環(huán)境變量之刪除清空環(huán)境變量environ

    如同之前介紹environ獲取環(huán)境變量一樣;在加載進程的時候,系統會為每一個進程復制一份系統環(huán)境變量副本,可以直接通過將全局變量enviro
    發(fā)表于 03-26 10:23

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

    printf() 將 SHELL 環(huán)境變量的值以及描述信息打印到標準輸出。3.environ在加載進程的時候,系統會為每一個進程復制一份系統環(huán)境變量副本,并保存在
    發(fā)表于 03-13 08:50

    知識分享-嵌入式系統可靠性模型

    嵌入式系統可靠性設計技術及案例解析1.3嵌入式系統可靠性模型嵌入式系統可靠性模型分為兩種:串聯結
    的頭像 發(fā)表于 03-11 16:43 ?432次閱讀
    知識分享-<b class='flag-5'>嵌入式</b><b class='flag-5'>系統</b>可靠性模型

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

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

    嵌入式系統應用熱門的原因主要有幾個方面

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

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

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

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

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

    C語言全局變量重點使用

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

    什么是嵌入式操作系統?

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

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

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

    嵌入式系統的定義和應用領域

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

    嵌入式實時操作系統的特點

    實時嵌入式操作系統(Real-Time Embedded Operating System)是專門設計用于嵌入式系統的實時操作系統
    發(fā)表于 11-13 06:30

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

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

    運行在嵌入式系統上的emApps

    在當今快節(jié)奏的嵌入式系統世界中,靈活性和適應性是嵌入式系統實現的關鍵。SEGGER推出了其最新創(chuàng)新:Embedded apps(emApps)應用,類似于手機上的應用程序,可以運行在
    的頭像 發(fā)表于 06-18 09:53 ?1083次閱讀
    運行在<b class='flag-5'>嵌入式</b><b class='flag-5'>系統</b>上的emApps
    剑川县| 厦门市| 嘉义市| 岳西县| 大连市| 新绛县| 恩施市| 明光市| 古浪县| 门源| 定日县| 高平市| 巴楚县| 栾城县| 安义县| 仙游县| 陆河县| 五大连池市| 临清市| 抚州市| 临桂县| 迭部县| 贺州市| 辽中县| 东乡县| 花垣县| 公主岭市| 杭锦旗| 海宁市| 津南区| 栖霞市| 江陵县| 绥滨县| 阳江市| 崇礼县| 开远市| 岳池县| 潜山县| 页游| 张家口市| 开化县|