衡阳派盒市场营销有限公司

電子發燒友App

硬聲App

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示
電子發燒友網>電子資料下載>嵌入式開發>如何正確理解嵌入式軟件可靠性設計?資料下載

如何正確理解嵌入式軟件可靠性設計?資料下載

2021-04-18 | pdf | 241.64KB | 次下載 | 2積分

資料介紹

1、前言 設備的可靠性涉及多個方面:穩定的硬件、優秀的軟件架構、嚴格的測試以及市場和時間的檢驗等等。這里著重談一下作者自己對嵌入式軟件可靠性設計的一些理解,通過一定的技巧和方法提高軟件可靠性。這里所說的嵌入式設備,是指使用單片機ARM7、Cortex-M0,M3之類為核心的測控或工控系統。 嵌入式軟件可靠性設計應該從防錯、判錯和容錯三方面進行考慮。 此外,還需理解自己所使用的編譯器特性。 2、防錯 良好的軟件架構、清晰的代碼結構、掌握硬件、深入理解C語言是防錯的要點,這里只談一下C語言。 “人的思維和經驗積累對軟件可靠性有很大影響"。C語言詭異且有種種陷阱和缺陷,需要程序員多年歷練才能達到較為完善的地步。“軟件的質量是由程序員的質量以及他們相互之間的協作決定的”。因此,作者認為防錯的重點是要考慮人的因素。 “深入一門語言編程,不要浮于表面”。軟件的可靠性,與你理解的語言深度密切相關,嵌入式C更是如此。除了語言,作者認為嵌入式開發還必須深入理解編譯器。 本節將對C語言的陷阱和缺陷做初步探討。 2.1 處處皆陷阱 最初開始編程時,除了英文標點被誤寫成中文標點外,可能被大家普遍遇到的是將比較運算符==誤寫成賦值運算符=,代碼如下所示: if(x=5) { … } 這里本意是比較變量x是否等于常量5,但是誤將’==’寫成了’=’,if語句恒為真。如果在邏輯判斷表達式中出現賦值運算符,現在的大多數編譯器會給出警告信息。并非所有程序員都會注意到這類警告,因此有經驗的程序員使用下面的代碼來避免此類錯誤: if(5==x) { … } 將常量放在變量x的左邊,即使程序員誤將’==’寫成了’=’,編譯器會產生一個任誰也不能無視的語法錯誤信息:不可給常量賦值! +=與=+、-=與=-也是容易寫混的。復合賦值運算符(+=、*=等等)雖然可以使表達式更加簡潔并有可能產生更高效的機器代碼,但某些復合賦值運算符也會給程序帶來隱含Bug,如下所示代碼: tmp=+1; 該代碼本意是想表達tmp=tmp+1,但是將復合賦值運算符+=誤寫成=+:將正整數常量1賦值給變量tmp。編譯器會欣然接受這類代碼,連警告都不會產生。 如果你能在調試階段就發現這個Bug,你真應該慶祝一下,否則這很可能會成為一個重大隱含Bug,且不易被察覺。 -=與=-也是同樣道理。與之類似的還有邏輯與&&和位與&、邏輯或||和位或|、邏輯非!和位取反~。此外字母l和數字1、字母O和數字0也易混淆,這種情況可借助編譯器來糾正。 很多的軟件BUG自于輸入錯誤。在Google上搜索的時候,有些結果列表項中帶有一條警告,表明Google認為它帶有惡意代碼。如果你在2009年1月31日一大早使用Google搜索的話,你就會看到,在那天早晨55分鐘的時間內,Google的搜索結果標明每個站點對你的PC都是有害的。這涉及到整個Internet上的所有站點,包括Google自己的所有站點和服務。Google的惡意軟件檢測功能通過在一個已知攻擊者的列表上查找站點,從而識別出危險站點。在1月31日早晨,對這個列表的更新意外地包含了一條斜杠(“/”)。所有的URL都包含一條斜杠,并且,反惡意軟件功能把這條斜杠理解為所有的URL都是可疑的,因此,它愉快地對搜索結果中的每個站點都添加一條警告。很少見到如此簡單的一個輸入錯誤帶來的結果如此奇怪且影響如此廣泛,但程序就是這樣,容不得一絲疏忽。 數組常常也是引起程序不穩定的重要因素,C語言數組的迷惑性與數組下標從0開始密不可分,你可以定義int a[30],但是你絕不可以使用數組元素a[30],除非你自己明確知道在做什么。 switch…case語句可以很方便的實現多分支結構,但要注意在合適的位置添加break關鍵字。程序員往往容易漏加break從而引起順序執行多個case語句,這也許是C的一個缺陷之處。對于switch…case語句,從概率論上說,絕大多數程序一次只需執行一個匹配的case語句,而每一個這樣的case語句后都必須跟一個break。去復雜化大概率事件,這多少有些不合常情。 break關鍵字用于跳出最近的那層循環語句或者switch語句,但程序員往往不夠重視這一點。 1990年1月15日,AT&T電話網絡位于紐約的一臺交換機當機并且重啟,引起它鄰近交換機癱瘓,由此及彼,一個連著一個,很快,114臺交換機每六秒當機重啟一次,六萬人九小時內不能打長途電話。當時的解決方式:工程師重裝了以前的軟件版本。事后的事故調查發現,這是break關鍵字誤用造成的。《C專家編程》提供了一個簡化版的問題源碼: network code() { switch(line) { case THING1: doit1(); break; case THING2: if(x==STUFF) { do_first_stuff(); if(y==OTHER_STUFF) break; do_later_stuff(); } /*代碼的意圖是跳轉到這里… …*/ initialize_modes_pointer(); break; default: processing(); }/*… …但事實上跳到了這里。*/ use_modes_pointer();/*致使modes_pointer未初始化*/ } 那個程序員希望從if語句跳出,但他卻忘記了break關鍵字實際上跳出最近的那層循環語句或者switch語句。現在它跳出了switch語句,執行了use_modes_pointer()函數。但必要的初始化工作并未完成,為將來程序的失敗埋下了伏筆。 將一個整形常量賦值給變量,代碼如下所示: int a=34, b=034; 變量a和b相等嗎?答案是不相等的。我們知道,16進制常量以’0x’為前綴,10進制常量不需要前綴,那么8進制呢?它與10進制和16進制表示方法都不相通,它以數字’0’為前綴,這多少有點奇葩:三種進制的表示方法完全不相通。如果8進制也像16進制那樣以數字和字母表示前綴的話,或許更有利于減少軟件Bug,畢竟你使用8進制的次數可能都不會有誤使用的次數多!下面展示一個誤用8進制的例子,最后一個數組元素賦值錯誤: a[0]=106; /*十進制數106*/ a[1]=112; /*十進制數112*/ a[2]=052; /*實際為十進制數42,本意為十進制52*/ 指針的加減運算是特殊的。下面的代碼運行在32位ARM架構上,執行之后,a和p的值分別是多少? int a=1; int *p=(int*)0x00001000; a=a+1; p=p+1; 對于a的值很容判斷出結果為2,但是p的結果卻是0x00001004。指針p加1后,p的值增加了4,這是為什么呢?原因是指針做加減運算時是以指針的數據類型為單位。p+1實際上是p+1*sizeof(int)。不理解這一點,在使用指針直接操作數據時極易犯錯。比如下面對連續RAM初始化零操作代碼: unsigned int *pRAMaddr; //定義地址指針變量 for(pRAMaddr=StartAddr;pRAMaddr{ *pRAMaddr=0x00000000; //指定RAM地址清零 }
下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評論

