嵌入式軟件設計處處是坑,確保可靠性有這些絕招
發布時間: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、軟件代碼
軟件的可靠性是隨著時間的推移,可靠性逐漸增加的,這一點區別於電子可靠性、機械可靠性。電子可靠性服從指數分布,在整個生命周期內,其失效率為一個常數;機械可靠性因為磨損、腐蝕、運動等因素的存在,隨時間推移可靠度會下降。因此也就有了軟件可靠性設計的一個特定規律和注意事項。
jiranxuyaotongguoshijiantuiyi,tongguobuduangaijin,ruanjiankekaoxingdedaotisheng。nameruanjiandekeweihuxingjiushiyigedawentile。zheyeshiweishenmeruanjiangongchengguanlifangmiantebieguanzhuruanjianwendang、注釋的原因了。但做這些要求的人隻是人雲亦雲,並不理解如此做法的真正動機。至於注釋如何去做、變量如何命名、軟件配置管理如何操作,這裏麵既有很常規的方法,也有一些我們司空見慣然而是錯誤的做法。信手舉上幾個值得注意的細節供參考。
變量定義時宜將變量類型的變量名程中體現於其中;如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)是(shi)0FFH,DSP的我沒查過,大家有興趣查一下,跳到這些字段裏,也是容易出麻煩的。
好了,不再羅嗦,直接給出解決方法吧,就是每隔一段程序代碼或控製區域,就人為放置上幾個NOP指令,在NOP指令後放置一個長跳轉的ERR處理程序。注意NOP最少放置3個,這樣任何的跑飛最多隻能占用2個NOP,第三個NOP一樣還是能把程序代碼揪回來,揪回來後就執行ERR處理程序。
如果碰到安全性、kekaoxingdengjiyaoqiubijiaogaodechengxu,tuijiandechulifangfakeyicaiyongrebeifendechulifangfa,jiyongliangduandaimatongshizhixingtongyigegongneng,zhixingdejieguojinxingduibi,ruguoyizhizefangxingtongguo,ruguojieguobuyizhi,zenmechulijiukangeren。
安全性和可靠性的編程細節注意事項還有很多,窺一斑難見全豹。
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_之類以下劃線開始和結尾的定義。
quanjubianliangshizhanlvexingziyuan,tajuedinglemokuaihemokuaijiandeouhedu,xuzaixiangmushangtishengdaoyigezugougaodegaodu,shenyongquanjubianliang,budebuyongdeshihou,yaodanduweimeiyigequanjubianliangbianxiedulidecaozuomokuaihuohanshu,zaixiugaiquanjubianliangdeshihou,yaojianzhashifouyoubiedehanshuzaitiaoyongtabingqiexuyaocishuzhibaochiwending。
對變量代表某個特定含義的時候,盡量不要僅僅用位來代表什麼,比如用某變量的第零位代表某個狀態(0000 0001,其中僅用1代表某個內容,這樣01H、03H、05H… 會有很多個組合都能代表這個狀態);位容易受幹擾被修改,信息出現錯誤的幾率大很多。
也不要用00H、FFH等數據代表,就像我們麵試一群人一樣,第一個被麵試人和最後一個被麵試人容易被記住,00H和FFH亦然,係統默認狀態是00和FF的時候較多,他們容易被複位或置位成這類數值。推薦以四位的二進製碼的某個中間值為狀態變量,如1001。
變量數據在應用之前宜作數據類型和數值範圍的判斷;
數據在存儲過程中也容易出現問題,EEPROM、RAM等都有過類似的案例。數據出錯時避免不了的,解決的辦法是學花旗銀行等美國金融企業,之所以在9.11後他們能很快恢複業務,基本沒有數據方麵的損失,原因何在?因為他們有異地容災數據備份係統,知裏麵有兩個關鍵詞,異地、備份。我們的信息也同樣,首先選擇存在不同的介質中、或(huo)相(xiang)同(tong)的(de)介(jie)質(zhi)但(dan)迥(jiong)異(yi)的(de)存(cun)放(fang)環(huan)境(jing)和(he)位(wei)置(zhi)下(xia),雙(shuang)重(zhong)備(bei)份(fen)的(de)結(jie)局(ju)是(shi)兩(liang)邊(bian)不(bu)一(yi)致(zhi)的(de)時(shi)候(hou),數(shu)據(ju)被(bei)懷(huai)疑(yi)並(bing)拒(ju)絕(jue)反(fan)映(ying)執(zhi)行(xing),但(dan)嵌(qian)入(ru)式(shi)軟(ruan)件(jian)很(hen)多(duo)時(shi)候(hou)是(shi)要(yao)靠(kao)數(shu)據(ju)來(lai)推(tui)動(dong)執(zhi)行(xing)機(ji)構(gou)的(de),即(ji)使(shi)發(fa)現(xian)數(shu)據(ju)有(you)問(wen)題(ti)也(ye)不(bu)允(yun)許(xu)行(xing)政(zheng)不(bu)作(zuo)為(wei),這(zhe)種(zhong)情(qing)況(kuang)下(xia),作(zuo)為(wei)我(wo)們(men)也(ye)很(hen)難(nan)辦(ban),2gebutongdeshuju,youmingxianwentidehaihaopaichu,douzaiyouxianfanweineikeruhepandingha?zhezhongshihoumeibanfazhihaosanbeifen,shaoshufucongduoshushiweiyidexuanzele。shitoujiandaobudefangshibuhaoyong,geyoudefenqizhongduanjiyebushiyong,jiuzhihaoxuanzezhezhongzuiyuanshizuiyouxiaodebanfale,weiyixuyaozhuyideshishujuyicunfangyusanzhongbutongdebeifenhuanjingxia。
以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可編程電源,賦能高端裝備製造
技術文章更多>>
- 貿澤EIT係列新一期,探索AI如何重塑日常科技與用戶體驗
- 算力爆發遇上電源革新,大聯大世平集團攜手晶豐明源線上研討會解鎖應用落地
- 創新不止,創芯不已:第六屆ICDIA創芯展8月南京盛大啟幕!
- AI時代,為什麼存儲基礎設施的可靠性決定數據中心的經濟效益
- 矽典微ONELAB開發係列:為毫米波算法開發者打造的全棧工具鏈
技術白皮書下載更多>>
- 車規與基於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背光


