創客指南: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)庫中找到的以下代碼段:

shangmiandedaimayouyixiezhushi,zhedangranyoubangzhu,shiyijianfeichanghaodeshiqing,danshihennantongguozhakanbianliang,hanshu,meijuheyuchulifuhaozhidaozhegedaimadequeqieyuanyin。kaolvshiyongyixiadaimazuoweitidai:

是的,代碼有點寬,難以鍵入,但Simplicity Studio提供代碼完成與CTRL +konggejiandekuaijiejian,nikeyisuishijianqiehezhantie。daimakeduxinghuizengqiang,xuyaogengshaodexunzhaobianliangming。womenkeyitongguozhakandiergelizilaishuoming,zheduandaimazhizaizhakanmubiaomulu,bingzaizhaodaomubiaomuluzhongdeyishanchu(先前已填充但現在可用)或零(從未填充)短文件名條目時中斷。描述性名稱允許您像讀一段故事似得閱讀代碼,在你閱讀時告訴你目的。
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。
堆棧是從“內存頂部”或物理RAM中zhong最zui高gao可ke用yong地di址zhi開kai始shi的de內nei存cun區qu域yu,然ran後hou向xiang下xia計ji數shu,直zhi到dao達da到dao堆dui棧zhan限xian製zhi。如ru果guo您nin定ding義yi了le太tai多duo的de局ju部bu變bian量liang,或huo者zhe您nin的de代dai碼ma通tong過guo使shi用yong遞di歸gui或huo其qi他ta嵌qian套tao函han數shu動dong態tai創chuang建jian這zhe些xie變bian量liang,那na麼me您nin的de堆dui棧zhan空kong間jian會hui被bei占zhan滿man。
全局變量是在模塊級別的所有函數和其他代碼塊之外定義的變量。編譯器自動為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)的(de)RAM大小,當你編譯和構建你的代碼,你將需要學習如何監視堆棧和堆的大小,這部分內容超出本節的範疇。
7)全局靜態變量和局部靜態變量的差異
使用關鍵字“static”定義的變量表示不同範圍的不同內容。在內部函數中,static關鍵字用在變量的前麵,以記住它在函數調用之間的值。它具有一種“粘性”,nikeyizaihanshudediyicitiaoyongshichushihuata,ranhourangtabaochiqizhi,erbushimeicihanshuzhixingshizhongxinchushihuafeijingtaibianliang。zaiquanjufanwei,suoyoubianliangdoushi“粘性”的,因為它們隻在運行時開始時初始化一次,然後記住它們的值。但是,放置在全局變量前麵的static關鍵字指示編譯器該變量對於該模塊是本地的,並且不被外部模塊使用。對於同一個“static”關鍵字,這是一個完全不同的含義。

8)volatile和extern的含義及如何相互影響
隻要變量和函數在模塊中未聲明為static,tamenjiukeyizaigaimokuaiwaibushiyong,bingzaiqitamokuaizhongshiyong。weilegaosubianyiqinidasuanzaimokuaizhongshiyongxiangtongdebianliang,nizaiyigemokuaizhongdingyiyigechangguifangfadebianliang,bingzaishejizhongsuoyouqitamokuaidedingyizhiqiantianjiaguanjianzi“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
熱門搜索
Future
GFIVE
GPS
GPU
Harting
HDMI
HDMI連接器
HD監控
HID燈
I/O處理器
IC
IC插座
IDT
IGBT
in-cell
Intersil
IP監控
iWatt
Keithley
Kemet
Knowles
Lattice
LCD
LCD模組
LCR測試儀
lc振蕩器
Lecroy
LED
LED保護元件
LED背光




