探秘嵌入式工程師的百寶箱!高可靠性嵌入式係統的7大技巧
發布時間:2015-03-25 責任編輯:echolady
【導讀】高gao可ke靠kao性xing代dai碼ma並bing非fei一yi蹴cu而er就jiu的de,這zhe是shi每mei個ge嵌qian入ru式shi開kai發fa工gong程cheng師shi都dou需xu要yao經jing曆li的de艱jian難nan過guo程cheng。設she計ji過guo程cheng中zhong,開kai發fa人ren員yuan需xu要yao維wei護hu並bing管guan理li係xi統tong的de每mei個ge比bi特te和he字zi節jie。本ben文wen就jiu探tan秘mi嵌qian入ru式shi工gong程cheng師shi的de百bai寶bao箱xiang,揭jie秘mi嵌qian入ru式shi係xi統tong設she計ji的de7大技巧。
從規範完善的開發周期到嚴格執行和係統檢查,開發高可靠性嵌入式係統的技術有許多種。本文介紹了7個易操作且可以長久使用的技巧,它們對於確保係統更加可靠地運行並捕獲異常行為大有幫助。
技巧#1——用已知值填充ROM
軟件開發人員往往都是非常樂觀的一群人,隻要讓他們的代碼忠實地長時間地運行就可以了,僅此而已。微控製器跳(tiao)出(chu)應(ying)用(yong)程(cheng)序(xu)空(kong)間(jian)並(bing)在(zai)非(fei)預(yu)想(xiang)的(de)代(dai)碼(ma)空(kong)間(jian)中(zhong)執(zhi)行(xing)這(zhe)種(zhong)情(qing)況(kuang)似(si)乎(hu)是(shi)相(xiang)當(dang)少(shao)有(you)的(de)。然(ran)而(er),這(zhe)種(zhong)情(qing)況(kuang)發(fa)生(sheng)的(de)機(ji)會(hui)並(bing)不(bu)比(bi)緩(huan)存(cun)溢(yi)出(chu)或(huo)錯(cuo)誤(wu)指(zhi)針(zhen)失(shi)去(qu)引(yin)用(yong)少(shao)。它(ta)確(que)實(shi)會(hui)發(fa)生(sheng)!發生這種情況後的係統行為將是不確定的,因為默認情況下內存空間都是0xFF,或者由於內存區通常沒有寫過,其中的值可能隻有上帝才知道。
不過有相當完備的linker或IDE技巧可以用來幫助識別這樣的事件並從中恢複係統。技巧就是使用FILL命令對未用ROM填tian充chong已yi知zhi的de位wei模mo式shi。要yao填tian充chong未wei使shi用yong的de內nei存cun,有you很hen多duo不bu同tong的de可ke能neng組zu合he可ke以yi使shi用yong,但dan如ru果guo是shi想xiang建jian立li更geng加jia可ke靠kao的de係xi統tong,最zui明ming顯xian的de選xuan擇ze是shi在zai這zhe些xie位wei置zhi放fang置zhiISR fault handler。如果係統出了某些差錯,處理器開始執行程序空間以外的代碼,就會觸發ISR,並在決定校正行動之前提供儲存處理器、寄存器和係統狀態的機會。
技巧#2——檢查應用程序的CRC
對嵌入式工程師來說一個很大的好處是,我們的IDE和工具鏈可以自動產生應用程序或內存空間校驗和(Checksum),從而根據這個校驗和驗證應用程序是否完好。有趣的是,在許多這些案例中,隻有在將程序代碼加載到設備時,才會用到校驗和。
然而,如果CRC或校驗和保持在內存中,那麼驗證應用程序在啟動時(或甚至對長時間運行的係統定期驗證)是(shi)否(fou)仍(reng)然(ran)完(wan)好(hao)是(shi)確(que)保(bao)意(yi)外(wai)之(zhi)事(shi)不(bu)會(hui)發(fa)生(sheng)的(de)極(ji)好(hao)途(tu)徑(jing)。現(xian)在(zai)一(yi)個(ge)編(bian)程(cheng)過(guo)的(de)應(ying)用(yong)程(cheng)序(xu)發(fa)生(sheng)改(gai)變(bian)的(de)概(gai)率(lv)是(shi)很(hen)小(xiao)的(de),但(dan)考(kao)慮(lv)每(mei)年(nian)交(jiao)付(fu)的(de)數(shu)十(shi)億(yi)個(ge)微(wei)控(kong)製(zhi)器(qi)以(yi)及(ji)可(ke)能(neng)惡(e)劣(lie)的(de)工(gong)作(zuo)環(huan)境(jing),應(ying)用(yong)程(cheng)序(xu)崩(beng)潰(kui)的(de)機(ji)會(hui)並(bing)不(bu)是(shi)零(ling)。更(geng)有(you)可(ke)能(neng)的(de)是(shi),係(xi)統(tong)中(zhong)的(de)一(yi)個(ge)缺(que)陷(xian)可(ke)能(neng)導(dao)致(zhi)某(mou)一(yi)扇(shan)區(qu)發(fa)生(sheng)閃(shan)存(cun)寫(xie)入(ru)或(huo)閃(shan)存(cun)擦(ca)除(chu),從(cong)而(er)破(po)壞(huai)應(ying)用(yong)程(cheng)序(xu)的(de)完(wan)整(zheng)性(xing)。
技巧#3——在啟動時執行RAM檢查
為了建立一個更加可靠和紮實的係統,確保係統硬件正常工作非常重要。畢竟硬件會發生故障。(幸運的是軟件永遠不會發生故障,軟件隻會做代碼要它做的事,不管是正確的還是錯誤的)。在啟動時驗證RAM的內部或外部沒有問題,是確保硬件可以如預期般運作的一個好方法。
有許多不同的方法可用於執行RAM檢查,但常用的方法是寫入一個已知的模式,然後等上一小段時間再回讀。結果應該是所讀就是所寫。真相是,在大多數情況下RAM檢查是通過的,這也是我們想要的結果。但也有極小的可能性檢查不通過,這時就為係統標示出硬件問題提供了極好的機會。
技巧#4——使用堆棧監視器
對(dui)許(xu)多(duo)的(de)嵌(qian)入(ru)式(shi)開(kai)發(fa)者(zhe)而(er)言(yan),堆(dui)棧(zhan)似(si)乎(hu)是(shi)一(yi)股(gu)相(xiang)當(dang)神(shen)秘(mi)的(de)力(li)量(liang)。當(dang)奇(qi)怪(guai)的(de)事(shi)情(qing)開(kai)始(shi)發(fa)生(sheng),工(gong)程(cheng)師(shi)終(zhong)於(yu)被(bei)難(nan)倒(dao)了(le),他(ta)們(men)開(kai)始(shi)思(si)考(kao),也(ye)許(xu)堆(dui)棧(zhan)中(zhong)發(fa)生(sheng)了(le)什(shen)麼(me)事(shi)。結(jie)果(guo)是(shi)盲(mang)目(mu)地(di)調(tiao)整(zheng)堆(dui)棧(zhan)的(de)大(da)小(xiao)和(he)位(wei)置(zhi)等(deng)等(deng)。但(dan)該(gai)錯(cuo)誤(wu)往(wang)往(wang)是(shi)與(yu)堆(dui)棧(zhan)無(wu)關(guan)的(de),但(dan)怎(zen)能(neng)如(ru)此(ci)確(que)定(ding)?畢(bi)竟(jing),有(you)多(duo)少(shao)工(gong)程(cheng)師(shi)真(zhen)的(de)實(shi)際(ji)執(zhi)行(xing)過(guo)最(zui)壞(huai)情(qing)況(kuang)下(xia)的(de)堆(dui)棧(zhan)大(da)小(xiao)分(fen)析(xi)?
堆棧大小是在編譯時就靜態分配好的,但堆棧是以動態的方式使用的。隨著代碼的執行,應用程序需要的變量、返fan回hui的de地di址zhi和he其qi它ta信xin息xi被bei不bu斷duan存cun儲chu在zai堆dui棧zhan中zhong。這zhe種zhong機ji製zhi導dao致zhi堆dui棧zhan在zai其qi分fen配pei的de內nei存cun中zhong不bu斷duan增zeng長chang。然ran而er,這zhe種zhong增zeng長chang有you時shi會hui超chao出chu編bian譯yi時shi確que定ding的de容rong量liang極ji限xian,導dao致zhi堆dui棧zhan破po壞huai相xiang鄰lin內nei存cun區qu域yu的de數shu據ju。
絕對確保堆棧正常工作的一種方法是實現堆棧監視器,將它作為係統“保健”代碼的一部分(有多少工程師會這樣做?)。堆棧監視器會在堆棧和“其它”內(nei)存(cun)區(qu)域(yu)之(zhi)間(jian)創(chuang)建(jian)一(yi)個(ge)緩(huan)衝(chong)區(qu)域(yu),並(bing)填(tian)充(chong)已(yi)知(zhi)的(de)位(wei)模(mo)式(shi)。然(ran)後(hou)監(jian)視(shi)器(qi)會(hui)不(bu)斷(duan)的(de)監(jian)視(shi)圖(tu)案(an)是(shi)否(fou)有(you)任(ren)何(he)變(bian)化(hua)。如(ru)果(guo)該(gai)位(wei)模(mo)式(shi)發(fa)生(sheng)了(le)改(gai)變(bian),那(na)就(jiu)意(yi)味(wei)著(zhe)堆(dui)棧(zhan)增(zeng)長(chang)得(de)太(tai)大(da)了(le),即(ji)將(jiang)要(yao)把(ba)係(xi)統(tong)推(tui)向(xiang)黑(hei)暗(an)地(di)獄(yu)!此時監視器可以記錄事件的發生、係統狀態以及任何其它有用的數據,供日後用於問題的診斷。
大多數實時操作係統(RTOS)或實現了內存保護單元(MPU)deweikongzhiqixitongzhongdoutigongyouduizhanjianshiqi。kepadeshi,zhexiegongnengmorendoushiguanbizhuangtai,huozhejingchangbeikaifarenyuanyouyiguanbi。zaiwangluoshangkuaisusouxunyixiakeyifaxian,henduorenjianyiguanbishishicaozuoxitongzhongdeduizhanjianshiqiyijiesheng56字節的閃存空間。等等,這可是得不償失的做法!
技巧#5 - 使用MPU
在過去,是很難在一個小而廉價的微控製器中找到內存保護單元(MPU)的,但這種情況已經開始改變。現在從高端到低端的微控製器都已經有MPU,而這些MPU為嵌入式軟件開發人員提供了一個可以大幅提高其固件(firmware)魯棒性(robustness)的機會。
MPU 已逐漸與操作係統耦合,以便建立內存空間,其中的處理都分開,或任務可執行其代碼,而不用擔心被stomped on。倘(tang)若(ruo)真(zhen)有(you)事(shi)情(qing)發(fa)生(sheng),不(bu)受(shou)控(kong)製(zhi)的(de)處(chu)理(li)會(hui)被(bei)取(qu)消(xiao),也(ye)會(hui)執(zhi)行(xing)其(qi)他(ta)的(de)保(bao)護(hu)措(cuo)施(shi)。請(qing)留(liu)意(yi)帶(dai)有(you)這(zhe)種(zhong)組(zu)件(jian)的(de)微(wei)控(kong)製(zhi)器(qi),如(ru)果(guo)有(you),請(qing)多(duo)加(jia)利(li)用(yong)它(ta)的(de)這(zhe)種(zhong)特(te)性(xing)。
技巧#6 - 建立一個強大的看門狗係統
你經常會發現的一種總是最受喜愛的看門狗(watchdog)實現是,在看門狗被啟用之處(這是一個很好的開始),但也是可以用周期性定時器將該看門狗清零之處;dingshiqideqiyongshiwanquanyuchengxuzhongchuxianderenheqingkuanggelide。shiyongkanmengoudemudeshixiezhuquebaoruguochuxiancuowu,kanmengoubuhuibeiqingling,jidanggongzuozanting,xitonghuibeipoquzhixingyingjianzhongsheding(hardware reset),以便恢複。使用與係統活動獨立的定時器可以讓看門狗保持清零,即使係統已失效。
duiyingyongrenwuruhezhenghedaokanmengouxitongzhong,qianrushikaifarenyuanxuyaozaixikaolvhesheji。liru,youzhongjishukenengkeyirangmeigezaiyidingshiqineiyunxingderenwubiaoshitamenkeyichenggongdiwanchengqiren 務(wu)。在(zai)此(ci)事(shi)件(jian)中(zhong),看(kan)門(men)狗(gou)不(bu)被(bei)清(qing)零(ling),強(qiang)製(zhi)被(bei)複(fu)位(wei)。還(hai)有(you)一(yi)些(xie)比(bi)較(jiao)先(xian)進(jin)的(de)技(ji)術(shu),像(xiang)是(shi)使(shi)用(yong)外(wai)部(bu)看(kan)門(men)狗(gou)處(chu)理(li)器(qi),它(ta)可(ke)用(yong)來(lai)監(jian)視(shi)主(zhu)處(chu)理(li)器(qi)如(ru)何(he)表(biao)現(xian),反(fan)之(zhi)亦(yi)然(ran)。
對(dui)一(yi)個(ge)可(ke)靠(kao)的(de)係(xi)統(tong)而(er)言(yan),建(jian)立(li)一(yi)個(ge)強(qiang)大(da)的(de)看(kan)門(men)狗(gou)係(xi)統(tong)是(shi)很(hen)重(zhong)要(yao)的(de)。由(you)於(yu)有(you)太(tai)多(duo)的(de)技(ji)術(shu),難(nan)以(yi)在(zai)這(zhe)幾(ji)個(ge)段(duan)落(luo)中(zhong)完(wan)全(quan)涵(han)蓋(gai),但(dan)針(zhen)對(dui)此(ci)一(yi)議(yi)題(ti),筆(bi)者(zhe)未(wei)來(lai)還(hai)會(hui)發(fa)表(biao)相(xiang)關(guan)的(de)文(wen)章(zhang)。
技巧#7 - 避免易失存儲器分配
buxiguanzaiziyuanyouxianhuanjingxiagongzuodegongchengshi,kenenghuishitushiyongqibianchengyuyandetexing,zhezhongyuyanrangtamenkeyishiyongyishicunchuqifenpei。bijing,zheshiyizhongchangzaijisuanqixitongzhongshiyongdejishu,zaijisuanqixitongzhong,zhiyouzaiyoubiyaoshi,neicuncaihuibeifenpei。liru,yiC開發時,工程師可能傾向於使用malloc來分配在堆(heap)上的空間。有一個操 作會執行,一旦完成,可以使用free將被分配的內存返回,以便堆的使用。
在資源受限的係統,這可能是一場災難!shiyongyishicunchuqifenpeideqizhongyigewentishi,cuowuhuobudangdejishukenenghuidaozhineicunxielouhuoneicunsuipian。ruguochuxianzhexiewentishi,daduoshudeqianrushixitongbingmeiyou 資(zi)源(yuan)或(huo)知(zhi)識(shi)來(lai)監(jian)視(shi)堆(dui)或(huo)妥(tuo)善(shan)地(di)處(chu)理(li)它(ta)。而(er)當(dang)它(ta)們(men)發(fa)生(sheng)時(shi),如(ru)果(guo)應(ying)用(yong)程(cheng)序(xu)提(ti)出(chu)對(dui)空(kong)間(jian)的(de)要(yao)求(qiu),但(dan)卻(que)沒(mei)有(you)所(suo)請(qing)求(qiu)的(de)空(kong)間(jian)可(ke)以(yi)使(shi)用(yong),會(hui)發(fa)生(sheng)什(shen)麼(me)事(shi)呢(ne)?
使用易失存儲器分配所產生的問題是很複雜的,要妥善處理這些問題,可以說是一個噩夢!一種替代的方法是,直接以靜態的方式,簡化內存的分配。例如,隻要在 程序中簡單地建立一個大小為256字節長的緩衝區,而不是經由malloc請求這樣大小的內存緩衝區。此一分配的內存可在整個應用程序的生命周期期 間保持,且不會有堆或內存碎片問題方麵的顧慮。
結語
這些都隻是一些可以讓開發人員開始建立更可靠嵌入式係統的方法。另外還有很多其他技術,例如利用良好的編碼標準、位翻轉的監測、執行數組和指針邊界檢查,及使用斷言等。所有這些技術都是讓設計者可以開發出可靠性更高嵌入式係統的秘訣。
相關閱讀:
QNX無線架構為嵌入式係統帶來智能手機的連接性
選型必備:嵌入式應用中存儲器的選型秘籍
電路天天讀:CAN總線與以太網的嵌入式網關電路的設計與實現
特別推薦
- 噪聲中提取真值!瑞盟科技推出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傳輸速度



