創客指南:MCU設計的最佳實踐和除錯技巧
發布時間:2017-03-16 責任編輯:sherry
【導讀】在本節中,SiliconLabs將分享在軟件開發方麵的經驗教訓。關鍵詞extern,staTIc和volaTIle都是什麼?你應該在你的代碼中使用遞歸還是malloc()?
1)查找硬件設備的現有軟件示例
kaifarenheqianrushijiejuefangandediyibushizhaodaokeyishininderenwugengjiandandeshili。ninzaizidingyijiejuefanganzhongzhaodaodetedingbufenderuanjianshilijiangbangzhuninyilingyizhongfangshi“查看”設備,並幫助您重新解釋設備規格,即使這些示例是針對其他計算機架構或軟件語言的。
2)編譯器的代碼
沒有完美的計算機軟件語言。所有語言都有自己的優勢和弱點。用於EFM32家族的Simplicity Studio中使用的軟件語言是C。C語言有著很長的曆史,它被廣泛信任,並且在嵌入式設計上表現良好,但是其語法及特性很難掌握。當你在C中編碼時,你實際上是為編譯器和其他構建工具編寫指令。記住這一點。C語言是“接近金屬”的語言,因為您的代碼在人類可讀格式下編寫的代碼,彙編代碼和二進製映像的構建過程的結果之間僅有幾個步驟。
C代碼具有嚴格的類型,要求某些變量匹配得足夠好以執行安全賦值。這是為了保護你不要做愚蠢的事情,比如變量(即指針)的(de)地(di)址(zhi)和(he)變(bian)量(liang)的(de)內(nei)容(rong)。但(dan)是(shi)經(jing)常(chang)在(zai)嵌(qian)入(ru)式(shi)開(kai)發(fa)中(zhong),您(nin)需(xu)要(yao)能(neng)夠(gou)將(jiang)純(chun)數(shu)字(zi)轉(zhuan)換(huan)為(wei)地(di)址(zhi),以(yi)便(bian)指(zhi)定(ding)寄(ji)存(cun)器(qi)地(di)址(zhi)。這(zhe)需(xu)要(yao)你(ni)熟(shu)悉(xi)類(lei)型(xing)轉(zhuan)換(huan),以(yi)告(gao)訴(su)編(bian)譯(yi)器(qi)你(ni)真(zhen)的(de)知(zhi)道(dao)你(ni)在(zai)做(zuo)什(shen)麼(me)。
3)使用描述性變量和函數名稱
你可以做的最好的事情是確保你的代碼設計得很好,使用描述性的變量和函數名。在C代碼中沒有與長名稱關聯的運行性能損失。當構建工具將C代碼轉換為二進製機器碼時,將刪除所有標識符。請考慮在FAT文件係統(FF)庫中找到的以下代碼段:

上(shang)麵(mian)的(de)代(dai)碼(ma)有(you)一(yi)些(xie)注(zhu)釋(shi),這(zhe)當(dang)然(ran)有(you)幫(bang)助(zhu),是(shi)一(yi)件(jian)非(fei)常(chang)好(hao)的(de)事(shi)情(qing),但(dan)是(shi)很(hen)難(nan)通(tong)過(guo)查(zha)看(kan)變(bian)量(liang),函(han)數(shu),枚(mei)舉(ju)和(he)預(yu)處(chu)理(li)符(fu)號(hao)知(zhi)道(dao)這(zhe)個(ge)代(dai)碼(ma)的(de)確(que)切(qie)原(yuan)因(yin)。考(kao)慮(lv)使(shi)用(yong)以(yi)下(xia)代(dai)碼(ma)作(zuo)為(wei)替(ti)代(dai):

