色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

C語言開發單片機為啥都是全局變量形式?

GReq_mcu168 ? 來源:玩轉單片機 ? 2020-08-05 10:35 ? 次閱讀

前言

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

1. 做控制的工程師

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

做控制的工程師特點

他們普遍的理解就是“變量都寫成全局該有多方便”。我之前面試過一個非常有名的做控制實驗室里出來的PhD/Master,前前后后陸續有快十個人。面試問題是用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;} 代碼的特點就是所有的變量一定定義在函數外面。問他們為什么,回答是“全局變量方便調試”。 事實上在學校里做搞自動控制的人最重要的根本就是控制的結果,而不是代碼本身。代碼只要能工作就行。變量名污染,低耦合之類的和他們就不在同一個世界。進了公司有些人代碼質量會變好,但有的還是會延續之前的習慣。前公司代碼庫里面凡是看不懂的代碼一律都是那一兩個Control Engineer寫的,寫完了還會用自己的名字給函數命名的那種。 要成為一個資深的嵌入式工程師相當難,一方面要有非常扎實的理論知識,同時也要有相當的那種大型的、高頻CPU、多層PCB板的設計經驗。嵌入式硬件工程師要學的課程主要有模擬電路設計、數字電路設計、電磁波理論等。熟悉常用的放大電路、濾波電路、電源電路設計和分析。

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

代碼的特點就是所有的靜態變量都不可以定義在.h文件里,必須寫在.c文件里以確保別的文件沒法訪問它們。 別的文件真要訪問怎么辦?那就給每一個變量寫get/set函數啊!問題是靜態變量寫在.c文件里編譯器是沒法優化get/set的。結果就大面積的變量訪問要花幾倍的CPU時間去做get/set的函數調用。嵌入式項目很多情況下對硬件的壓榨是很極端的,CPU利用率90%都不算什么,頂到97%都是有的。(注意下這些項目是實時性要求很高的,晚一個毫秒算不完都不行。不是跑在電腦上鼠標卡一卡也無所謂的。)然后為了封裝性,在代碼里面塞這么多get/set嗎?

總結

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

如果只是文件內調用,全局變量只能寫在這個.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非常不友好。

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

    關注

    5090

    文章

    19176

    瀏覽量

    306938
  • C語言
    +關注

    關注

    180

    文章

    7614

    瀏覽量

    137442
  • 代碼
    +關注

    關注

    30

    文章

    4823

    瀏覽量

    68904

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

