探秘嵌入式工程師的百寶箱!高可靠性嵌入式係統的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
軟件開發人員往往都是非常樂觀的一群人,隻要讓他們的代碼忠實地長時間地運行就可以了,僅此而已。微控製器tiaochuyingyongchengxukongjianbingzaifeiyuxiangdedaimakongjianzhongzhixingzhezhongqingkuangsihushixiangdangshaoyoude。raner,zhezhongqingkuangfashengdejihuibingbubihuancunyichuhuocuowuzhizhenshiquyinyongshao。taqueshihuifasheng!發生這種情況後的係統行為將是不確定的,因為默認情況下內存空間都是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)的de微wei控kong製zhi器qi係xi統tong中zhong都dou提ti供gong有you堆dui棧zhan監jian視shi器qi。可ke怕pa的de是shi,這zhe些xie功gong能neng默mo認ren都dou是shi關guan閉bi狀zhuang態tai,或huo者zhe經jing常chang被bei開kai發fa人ren員yuan有you意yi關guan閉bi。在zai網wang絡luo上shang快kuai速su搜sou尋xun一yi下xia可ke以yi發fa現xian,很hen多duo人ren建jian議yi關guan閉bi實shi時shi操cao作zuo係xi統tong中zhong的de堆dui棧zhan監jian視shi器qi以yi節jie省sheng56字節的閃存空間。等等,這可是得不償失的做法!
技巧#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)實現是,在看門狗被啟用之處(這是一個很好的開始),但也是可以用周期性定時器將該看門狗清零之處;定(ding)時(shi)器(qi)的(de)啟(qi)用(yong)是(shi)完(wan)全(quan)與(yu)程(cheng)序(xu)中(zhong)出(chu)現(xian)的(de)任(ren)何(he)情(qing)況(kuang)隔(ge)離(li)的(de)。使(shi)用(yong)看(kan)門(men)狗(gou)的(de)目(mu)的(de)是(shi)協(xie)助(zhu)確(que)保(bao)如(ru)果(guo)出(chu)現(xian)錯(cuo)誤(wu),看(kan)門(men)狗(gou)不(bu)會(hui)被(bei)清(qing)零(ling),即(ji)當(dang)工(gong)作(zuo)暫(zan)停(ting),係(xi)統(tong)會(hui)被(bei)迫(po)去(qu)執(zhi)行(xing)硬(ying)件(jian)重(zhong)設(she)定(ding)(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 - 避免易失存儲器分配
不bu習xi慣guan在zai資zi源yuan有you限xian環huan境jing下xia工gong作zuo的de工gong程cheng師shi,可ke能neng會hui試shi圖tu使shi用yong其qi編bian程cheng語yu言yan的de特te性xing,這zhe種zhong語yu言yan讓rang他ta們men可ke以yi使shi用yong易yi失shi存cun儲chu器qi分fen配pei。畢bi竟jing,這zhe是shi一yi種zhong常chang在zai計ji算suan器qi係xi統tong中zhong使shi用yong的de技ji術shu,在zai計ji算suan器qi係xi統tong中zhong,隻zhi有you在zai有you必bi要yao時shi,內nei存cun才cai會hui被bei分fen配pei。例li如ru,以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可編程電源,賦能高端裝備製造
技術文章更多>>
- 貿澤EIT係列新一期,探索AI如何重塑日常科技與用戶體驗
- 算力爆發遇上電源革新,大聯大世平集團攜手晶豐明源線上研討會解鎖應用落地
- 創新不止,創芯不已:第六屆ICDIA創芯展8月南京盛大啟幕!
- AI時代,為什麼存儲基礎設施的可靠性決定數據中心的經濟效益
- 矽典微ONELAB開發係列:為毫米波算法開發者打造的全棧工具鏈
技術白皮書下載更多>>
- 車規與基於V2X的車輛協同主動避撞技術展望
- 數字隔離助力新能源汽車安全隔離的新挑戰
- 汽車模塊拋負載的解決方案
- 車用連接器的安全創新應用
- Melexis Actuators Business Unit
- Position / Current Sensors - Triaxis Hall
熱門搜索