是的,代碼有點寬,難以鍵入,但Simplicity Studio提供代碼完成與CTRL +空(kong)格(ge)鍵(jian)的(de)快(kuai)捷(jie)鍵(jian),你(ni)可(ke)以(yi)隨(sui)時(shi)剪(jian)切(qie)和(he)粘(zhan)貼(tie)。代(dai)碼(ma)可(ke)讀(du)性(xing)會(hui)增(zeng)強(qiang),需(xu)要(yao)更(geng)少(shao)的(de)尋(xun)找(zhao)變(bian)量(liang)名(ming)。我(wo)們(men)可(ke)以(yi)通(tong)過(guo)查(zha)看(kan)第(di)二(er)個(ge)例(li)子(zi)來(lai)說(shuo)明(ming),這(zhe)段(duan)代(dai)碼(ma)旨(zhi)在(zai)查(zha)看(kan)目(mu)標(biao)目(mu)錄(lu),並(bing)在(zai)找(zhao)到(dao)目(mu)標(biao)目(mu)錄(lu)中(zhong)的(de)已(yi)刪(shan)除(chu)(先前已填充但現在可用)或零(從未填充)短文件名條目時中斷。描述性名稱允許您像讀一段故事似得閱讀代碼,在你閱讀時告訴你目的。
4)嚴肅的對待注釋
一yi個ge好hao的de軟ruan件jian開kai發fa人ren員yuan在zai幾ji個ge關guan鍵jian的de地di方fang給gei代dai碼ma添tian加jia了le很hen多duo注zhu釋shi。注zhu釋shi,如ru長chang變bian量liang名ming,不bu影ying響xiang到dao運yun行xing時shi可ke執zhi行xing二er進jin製zhi文wen件jian的de文wen件jian大da小xiao,隻zhi是shi在zai那na裏li,以yi幫bang助zhu閱yue讀du文wen檔dang的de代dai碼ma。解jie決jue方fang案an中zhong每mei個ge文wen件jian的de頂ding部bu應ying說shuo明ming該gai文wen件jian的de目mu的de,並bing且qie在zai每mei個ge函han數shu的de頂ding部bu應ying有you較jiao長chang的de注zhu釋shi,說shuo明ming函han數shu的de用yong途tu以yi及ji描miao述shu輸shu入ru和he輸shu出chu。除chu了le這zhe些xie關guan鍵jian的de地di方fang,應ying該gai在zai逐zhu行xing的de基ji礎chu上shang使shi用yong注zhu釋shi,無wu論lun代dai碼ma的de意yi圖tu清qing不bu清qing楚chu。使shi用yong描miao述shu性xing變bian量liang名ming稱cheng可ke以yi幫bang助zhu解jie釋shi代dai碼ma的de目mu的de,並bing減jian少shao必bi要yao的de注zhu釋shi,使shi得de那na裏li的de注zhu釋shi更geng突tu出chu。相xiang信xin我wo,一yi年nian後hou你ni不bu會hui記ji得de當dang初chu寫xie代dai碼ma的de目mu的de,所suo以yi要yao重zhong視shi注zhu釋shi了le!
5)使用emlib庫
對於EFM32程序員,emlib庫是你的朋友。接入EFM32外設時,盡可能的調用這些庫。這些庫經過良好測試,並有額外的代碼來幫助尋找問題,而不僅僅是直接調整寄存器。
例如,以下代碼使用emlib庫:
TIMER_TopSet(TIMER3, 1000);
相同的事情可以通過預處理器定義尋址內存映射外設的寄存器來完成,定義TIMER3為0x40010C00。我們不使用這個地址,因為它很難被記住,但這是TIMER3映射在主內存中的地方。
TIMER3-》TOP = 1000;
所有外設以完全相同的方式映射到內存地址,因此有時您會看到使用此指針表示法的示例,而不是emlib庫函數。如果您將看到em_timer.h中的TIMER_TopSet函數定義,您將看到該函數與此示例完全相同,因此在這種情況下,庫函數沒有提供任何附加值。然而,使用emlib庫,有時會得到比簡單操作映射寄存器更多的功能。例如,CMU_ClockEnable函數在最終使用“bit band”命令確保寄存器位自動地設置之前,小心地代表您做出很多決定。盡可能頻繁地使用這些庫函數,以獲得所有EFM32庫設計師設計的便利性。
6)定義變量以避免堆棧和堆的問題
Cdexuduofangmianduiyufeizhuanyedechengxuyuanlaishuobingbumingxian,danzaiqianrushishejizhongyunxingdaimashibiandehenzhongyao。duiyuchuxuezhe,suoyoubendishengmingdebianliangdouzaizhanshang。zhexieshininzaihanshuhuorenhedaimakuaizhongdingyidebianliang。
堆棧是從“內存頂部”或物理RAMzhongzuigaokeyongdizhikaishideneicunquyu,ranhouxiangxiajishu,zhidaodadaoduizhanxianzhi。ruguonindingyiletaiduodejububianliang,huozhenindedaimatongguoshiyongdiguihuoqitaqiantaohanshudongtaichuangjianzhexiebianliang,namenindeduizhankongjianhuibeizhanman。
全局變量是在模塊級別的所有函數和其他代碼塊之外定義的變量。編譯器自動為heap上的全局聲明的變量分配內存,這是堆棧外的主內存池的一部分,如果您嚐試分配太多的RAM,將會產生編譯器錯誤。但是,在代碼中使用malloc()命令可以動態地在運行時在堆中分配RAM。
在具有有限RAM的嵌入式處理器上使用recursion或malloc()命令是一個冒險的任務!你必須理解你的代碼將需要多少遞歸嚐試(或malloc()調用)以便解決問題,然後設計一個永遠不會用盡堆棧空間的解決方案。
如ru果guo您nin在zai代dai碼ma中zhong定ding義yi所suo有you變bian量liang並bing讓rang編bian譯yi器qi確que定ding如ru何he自zi動dong管guan理li內nei存cun,您nin將jiang遇yu到dao較jiao少shao的de超chao出chu堆dui棧zhan或huo堆dui的de問wen題ti。即ji使shi有you這zhe樣yang的de預yu防fang措cuo施shi,如ru果guo你ni的de代dai碼ma幾ji乎hu是shi可ke用yong的deRAM大小,當你編譯和構建你的代碼,你將需要學習如何監視堆棧和堆的大小,這部分內容超出本節的範疇。
7)全局靜態變量和局部靜態變量的差異
使用關鍵字“static”定義的變量表示不同範圍的不同內容。在內部函數中,static關鍵字用在變量的前麵,以記住它在函數調用之間的值。它具有一種“粘性”,你ni可ke以yi在zai函han數shu的de第di一yi次ci調tiao用yong時shi初chu始shi化hua它ta,然ran後hou讓rang它ta保bao持chi其qi值zhi,而er不bu是shi每mei次ci函han數shu執zhi行xing時shi重zhong新xin初chu始shi化hua非fei靜jing態tai變bian量liang。在zai全quan局ju範fan圍wei,所suo有you變bian量liang都dou是shi“粘性”的,因為它們隻在運行時開始時初始化一次,然後記住它們的值。但是,放置在全局變量前麵的static關鍵字指示編譯器該變量對於該模塊是本地的,並且不被外部模塊使用。對於同一個“static”關鍵字,這是一個完全不同的含義。

