嵌入式軟件設計處處是坑,確保可靠性有這些絕招
發布時間:2017-03-28 責任編輯:susan
【導讀】硬(ying)件(jian)叱(chi)吒(zha)江(jiang)湖(hu),軟(ruan)件(jian)通(tong)過(guo)控(kong)製(zhi)硬(ying)件(jian)來(lai)統(tong)治(zhi)江(jiang)湖(hu)。如(ru)今(jin),有(you)電(dian)子(zi)的(de)地(di)方(fang)就(jiu)有(you)嵌(qian)入(ru)式(shi)軟(ruan)件(jian),有(you)電(dian)子(zi)故(gu)障(zhang)的(de)地(di)方(fang),也(ye)就(jiu)有(you)嵌(qian)入(ru)式(shi)軟(ruan)件(jian)設(she)計(ji)缺(que)陷(xian)的(de)影(ying)子(zi)。我(wo)們(men)今(jin)天(tian)就(jiu)把(ba)軟(ruan)件(jian)所(suo)容(rong)易(yi)犯(fan)的(de)錯(cuo)誤(wu)和(he)規(gui)避(bi)的(de)方(fang)法(fa)一(yi)一(yi)羅(luo)列(lie),並(bing)給(gei)出(chu)應(ying)對(dui)之(zhi)法(fa)。
嵌qian入ru式shi軟ruan件jian的de最zui大da特te點dian是shi以yi控kong製zhi為wei主zhu,軟ruan硬ying結jie合he的de較jiao多duo,功gong能neng性xing的de操cao作zuo較jiao多duo,模mo塊kuai相xiang互hu間jian調tiao用yong的de較jiao多duo,外wai部bu工gong作zuo環huan境jing複fu雜za容rong易yi受shou到dao幹gan擾rao或huo幹gan擾rao別bie的de設she備bei,且qie執zhi行xing錯cuo誤wu的de後hou果guo不bu僅jin僅jin是shi數shu據ju錯cuo誤wu而er是shi有you可ke能neng導dao致zhi不bu可ke估gu量liang的de災zai難nan,所suo以yi總zong結jie起qi來lai,嵌qian入ru式shi軟ruan件jian可ke靠kao性xing設she計ji需xu注zhu意yi的de問wen題ti有you四si個ge方fang麵mian:
1、軟件接口
先說軟件接口中容易出問題的地方和編程人員容易犯的錯誤。
軟件接口調用一般會有數據的賦值,賦值變量的數據類型可能會存在強製的數據轉換;需加以檢查。如果為了防範出問題的話,可以添加對數據範圍和數據類型的檢查。
賦值數據的數量不對路,多了少了的都不好,會出現意外的賦值結果,不過還好,這項錯誤比較好檢查。
軟ruan件jian編bian程cheng中zhong,會hui有you對dui某mou一yi功gong能neng操cao作zuo代dai碼ma的de複fu用yong,比bi如ru對dui某mou個ge端duan口kou的de數shu據ju檢jian查zha和he控kong製zhi,在zai整zheng個ge程cheng序xu中zhong隻zhi會hui發fa生sheng兩liang次ci,為wei了le圖tu省sheng事shi,可ke能neng就jiu直zhi接jie把ba該gai段duan代dai碼ma直zhi接jie插cha入ru實shi際ji程cheng序xu模mo塊kuai中zhong去qu了le,這zhe樣yang,在zai源yuan程cheng序xu代dai碼ma中zhong,就jiu出chu現xian了le兩liang段duan完wan全quan相xiang同tong,完wan成cheng相xiang同tong功gong能neng,隻zhi是shi服fu務wu於yu不bu同tong模mo塊kuai的de代dai碼ma,按an道dao理li來lai說shuo,這zhe樣yang設she計ji其qi實shi也ye沒mei啥sha問wen題ti,是shi的de,你ni沒mei錯cuo,但dan你ni的de行xing為wei會hui使shi別bie人ren無wu意yi中zhong犯fan錯cuo。有you人ren會hui說shuo了le,我wo這zhe樣yang寫xie代dai碼ma怎zen麼me就jiu算suan引yin誘you呢ne?原yuan因yin是shi程cheng序xu可ke能neng會hui升sheng級ji,你ni這zhe幾ji行xing代dai碼ma在zai實shi際ji應ying用yong過guo程cheng中zhong也ye不bu能neng保bao證zheng是shi盡jin善shan盡jin美mei的de,發fa現xian不bu完wan善shan的de地di方fang後hou,勢shi必bi會hui修xiu改gai,如ru果guo你ni還hai能neng想xiang得de起qi來lai,可ke能neng不bu會hui遺yi漏lou,如ru果guo修xiu改gai此ci代dai碼ma的de是shi別bie的de人ren,改gai了le一yi個ge地di方fang,別bie的de地di方fang沒mei改gai,是shi不bu是shi還hai留liu著zhe隱yin患huan?那na如ru何he做zuo呢ne?方fang法fa不bu難nan,把ba這zhe段duan功gong能neng單dan獨du做zuo成cheng一yi個ge模mo塊kuai即ji可ke,對dui此ci端duan口kou的de讀du取qu和he控kong製zhi賦fu值zhi均jun由you此ci獨du立li模mo塊kuai完wan成cheng,如ru果guo數shu據ju的de正zheng確que性xing影ying響xiang大da的de話hua,還hai需xu要yao對dui端duan口kou數shu據ju的de正zheng確que性xing進jin行xing檢jian查zha和he判pan斷duan。嵌qian入ru式shi軟ruan件jian可ke靠kao性xing編bian程cheng方fang法fa的de四si個ge目mu的de是shi防fang錯cuo、判錯、糾錯、容錯。對端口數據的判斷屬於判錯的內容。
2、軟硬件接
硬件,對外的執行都靠它來實現,一旦出現問題,執行後的後果就不可控了,但如何注意呢?
對讀進來的硬件接口的數據要判斷其真偽;
對輸出的數據的執行效果要檢測;
duishuchudeshujudekenenghouguoyaojinxingyufangxingsheji,shujushuchudeguocheng,womencongshejishangyaozuoyigefenxi,fenxidesilushiyibanrongyijuxianzaiwentaiguocheng,hushileguoduguocheng。julishuoming,biruwomenkongzhiyigezhiludegongdian,congruanjiankongzhilaishuo,zhijiegei繼電器一個啟動信號,讓開狀態的觸點閉合就可以了,非“關”即“開”,是受控繼電器的兩個穩態狀態,但事實上,在從開到閉合的過程中,支路供電的電壓並不是一個簡單0V—24V(24V為示例而已)的跳變狀態,而是一個抖動,有衝擊信號的過程,這種情況在硬件上的防護是必不可少的,但在軟件上也不是可以事不關己、高高掛起的。
另(ling)外(wai)在(zai)邏(luo)輯(ji)上(shang),宜(yi)將(jiang)容(rong)易(yi)被(bei)幹(gan)擾(rao)和(he)容(rong)易(yi)產(chan)生(sheng)的(de)幹(gan)擾(rao)控(kong)製(zhi)動(dong)作(zuo)從(cong)時(shi)序(xu)上(shang)控(kong)製(zhi)好(hao),予(yu)以(yi)分(fen)開(kai)隔(ge)離(li)。比(bi)如(ru),控(kong)製(zhi)繼(ji)電(dian)器(qi)的(de)過(guo)程(cheng)是(shi)容(rong)易(yi)產(chan)生(sheng)抖(dou)動(dong)尖(jian)峰(feng)脈(mai)衝(chong)而(er)幹(gan)擾(rao)數(shu)據(ju)總(zong)線(xian)和(he)控(kong)製(zhi)信(xin)號(hao)總(zong)線(xian)的(de),這(zhe)時(shi)候(hou)從(cong)控(kong)製(zhi)上(shang),不(bu)宜(yi)同(tong)時(shi)實(shi)施(shi)數(shu)據(ju)的(de)發(fa)送(song)和(he)接(jie)收(shou)工(gong)作(zuo),不(bu)宜(yi)作(zuo)出(chu)其(qi)他(ta)的(de)控(kong)製(zhi)動(dong)作(zuo),惹(re)不(bu)起(qi)咱(zan)躲(duo)得(de)起(qi),躲(duo)過(guo)這(zhe)一(yi)陣(zhen)幹(gan)擾(rao)的(de)時(shi)候(hou)總(zong)可(ke)以(yi)了(le)吧(ba)?
3、軟件代碼
軟件的可靠性是隨著時間的推移,可靠性逐漸增加的,這一點區別於電子可靠性、機械可靠性。電子可靠性服從指數分布,在整個生命周期內,其失效率為一個常數;機械可靠性因為磨損、腐蝕、運動等因素的存在,隨時間推移可靠度會下降。因此也就有了軟件可靠性設計的一個特定規律和注意事項。
既(ji)然(ran)需(xu)要(yao)通(tong)過(guo)時(shi)間(jian)推(tui)移(yi),通(tong)過(guo)不(bu)斷(duan)改(gai)進(jin),軟(ruan)件(jian)可(ke)靠(kao)性(xing)得(de)到(dao)提(ti)升(sheng)。那(na)麼(me)軟(ruan)件(jian)的(de)可(ke)維(wei)護(hu)性(xing)就(jiu)是(shi)一(yi)個(ge)大(da)問(wen)題(ti)了(le)。這(zhe)也(ye)是(shi)為(wei)什(shen)麼(me)軟(ruan)件(jian)工(gong)程(cheng)管(guan)理(li)方(fang)麵(mian)特(te)別(bie)關(guan)注(zhu)軟(ruan)件(jian)文(wen)檔(dang)、注釋的原因了。但做這些要求的人隻是人雲亦雲,並不理解如此做法的真正動機。至於注釋如何去做、變量如何命名、軟件配置管理如何操作,這裏麵既有很常規的方法,也有一些我們司空見慣然而是錯誤的做法。信手舉上幾個值得注意的細節供參考。
變量定義時宜將變量類型的變量名程中體現於其中;如AD_result_int、Cal_result_float等。這樣為的好檢查,防止數據類型的強製轉換或強製賦值時出現數據類型的錯誤;
注釋要充分;
代碼的布局風格宜統一,便於閱讀查找;
不可出現非受控的default流程,所有數值和變量,不論是調用函數時賦予的、讀取接口讀進來的、還是中間變量計算出來的,在應用前都宜作數據有效性的判斷,並對判定的所有可能結果均做受控的對應處理。
關guan於yu軟ruan件jian可ke維wei護hu性xing編bian程cheng方fang法fa方fang麵mian的de文wen章zhang資zi料liao在zai網wang上shang是shi鋪pu天tian蓋gai地di,不bu予yu贅zhui述shu,綜zong合he采cai用yong之zhi即ji可ke。很hen多duo文wen章zhang把ba軟ruan件jian可ke維wei護hu性xing編bian程cheng規gui範fan推tui薦jian做zuo成cheng企qi業ye的de嵌qian入ru式shi軟ruan件jian可ke靠kao性xing設she計ji規gui範fan,實shi在zai是shi有you點dian以yi偏pian概gai全quan,有you失shi偏pian頗po的de。
軟ruan件jian代dai碼ma在zai執zhi行xing中zhong容rong易yi出chu現xian的de下xia一yi個ge問wen題ti是shi跑pao飛fei,程cheng序xu指zhi針zhen受shou到dao幹gan擾rao,跳tiao轉zhuan到dao了le一yi個ge非fei受shou控kong位wei置zhi,執zhi行xing了le不bu該gai執zhi行xing的de代dai碼ma。如ru果guo執zhi行xing了le不bu該gai執zhi行xing的de代dai碼ma,如ru果guo在zai程cheng序xu中zhong加jia入ru了le足zu夠gou的de變bian量liang判pan斷duan、讀值判斷、狀態檢測判斷等,那倒還好了,後果也不會太嚴重,甚至最終還是可能自己跑回來的。但有一種跑飛是比較可怕的,一般我們在ROM中存放的程序目標代碼是1-3字節的指令,就是最多3條字段的目標碼組成了執行動作,如果程序指針跑飛到了某個3字節指令的第2個字節上的時候,執行的後果是什麼,可就真的沒人知道了,即使在程序上作了足夠的數據判錯、邏輯跳轉的防範措施,結果也不會好。而且ROM一yi般ban是shi不bu可ke能neng全quan部bu都dou被bei程cheng序xu代dai碼ma填tian滿man的de,總zong有you富fu餘yu空kong間jian,富fu餘yu空kong間jian中zhong的de默mo認ren內nei容rong是shi啥sha,這zhe些xie默mo認ren字zi節jie是shi否fou也ye會hui導dao致zhi一yi些xie操cao作zuo呢ne?單dan片pian機ji中zhong的de默mo認ren空kong間jian是shi0FFH,DSP的我沒查過,大家有興趣查一下,跳到這些字段裏,也是容易出麻煩的。
好了,不再羅嗦,直接給出解決方法吧,就是每隔一段程序代碼或控製區域,就人為放置上幾個NOP指令,在NOP指令後放置一個長跳轉的ERR處理程序。注意NOP最少放置3個,這樣任何的跑飛最多隻能占用2個NOP,第三個NOP一樣還是能把程序代碼揪回來,揪回來後就執行ERR處理程序。
如果碰到安全性、可ke靠kao性xing等deng級ji要yao求qiu比bi較jiao高gao的de程cheng序xu,推tui薦jian的de處chu理li方fang法fa可ke以yi采cai用yong熱re備bei份fen的de處chu理li方fang法fa,即ji用yong兩liang段duan代dai碼ma同tong時shi執zhi行xing同tong一yi個ge功gong能neng,執zhi行xing的de結jie果guo進jin行xing對dui比bi,如ru果guo一yi致zhi則ze放fang行xing通tong過guo,如ru果guo結jie果guo不bu一yi致zhi,怎zen麼me處chu理li就jiu看kan個ge人ren。
安全性和可靠性的編程細節注意事項還有很多,窺一斑難見全豹。
4、數據、變量
變量的定義是為的避免各種混淆,同一程序內數據和數據的混淆、不同人讀程序時對變量理解上出現的二義性、視覺效果上容易出現的錯誤(字母的“o”和數字的“0”,字母的“l”和數字的“1”)。這裏要遵循一個“要麼相同,要麼迥異”的de基ji本ben規gui則ze,這zhe條tiao規gui則ze在zai很hen多duo的de領ling域yu都dou有you應ying用yong。在zai結jie構gou的de防fang呆dai性xing設she計ji上shang,接jie插cha件jian的de選xuan型xing也ye是shi如ru此ci,如ru果guo一yi個ge乳ru白bai色se和he一yi個ge淺qian灰hui色se的de同tong類lei接jie插cha件jian,最zui好hao的de選xuan擇ze是shi有you很hen直zhi觀guan的de視shi覺jiao差cha異yi或huo結jie構gou的de差cha異yi,或huo者zhe幹gan脆cui就jiu是shi相xiang同tong的de,相xiang同tong須xu基ji於yu一yi個ge前qian提ti,互hu換huan性xing要yao好hao。
用顯意的符號來命名變量和語句標號。標識符的命名有明確含義,且是完整單詞或易理解的縮寫。短單詞通過去掉“元音”形成縮寫;長單詞取頭幾個字母形成縮寫;一些單詞有公認的縮寫。如:
Temp — tmp;
Flag — flg;
Statistic — stat;
Increment — inc;
Message — msg。
特te殊shu約yue定ding或huo縮suo寫xie,要yao有you注zhu釋shi說shuo明ming。在zai源yuan文wen件jian開kai始shi處chu,對dui使shi用yong的de縮suo寫xie或huo約yue定ding注zhu釋shi說shuo明ming。自zi己ji特te有you的de命ming名ming風feng格ge,要yao自zi始shi至zhi終zhong保bao持chi一yi致zhi。對dui於yu變bian量liang命ming名ming,禁jin止zhi取qu單dan個ge字zi符fu(如i、j、k...);含義+變量類型、數據類型等,i、j、k作局部循環變量是允許的,但容易混淆的字母慎用。如int Liv_Width,L代表局部變量(Local)(g全局變量Global)、i代表數據類型(Interger)、 v代表 變量(Variable)(c常量Const)、Width代表變量的含義,這種命名方式可防止局部變量與全局變量重名。
禁用易混淆的標識符(R1和Rl,DO和D0等)來表示不同的變量、文件名和語句標號。
除了編譯開關/頭文件等特殊應用,避免使用_EXAMPLE_TEST_之類以下劃線開始和結尾的定義。
全quan局ju變bian量liang是shi戰zhan略lve性xing資zi源yuan,它ta決jue定ding了le模mo塊kuai和he模mo塊kuai間jian的de耦ou合he度du,需xu在zai項xiang目mu上shang提ti升sheng到dao一yi個ge足zu夠gou高gao的de高gao度du,慎shen用yong全quan局ju變bian量liang,不bu得de不bu用yong的de時shi候hou,要yao單dan獨du為wei每mei一yi個ge全quan局ju變bian量liang編bian寫xie獨du立li的de操cao作zuo模mo塊kuai或huo函han數shu,在zai修xiu改gai全quan局ju變bian量liang的de時shi候hou,要yao檢jian查zha是shi否fou有you別bie的de函han數shu在zai調tiao用yong它ta並bing且qie需xu要yao此ci數shu值zhi保bao持chi穩wen定ding。
對變量代表某個特定含義的時候,盡量不要僅僅用位來代表什麼,比如用某變量的第零位代表某個狀態(0000 0001,其中僅用1代表某個內容,這樣01H、03H、05H… 會有很多個組合都能代表這個狀態);位容易受幹擾被修改,信息出現錯誤的幾率大很多。
也不要用00H、FFH等數據代表,就像我們麵試一群人一樣,第一個被麵試人和最後一個被麵試人容易被記住,00H和FFH亦然,係統默認狀態是00和FF的時候較多,他們容易被複位或置位成這類數值。推薦以四位的二進製碼的某個中間值為狀態變量,如1001。
變量數據在應用之前宜作數據類型和數值範圍的判斷;
數據在存儲過程中也容易出現問題,EEPROM、RAM等都有過類似的案例。數據出錯時避免不了的,解決的辦法是學花旗銀行等美國金融企業,之所以在9.11後他們能很快恢複業務,基本沒有數據方麵的損失,原因何在?因為他們有異地容災數據備份係統,知裏麵有兩個關鍵詞,異地、備份。我們的信息也同樣,首先選擇存在不同的介質中、huoxiangtongdejiezhidanjiongyidecunfanghuanjingheweizhixia,shuangzhongbeifendejiejushiliangbianbuyizhideshihou,shujubeihuaiyibingjujuefanyingzhixing,danqianrushiruanjianhenduoshihoushiyaokaoshujulaituidongzhixingjigoude,jishifaxianshujuyouwentiyebuyunxuxingzhengbuzuowei,zhezhongqingkuangxia,zuoweiwomenyehennanban,2個(ge)不(bu)同(tong)的(de)數(shu)據(ju),有(you)明(ming)顯(xian)問(wen)題(ti)的(de)還(hai)好(hao)排(pai)除(chu),都(dou)在(zai)有(you)限(xian)範(fan)圍(wei)內(nei)可(ke)如(ru)何(he)判(pan)定(ding)哈(ha)?這(zhe)種(zhong)時(shi)候(hou)沒(mei)辦(ban)法(fa)隻(zhi)好(hao)三(san)備(bei)份(fen),少(shao)數(shu)服(fu)從(cong)多(duo)數(shu)是(shi)唯(wei)一(yi)的(de)選(xuan)擇(ze)了(le)。石(shi)頭(tou)剪(jian)刀(dao)布(bu)的(de)方(fang)式(shi)不(bu)好(hao)用(yong),葛(ge)優(you)的(de)分(fen)歧(qi)終(zhong)端(duan)機(ji)也(ye)不(bu)適(shi)用(yong),就(jiu)隻(zhi)好(hao)選(xuan)擇(ze)這(zhe)種(zhong)最(zui)原(yuan)始(shi)最(zui)有(you)效(xiao)的(de)辦(ban)法(fa)了(le),唯(wei)一(yi)需(xu)要(yao)注(zhu)意(yi)的(de)是(shi)數(shu)據(ju)宜(yi)存(cun)放(fang)於(yu)三(san)種(zhong)不(bu)同(tong)的(de)備(bei)份(fen)環(huan)境(jing)下(xia)。
以yi上shang僅jin就jiu嵌qian入ru式shi軟ruan件jian可ke靠kao性xing的de關guan注zhu方fang麵mian分fen了le幾ji大da類lei,進jin行xing了le基ji本ben的de描miao述shu,實shi際ji應ying用yong中zhong,需xu要yao關guan注zhu的de點dian還hai有you很hen多duo很hen多duo,如ru果guo是shi準zhun備bei自zi行xing製zhi定ding設she計ji規gui範fan的de話hua,以yi上shang的de思si路lu應ying該gai也ye可ke以yi給gei與yu一yi些xie啟qi迪di了le。
特別推薦
- 噪聲中提取真值!瑞盟科技推出MSA2240電流檢測芯片賦能多元高端測量場景
- 10MHz高頻運行!氮矽科技發布集成驅動GaN芯片,助力電源能效再攀新高
- 失真度僅0.002%!力芯微推出超低內阻、超低失真4PST模擬開關
- 一“芯”雙電!聖邦微電子發布雙輸出電源芯片,簡化AFE與音頻設計
- 一機適配萬端:金升陽推出1200W可編程電源,賦能高端裝備製造
技術文章更多>>
- 大聯大世平集團首度亮相北京國際汽車展 攜手全球芯片夥伴打造智能車整合應用新典範
- 2026北京車展即將啟幕,高通攜手汽車生態“朋友圈”推動智能化體驗再升級
- 如何使用工業級串行數字輸入來設計具有並行接口的數字輸入模塊
- 邊緣AI的發展為更智能、更可持續的技術鋪平道路
- 每台智能體PC,都是AI時代的新入口
技術白皮書下載更多>>
- 車規與基於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傳輸速度