文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    單片機編程語言有哪些選擇

    常用的單片機編程語言,以及它們的特點和應用場景: 1. C語言 特點 :C語言是一種通用的編程
    的頭像 發表于 11-01 14:13 ?877次閱讀

    單片機STM32可以用Python寫嗎?可以的開發板有哪些?

    可以使用Python進行開發,并分析市面上支持Python開發單片機開發板。首先,傳統的STM32單片機主要使用
    的頭像 發表于 09-05 08:00 ?4288次閱讀
    <b class='flag-5'>單片機</b>STM32可以用Python寫嗎?可以的<b class='flag-5'>開發</b>板有哪些?

    linux開發板和單片機開發的區別

    、PIC等,處理能力和內存容量相對較低。 操作系統 Linux開發板通常使用Linux操作系統,具有豐富的軟件資源和開發工具。單片機開發則通常使用嵌入式操作系統或無操作系統,軟件資源和
    的頭像 發表于 08-30 15:30 ?1109次閱讀

    單片機上位軟件用什么開發

    開發單片機上位軟件時,選擇合適的開發工具和編程語言至關重要。本文將詳細介紹單片機上位軟件
    的頭像 發表于 06-07 09:17 ?1568次閱讀

    LABVIEW調用DLL,DLL中包含全局變量不識別的問題

    頭文件中寫法如上,.cpp文件中寫法如下 導入DLL時,錯誤如下 這個報錯就很沒有道理 我在同樣的文件中按同樣的寫法,寫一個add(a,b,c)函數,同樣寫全局變量的話,它就不會報這樣的錯,所以我可以排除是頭文件或者預處理定義的問題。 很頭疼,有沒有大神指導一下。
    發表于 05-31 09:37

    STM32單片機有哪幾種常見的開發環境?

    STM32單片機是一款廣泛應用于嵌入式系統開發單片機,針對其開發,有以下幾種常見的方式:STM32單片機有哪幾種常見的
    的頭像 發表于 05-18 08:04 ?3248次閱讀
    STM32<b class='flag-5'>單片機</b>有哪幾種常見的<b class='flag-5'>開發</b>環境?

    請問大家開發單片機都用的什么開發工具呢?

    大家開發單片機都用的什么開發工具呢?
    發表于 05-16 07:05

    建立更多的全局變量的時候,如何使得PROGRAM SIZE不增大呢?

    今天發現,建立更多的全局變量的時候,PROGRAM SIZE同時也增大了,如何使得PROGRAM SIZE不增大呢?我對全局變量的初始化無要求。
    發表于 05-15 06:30

    使用IAR定義全局變量出現兩個同名不同地址變量是什么原因導致的?

    使用IAR定義全局變量出現兩個同名不同地址變量 systickCount和systickFlag都在另一個c文件里定義的,假設a.c,然后在a.h里聲明為外部
    發表于 05-10 06:09

    請問stm32程序中如何優化大量的編譯開關和全局變量?

    剛接手一個程序,發現里面存在大量的編譯開關和定義了大量的全局變量,感覺這些顯得很是臃腫,有什么方法可以優化一下這些編譯開關和全局變量? 全局變量是一個個的標志位,有時候還會有條件嵌套。
    發表于 05-06 06:35

    你是不是也沒躲過這個坑?用了太多全局變量......

    全局變量太多有哪些弊端?該如何規避,以及如何管理全局變量等。一、全局變量太多有哪些弊端?真正做過項目的同學應該都能明白,項目中全局變量太多,會存在很多問題。這里給大家羅列一些太多
    的頭像 發表于 05-01 08:10 ?579次閱讀
    你是不是也沒躲過這個坑?用了太多<b class='flag-5'>全局變量</b>......

    全局變量太多有哪些弊端?

    隨著全局變量的增多,不同模塊的變量名可能會產生沖突或混淆,導致代碼難以理解和維護。同時,全局變量使得代碼中的依賴關系變得復雜,難以追蹤和理解。這增加了新開發人員的學習成本,也增加了修改
    發表于 04-24 09:15 ?940次閱讀

    為什么很少用C++開發單片機

    C語言是面向過程的語言C++是面向對象的編程語言。結合本文來說,面向過程相比面向對象的編程,生成代碼量(bin文件)更小,運行效率更高。
    發表于 03-25 14:26 ?1124次閱讀
    為什么很少用<b class='flag-5'>C</b>++<b class='flag-5'>開發單片機</b>

    Tc38x中全局變量訪問只能是不帶cache的地址嗎?

    全局變量只能放置在不帶cache的地址么?
    發表于 02-06 08:17

    使用Tasking編譯器生成的map文件中找不到靜態全局變量的地址怎么解決 ?

    使用Tasking編譯器生成的map文件中找不到靜態全局變量的地址(變量在函數中已經使用),請問怎么解決
    發表于 02-06 07:21
    主站蜘蛛池模板: 国产精品日韩欧美一区二区三区 | 天美传媒色情原创精品 | 亚洲青青草 | 美女裸露100%奶头视频 | 69丰满少妇AV无码区 | 亚洲色综合狠狠综合区 | 一区三区不卡高清影视 | 国产成久久免费精品AV片天堂 | 韩国女主播内部vip自带氏巾 | 亚洲精品久久久久中文字幕二区 | 国产成人精品精品欧美 | 一本久道久久综合狠狠躁AV | 《乳色吐息》无删减版在线观看 | 2017最新伦理伦理片67 | 国产99久久九九精品无码不卡 | 国产午夜免费不卡精品理论片 | 果冻传媒在线观看高清完整免费 | 翘臀后进美女白嫩屁股视频 | 嫩草影院未满十八岁禁止入内 | 韩国无遮羞禁动漫在线观看 | 影音先锋色小姐 | gogo亚洲肉体艺术照片9090 | 嫩草影院在线观看网站成人 | 亚洲刺激视频 | 欧美做真爱欧免费看 | 青柠在线观看免费播放电影 | 办公室日本肉丝OL在线 | 99久久精品一区二区三区 | 我不卡影院手机在线观看 | 蜜臀AV精品一区二区三区 | 99久久久免费精品免费 | 5566av资源| 国产亚洲欧洲日韩在线观看 | 一个人高清在线观看日本免费 | 免费毛片在线视频 | 国产亚洲精品首页在线播放 | www伊人网 | 91原创在线 | 午夜AV内射一区二区三区红桃视 | 国产婷婷午夜精品无码A片 国产婷婷色综合AV蜜臀AV | 四虎精品久久久久影院 |