查看更多

下載排行

本周

  1. 1TC358743XBG評估板參考手冊
  2. 1.36 MB  |  330次下載  |  免費
  3. 2開關電源基礎知識
  4. 5.73 MB  |  6次下載  |  免費
  5. 3100W短波放大電路圖
  6. 0.05 MB  |  4次下載  |  3 積分
  7. 4嵌入式linux-聊天程序設計
  8. 0.60 MB  |  3次下載  |  免費
  9. 5基于FPGA的光纖通信系統的設計與實現
  10. 0.61 MB  |  2次下載  |  免費
  11. 6基于FPGA的C8051F單片機開發板設計
  12. 0.70 MB  |  2次下載  |  免費
  13. 751單片機窗簾控制器仿真程序
  14. 1.93 MB  |  2次下載  |  免費
  15. 8基于51單片機的RGB調色燈程序仿真
  16. 0.86 MB  |  2次下載  |  免費

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費
  3. 2555集成電路應用800例(新編版)
  4. 0.00 MB  |  33564次下載  |  免費
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費
  7. 4開關電源設計實例指南
  8. 未知  |  21548次下載  |  免費
  9. 5電氣工程師手冊免費下載(新編第二版pdf電子書)
  10. 0.00 MB  |  15349次下載  |  免費
  11. 6數字電路基礎pdf(下載)
  12. 未知  |  13750次下載  |  免費
  13. 7電子制作實例集錦 下載
  14. 未知  |  8113次下載  |  免費
  15. 8《LED驅動電路設計》 溫德爾著
  16. 0.00 MB  |  6653次下載  |  免費

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費
  3. 2protel99se軟件下載(可英文版轉中文版)
  4. 78.1 MB  |  537796次下載  |  免費
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420026次下載  |  免費
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費
  11. 6電路仿真軟件multisim 10.0免費下載
  12. 340992  |  191185次下載  |  免費
  13. 7十天學會AVR單片機與C語言視頻教程 下載
  14. 158M  |  183278次下載  |  免費
  15. 8proe5.0野火版下載(中文版免費下載)
  16. 未知  |  138040次下載  |  免費
百家乐龙虎桌布| 百家乐路珠价格| KK百家乐娱乐城 | 大发888通宝| 比如县| 百家乐官网制胜秘| 百家乐mediacorp| 大发888官方中文网址| 真人百家乐官网网西陆| 属狗与属鸡做生意| 大发888体育| 百家乐官网棋牌公式| 网上百家乐官网假| 电脑赌百家乐可靠吗| tt娱乐城官方网站| 百家乐官网专业赌博| 百家乐最常见的路子| 365足球| G3百家乐官网的玩法技巧和规则 | 百家乐官网赌场怎么玩| 德州百家乐赌博规则| 百家乐娱乐网网77scs| 威尼斯人娱乐网网上百家乐的玩法技巧和规则| 外围赌球| 国际娱百家乐官网的玩法技巧和规则 | 百家乐官网玩法开户彩公司| 网上百家乐怎么赌能赢钱| 折式百家乐官网赌台| 英皇国际娱乐| 青鹏棋牌游戏大厅v3.0| 百家乐官网不倒翁注码| 网络百家乐官网赌博视频| 做生意店铺风水| 大发888.comwf| 百家乐官网群到shozo网| 大发888大家赢娱乐| 新奥博百家乐官网娱乐城| 大发888贴吧| 新濠百家乐官网娱乐场| bet365娱乐场注册| 新东泰百家乐官网的玩法技巧和规则 |