資料介紹
1、前言
設(shè)備的可靠性涉及多個(gè)方面:穩(wěn)定的硬件、優(yōu)秀的軟件架構(gòu)、嚴(yán)格的測(cè)試以及市場(chǎng)和時(shí)間的檢驗(yàn)等等。這里著重談一下作者自己對(duì)嵌入式軟件可靠性設(shè)計(jì)的一些理解,通過(guò)一定的技巧和方法提高軟件可靠性。這里所說(shuō)的嵌入式設(shè)備,是指使用單片機(jī)、ARM7、Cortex-M0,M3之類(lèi)為核心的測(cè)控或工控系統(tǒng)。
嵌入式軟件可靠性設(shè)計(jì)應(yīng)該從防錯(cuò)、判錯(cuò)和容錯(cuò)三方面進(jìn)行考慮。 此外,還需理解自己所使用的編譯器特性。
2、防錯(cuò)
良好的軟件架構(gòu)、清晰的代碼結(jié)構(gòu)、掌握硬件、深入理解C語(yǔ)言是防錯(cuò)的要點(diǎn),這里只談一下C語(yǔ)言。
“人的思維和經(jīng)驗(yàn)積累對(duì)軟件可靠性有很大影響"。C語(yǔ)言詭異且有種種陷阱和缺陷,需要程序員多年歷練才能達(dá)到較為完善的地步。“軟件的質(zhì)量是由程序員的質(zhì)量以及他們相互之間的協(xié)作決定的”。因此,作者認(rèn)為防錯(cuò)的重點(diǎn)是要考慮人的因素。
“深入一門(mén)語(yǔ)言編程,不要浮于表面”。軟件的可靠性,與你理解的語(yǔ)言深度密切相關(guān),嵌入式C更是如此。除了語(yǔ)言,作者認(rèn)為嵌入式開(kāi)發(fā)還必須深入理解編譯器。
本節(jié)將對(duì)C語(yǔ)言的陷阱和缺陷做初步探討。
2.1 處處皆陷阱
最初開(kāi)始編程時(shí),除了英文標(biāo)點(diǎn)被誤寫(xiě)成中文標(biāo)點(diǎn)外,可能被大家普遍遇到的是將比較運(yùn)算符==誤寫(xiě)成賦值運(yùn)算符=,代碼如下所示:
if(x=5) { … }
這里本意是比較變量x是否等于常量5,但是誤將’==’寫(xiě)成了’=’,if語(yǔ)句恒為真。如果在邏輯判斷表達(dá)式中出現(xiàn)賦值運(yùn)算符,現(xiàn)在的大多數(shù)編譯器會(huì)給出警告信息。并非所有程序員都會(huì)注意到這類(lèi)警告,因此有經(jīng)驗(yàn)的程序員使用下面的代碼來(lái)避免此類(lèi)錯(cuò)誤:
if(5==x) { … }
將常量放在變量x的左邊,即使程序員誤將’==’寫(xiě)成了’=’,編譯器會(huì)產(chǎn)生一個(gè)任誰(shuí)也不能無(wú)視的語(yǔ)法錯(cuò)誤信息:不可給常量賦值!
+=與=+、-=與=-也是容易寫(xiě)混的。復(fù)合賦值運(yùn)算符(+=、*=等等)雖然可以使表達(dá)式更加簡(jiǎn)潔并有可能產(chǎn)生更高效的機(jī)器代碼,但某些復(fù)合賦值運(yùn)算符也會(huì)給程序帶來(lái)隱含Bug,如下所示代碼:
tmp=+1;
該代碼本意是想表達(dá)tmp=tmp+1,但是將復(fù)合賦值運(yùn)算符+=誤寫(xiě)成=+:將正整數(shù)常量1賦值給變量tmp。編譯器會(huì)欣然接受這類(lèi)代碼,連警告都不會(huì)產(chǎn)生。
如果你能在調(diào)試階段就發(fā)現(xiàn)這個(gè)Bug,你真應(yīng)該慶祝一下,否則這很可能會(huì)成為一個(gè)重大隱含Bug,且不易被察覺(jué)。
-=與=-也是同樣道理。與之類(lèi)似的還有邏輯與&&和位與&、邏輯或||和位或|、邏輯非!和位取反~。此外字母l和數(shù)字1、字母O和數(shù)字0也易混淆,這種情況可借助編譯器來(lái)糾正。
很多的軟件BUG自于輸入錯(cuò)誤。在Google上搜索的時(shí)候,有些結(jié)果列表項(xiàng)中帶有一條警告,表明Google認(rèn)為它帶有惡意代碼。如果你在2009年1月31日一大早使用Google搜索的話,你就會(huì)看到,在那天早晨55分鐘的時(shí)間內(nèi),Google的搜索結(jié)果標(biāo)明每個(gè)站點(diǎn)對(duì)你的PC都是有害的。這涉及到整個(gè)Internet上的所有站點(diǎn),包括Google自己的所有站點(diǎn)和服務(wù)。Google的惡意軟件檢測(cè)功能通過(guò)在一個(gè)已知攻擊者的列表上查找站點(diǎn),從而識(shí)別出危險(xiǎn)站點(diǎn)。在1月31日早晨,對(duì)這個(gè)列表的更新意外地包含了一條斜杠(“/”)。所有的URL都包含一條斜杠,并且,反惡意軟件功能把這條斜杠理解為所有的URL都是可疑的,因此,它愉快地對(duì)搜索結(jié)果中的每個(gè)站點(diǎn)都添加一條警告。很少見(jiàn)到如此簡(jiǎn)單的一個(gè)輸入錯(cuò)誤帶來(lái)的結(jié)果如此奇怪且影響如此廣泛,但程序就是這樣,容不得一絲疏忽。
數(shù)組常常也是引起程序不穩(wěn)定的重要因素,C語(yǔ)言數(shù)組的迷惑性與數(shù)組下標(biāo)從0開(kāi)始密不可分,你可以定義int a[30],但是你絕不可以使用數(shù)組元素a[30],除非你自己明確知道在做什么。
switch…case語(yǔ)句可以很方便的實(shí)現(xiàn)多分支結(jié)構(gòu),但要注意在合適的位置添加break關(guān)鍵字。程序員往往容易漏加break從而引起順序執(zhí)行多個(gè)case語(yǔ)句,這也許是C的一個(gè)缺陷之處。對(duì)于switch…case語(yǔ)句,從概率論上說(shuō),絕大多數(shù)程序一次只需執(zhí)行一個(gè)匹配的case語(yǔ)句,而每一個(gè)這樣的case語(yǔ)句后都必須跟一個(gè)break。去復(fù)雜化大概率事件,這多少有些不合常情。
break關(guān)鍵字用于跳出最近的那層循環(huán)語(yǔ)句或者switch語(yǔ)句,但程序員往往不夠重視這一點(diǎn)。
1990年1月15日,AT&T電話網(wǎng)絡(luò)位于紐約的一臺(tái)交換機(jī)當(dāng)機(jī)并且重啟,引起它鄰近交換機(jī)癱瘓,由此及彼,一個(gè)連著一個(gè),很快,114臺(tái)交換機(jī)每六秒當(dāng)機(jī)重啟一次,六萬(wàn)人九小時(shí)內(nèi)不能打長(zhǎng)途電話。當(dāng)時(shí)的解決方式:工程師重裝了以前的軟件版本。事后的事故調(diào)查發(fā)現(xiàn),這是break關(guān)鍵字誤用造成的。《C專(zhuān)家編程》提供了一個(gè)簡(jiǎn)化版的問(wèn)題源碼:
network code()
{
switch(line) {
case THING1:
doit1();
break;
case THING2:
if(x==STUFF) {
do_first_stuff();
if(y==OTHER_STUFF)
break;
do_later_stuff();
} /*代碼的意圖是跳轉(zhuǎn)到這里… …*/
initialize_modes_pointer();
break;
default:
processing();
}/*… …但事實(shí)上跳到了這里。*/
use_modes_pointer();/*致使modes_pointer未初始化*/
}
那個(gè)程序員希望從if語(yǔ)句跳出,但他卻忘記了break關(guān)鍵字實(shí)際上跳出最近的那層循環(huán)語(yǔ)句或者switch語(yǔ)句。現(xiàn)在它跳出了switch語(yǔ)句,執(zhí)行了use_modes_pointer()函數(shù)。但必要的初始化工作并未完成,為將來(lái)程序的失敗埋下了伏筆。
將一個(gè)整形常量賦值給變量,代碼如下所示:
int a=34, b=034;
變量a和b相等嗎?答案是不相等的。我們知道,16進(jìn)制常量以’0x’為前綴,10進(jìn)制常量不需要前綴,那么8進(jìn)制呢?它與10進(jìn)制和16進(jìn)制表示方法都不相通,它以數(shù)字’0’為前綴,這多少有點(diǎn)奇葩:三種進(jìn)制的表示方法完全不相通。如果8進(jìn)制也像16進(jìn)制那樣以數(shù)字和字母表示前綴的話,或許更有利于減少軟件Bug,畢竟你使用8進(jìn)制的次數(shù)可能都不會(huì)有誤使用的次數(shù)多!下面展示一個(gè)誤用8進(jìn)制的例子,最后一個(gè)數(shù)組元素賦值錯(cuò)誤:
a[0]=106; /*十進(jìn)制數(shù)106*/
a[1]=112; /*十進(jìn)制數(shù)112*/
a[2]=052; /*實(shí)際為十進(jìn)制數(shù)42,本意為十進(jìn)制52*/
指針的加減運(yùn)算是特殊的。下面的代碼運(yùn)行在32位ARM架構(gòu)上,執(zhí)行之后,a和p的值分別是多少?
int a=1;
int *p=(int*)0x00001000;
a=a+1;
p=p+1;
對(duì)于a的值很容判斷出結(jié)果為2,但是p的結(jié)果卻是0x00001004。指針p加1后,p的值增加了4,這是為什么呢?原因是指針做加減運(yùn)算時(shí)是以指針的數(shù)據(jù)類(lèi)型為單位。p+1實(shí)際上是p+1*sizeof(int)。不理解這一點(diǎn),在使用指針直接操作數(shù)據(jù)時(shí)極易犯錯(cuò)。比如下面對(duì)連續(xù)RAM初始化零操作代碼:
unsigned int *pRAMaddr; //定義地址指針變量
for(pRAMaddr=StartAddr;pRAMaddr{
*pRAMaddr=0x00000000; //指定RAM地址清零
}
下載該資料的人也在下載
下載該資料的人還在閱讀
更多 >
- 嵌入式軟件怎樣測(cè)試,如何對(duì)嵌入式軟件進(jìn)行可靠性測(cè)試
- 深度:嵌入式系統(tǒng)的軟件架構(gòu)設(shè)計(jì)!資料下載
- 7個(gè)技巧開(kāi)發(fā)更高可靠性的嵌入式系統(tǒng)資料下載
- 嵌入式GIS軟件低功耗措施資料下載
- 選型必讀:正確理解電阻在電路中的作用資料下載
- 正確理解電路保護(hù)設(shè)計(jì)及器件選擇資料下載
- 嵌入式教程之高可靠嵌入式系統(tǒng)設(shè)計(jì)的詳細(xì)資料說(shuō)明 11次下載
- 嵌入式系統(tǒng)硬件可靠性分析 1次下載
- 嵌入式軟件設(shè)計(jì)確保可靠性的技巧 0次下載
- 基于CodeTEST的嵌入式軟件測(cè)試技術(shù)
- 嵌入式系統(tǒng)軟件可靠性設(shè)計(jì)
- EPC2000系列嵌入式工控主板硬件可靠性應(yīng)用設(shè)計(jì)
- 嵌入式系統(tǒng)的系統(tǒng)測(cè)試和可靠性評(píng)估
- 嵌入式軟件的安全可靠性控制
- 嵌入式系統(tǒng)的系統(tǒng)測(cè)試和可靠性評(píng)估
- 【干貨速遞】嵌入式數(shù)據(jù)可靠性,軟件設(shè)計(jì)的這些細(xì)節(jié)不能忽視! 450次閱讀
- 【深度解析】硬件電路設(shè)計(jì):如何確保嵌入式數(shù)據(jù)可靠性? 613次閱讀
- 【技術(shù)指南】提升嵌入式數(shù)據(jù)可靠性,從元器件選型開(kāi)始! 338次閱讀
- 詳細(xì)的理解可靠性分配 3.4k次閱讀
- 嵌入式軟件的可靠性設(shè)計(jì) 1.3k次閱讀
- 基于嵌入式軟件的JNI技術(shù)應(yīng)用解析 1.4k次閱讀
- 怎樣開(kāi)發(fā)高可靠性嵌入式系統(tǒng)? 779次閱讀
- 嵌入式軟件可靠性設(shè)計(jì)需注意以下四個(gè)方面的問(wèn)題! 2.8k次閱讀
- 嵌入式系統(tǒng)的設(shè)計(jì)原則技術(shù)設(shè)計(jì)實(shí)例 6.2k次閱讀
- 關(guān)于軍用嵌入式系統(tǒng)的可靠性,你知道多少呢? 2.8k次閱讀
- 嵌入式軟件可靠性設(shè)計(jì)三方面的考慮:防錯(cuò),判錯(cuò),容錯(cuò)的詳細(xì)概述 6.6k次閱讀
- 一文知道嵌入式存儲(chǔ)交換技術(shù)的可靠性如何增加 2.4k次閱讀
- 大神教你:嵌入式系統(tǒng)C++代碼的變成技巧 3.9k次閱讀
- 嵌入式系統(tǒng)開(kāi)發(fā)的流程和提升可靠性的七大技巧 1.2k次閱讀
- 正確理解時(shí)鐘器件的抖動(dòng)性能 2w次閱讀
下載排行
本周
- 1冷柜-電氣控制系統(tǒng)講解
- 13.68 MB | 4次下載 | 10 積分
- 2安川A1000變頻器中文版說(shuō)明書(shū)
- 20.16 MB | 3次下載 | 3 積分
- 3直流電路的組成和基本定律
- 1.67 MB | 2次下載 | 免費(fèi)
- 4丹佛斯2800系列變頻器說(shuō)明書(shū)
- 8.00 MB | 1次下載 | 5 積分
- 5PC8011同步開(kāi)關(guān)型降壓3.5A單節(jié)鋰電池充電管理電路技術(shù)手冊(cè)
- 0.74 MB | 1次下載 | 免費(fèi)
- 6ES7243E+ES8311音頻錄制與播放電路資料
- 0.06 MB | 1次下載 | 5 積分
- 7SDM02 激光測(cè)距模塊產(chǎn)品手冊(cè)
- 0.43 MB | 1次下載 | 免費(fèi)
- 8SDFM 激光測(cè)距模塊模組手冊(cè)
- 0.54 MB | 1次下載 | 免費(fèi)
本月
- 1CH341編程器軟件NeoProgrammer_2.2.0.10
- 20.47 MB | 170次下載 | 1 積分
- 22025智能家居傳感器市場(chǎng)分析及創(chuàng)新應(yīng)用
- 3.11 MB | 43次下載 | 免費(fèi)
- 3RV1126B系列開(kāi)發(fā)板產(chǎn)品資料
- 4.19 MB | 18次下載 | 免費(fèi)
- 4CH341編程軟件下載
- 2.50 MB | 16次下載 | 5 積分
- 5全志系列-米爾基于T153核心板開(kāi)發(fā)板 四核異構(gòu)、3路千兆網(wǎng),賦能多元化工業(yè)場(chǎng)景
- 3.05 MB | 12次下載 | 免費(fèi)
- 6【開(kāi)源】60余套STM32單片機(jī)、嵌入式Linux、物聯(lián)網(wǎng)、人工智能項(xiàng)目案例及入門(mén)學(xué)習(xí)資源包
- 10.55 MB | 8次下載 | 免費(fèi)
- 7冷柜-電氣控制系統(tǒng)講解
- 13.68 MB | 4次下載 | 10 積分
- 8特斯拉MODEL S車(chē)載充電機(jī)主電路回路原理圖
- 0.81 MB | 4次下載 | 3 積分
總榜
- 1matlab軟件下載入口
- 未知 | 935137次下載 | 10 積分
- 2開(kāi)源硬件-PMP21529.1-4 開(kāi)關(guān)降壓/升壓雙向直流/直流轉(zhuǎn)換器 PCB layout 設(shè)計(jì)
- 1.48MB | 420064次下載 | 10 積分
- 3Altium DXP2002下載入口
- 未知 | 233094次下載 | 10 積分
- 4電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191448次下載 | 10 積分
- 5十天學(xué)會(huì)AVR單片機(jī)與C語(yǔ)言視頻教程 下載
- 158M | 183356次下載 | 10 積分
- 6labview8.5下載
- 未知 | 81604次下載 | 10 積分
- 7Keil工具M(jìn)DK-Arm免費(fèi)下載
- 0.02 MB | 73824次下載 | 10 積分
- 8LabVIEW 8.6下載
- 未知 | 65991次下載 | 10 積分
電子發(fā)燒友App





創(chuàng)作
發(fā)文章
發(fā)帖
提問(wèn)
發(fā)資料
發(fā)視頻
上傳資料賺積分
評(píng)論