8)volatile和extern的含義及如何相互影響
隻要變量和函數在模塊中未聲明為static,它ta們men就jiu可ke以yi在zai該gai模mo塊kuai外wai部bu使shi用yong,並bing在zai其qi他ta模mo塊kuai中zhong使shi用yong。為wei了le告gao訴su編bian譯yi器qi你ni打da算suan在zai模mo塊kuai中zhong使shi用yong相xiang同tong的de變bian量liang,你ni在zai一yi個ge模mo塊kuai中zhong定ding義yi一yi個ge常chang規gui方fang法fa的de變bian量liang,並bing在zai設she計ji中zhong所suo有you其qi他ta模mo塊kuai的de定ding義yi之zhi前qian添tian加jia關guan鍵jian字zi“extern”。xianzai,ninshejizhongdesuoyoumokuaidoukeyifangwentongyigebianliang。danshi,ruguoshejizhongdeqitamokuaizhongdeyigemokuaiyituxiugaizuichudingyideweizhizhiwaidebianliangdezhi,zebixuzaigaibianliangqianmiantianjiaguanjianzi“volatile”。這個volatile關鍵字告訴編譯器該變量可以在模塊之外更改,並阻止優化器刪除似乎沒有效果的語句。

此外,當使用Release版本和Debug版本時,使用volatile非常重要。當優化設置增加時,編譯器將主動嚐試壓縮不必要的代碼。這意味著您需要防止編譯器這樣做,通過使用volatile關鍵字可以改變當前範圍之外的任何變量。
特別推薦
- 噪聲中提取真值!瑞盟科技推出MSA2240電流檢測芯片賦能多元高端測量場景
- 10MHz高頻運行!氮矽科技發布集成驅動GaN芯片,助力電源能效再攀新高
- 失真度僅0.002%!力芯微推出超低內阻、超低失真4PST模擬開關
- 一“芯”雙電!聖邦微電子發布雙輸出電源芯片,簡化AFE與音頻設計
- 一機適配萬端:金升陽推出1200W可編程電源,賦能高端裝備製造
技術文章更多>>
- 邊緣AI的發展為更智能、更可持續的技術鋪平道路
- 每台智能體PC,都是AI時代的新入口
- IAR作為Qt Group獨立BU攜兩項重磅汽車電子應用開發方案首秀北京車展
- 構建具有網絡彈性的嵌入式係統:來自行業領袖的洞見
- 數字化的線性穩壓器
技術白皮書下載更多>>
- 車規與基於V2X的車輛協同主動避撞技術展望
- 數字隔離助力新能源汽車安全隔離的新挑戰
- 汽車模塊拋負載的解決方案
- 車用連接器的安全創新應用
- Melexis Actuators Business Unit
- Position / Current Sensors - Triaxis Hall
熱門搜索
SATA連接器
SD連接器
SII
SIM卡連接器
SMT設備
SMU
SOC
SPANSION
SRAM
SSD
ST
ST-ERICSSON
Sunlord
SynQor
s端子線
Taiyo Yuden
TDK-EPC
TD-SCDMA功放
TD-SCDMA基帶
TE
Tektronix
Thunderbolt
TI
TOREX
TTI
TVS
UPS電源
USB3.0
USB 3.0主控芯片
USB傳輸速度





