通過對真實案例的學習和對專業(yè)工具(例如邏輯分析儀、JTAG調(diào)試器和性能分析儀)的廣泛研究,本書提出了調(diào)試實時系統(tǒng)的實踐方法。它遵循嵌入式系統(tǒng)的傳統(tǒng)設計生命周期原理,指出了哪里會導致錯誤,進一步闡述如何在將來的設計中發(fā)現(xiàn)和避免錯誤。它還研究了應用程序性能監(jiān)控、單個程序運行跟蹤記錄以及多任務OS中單獨運行應用的其它的調(diào)試和控制方法。
為什么要寫一本有關實時系統(tǒng)調(diào)試的書?我很高興你能如此發(fā)問。有關實時系統(tǒng)或嵌入式系統(tǒng)調(diào)試已經(jīng)有不少文章,但是據(jù)我所知,這些文章中的內(nèi)容并沒有被集結成冊。
經(jīng)過多年的嵌入式系統(tǒng)設計教學,我得出了這樣的結論:我們作為教師是失敗的。因為盡管我們的學生能夠用匯編語言、C、C 、C#、某種特定Arduino語言或者Verilog編寫程序并能編譯編寫好的程序,但是在面對突發(fā)問題時這是不可避免的,學生們?nèi)匀粺o法分析問題、按照系統(tǒng)化方式鎖定問題原因以及查找和修正錯誤之處。我希望在本書中解決這些問題。
我注意到了學生們使用所謂霰彈測試方式,這令我非常沮喪。該方式指一次性進行大量修改,然后指望好事降臨。甚至更令人不安的是,學生們會放棄他們的代碼或者原型系統(tǒng),全部從頭再來,祈禱這樣能解決問題,而不是試著發(fā)現(xiàn)和修復問題。
你可能會假設,當今天的學生變身為明天的工程師并且全身心投入產(chǎn)品設計時,他們就已經(jīng)具備以高效的方式進行相關工作所必需的調(diào)試技術。我已經(jīng)認識到這個假設難以成真。
在成為大學教師之前,我在公司工作,為嵌入式系統(tǒng)設計師構建設計和調(diào)試工具。我主要負責設計,并帶領團隊設計邏輯分析儀、在線仿真器和性能分析工具。在許多情況下,我還要設計復雜的設備以解決復雜的問題。僅僅學習并熟練掌握這些設備中的一種就已經(jīng)很累了,許多工程師并不想為此花費大量時間。
也許你也是這么想的。你是否分析過這種投入產(chǎn)出比:是先花時間瀏覽一大堆手冊再上手,還是直接上手并祈禱一切順利?我曾經(jīng)共事過的睿智的工程師John Hansen有過這樣的言論這被人們稱為漢森定律(Hansens Law):
如果客戶不知道如何去使用一項功能,那么這個功能就是不存在的。
因此,作為這些復雜而昂貴的調(diào)試工具的供應商,我們當然應負主要責任。我們無法有效地將技術轉(zhuǎn)移給用戶,讓用戶能夠充分利用工具的強大功能來解決問題。
這里再舉一個例子。我清楚地記得這個例子,因為它讓我以一種全新的方式來看待技術以及技術轉(zhuǎn)移。我們將在后文中繼續(xù)討論這個問題,但現(xiàn)在是介紹這個問題的好時機,這個問題與邏輯分析儀有關。多年來,邏輯分析儀已經(jīng)成為實時系統(tǒng)分析的主要工具。有證據(jù)表明,其主導地位可能正在改變,但現(xiàn)在,我們假設邏輯分析儀仍然占據(jù)著突出的位置。
假設你正在調(diào)試一個復雜的、具有多優(yōu)先級任務并發(fā)運行的實時系統(tǒng),那么你就無法通過代碼讓處理器停止并執(zhí)行單步運行。而許多優(yōu)秀的調(diào)試器都是任務感知的,因此它們可以在不阻止其他任務全速運行的情況下,單獨執(zhí)行特定任務。
邏輯分析儀位于處理器(或者多個處理器)和系統(tǒng)的其他部分之間,并且實時記錄處理器輸出的每個地址位、數(shù)據(jù)位和狀態(tài)位的狀態(tài),然后將其實時輸入到處理器。一旦緩存區(qū)或者記錄存儲器存滿,工程師之后就可以通過它進行跟蹤,并觀察在感興趣的時間段內(nèi)到底發(fā)生了什么。
但是如何定義感興趣的時間段呢?你的存儲緩沖區(qū)并不是無限大的,并且1s內(nèi)處理器會完成數(shù)千萬個甚至數(shù)億個總線周期的運行。這就是邏輯分析儀作為一種工具的高光時刻。用戶可以通過代碼定義一系列事件,這非常類似于有限狀態(tài)機中的一系列狀態(tài)。在一些邏輯分析儀中,這些狀態(tài)可以用工程師熟悉的高級C 代碼來定義。
如果用戶獲取到這一系列正確定義的狀態(tài),邏輯分析儀將在代碼序列中恰當?shù)臅r間點觸發(fā)(捕捉)跟蹤,以顯示何處出錯。這就是有趣之處。在20世紀90年代中期,HP(現(xiàn)在是Keysight)邏輯分析儀的跟蹤緩沖區(qū)相當小,但狀態(tài)機非常復雜。當時的設計哲學就是用戶不需要大的跟蹤緩沖區(qū),因為他們可以準確地定位問題。實際上,邏輯分析儀的狀態(tài)機有8級。這里有個使用示例,如圖1所示。
圖1 邏輯分析儀多級觸發(fā)系統(tǒng)示例
這個例子有3級,對于狀態(tài)定義或可能運行的循環(huán)次數(shù),每一級都有許多選項。我們發(fā)現(xiàn),客戶很少嘗試設置超過2級的觸發(fā)條件。他們不喜歡這個產(chǎn)品的原因是它的跟蹤
緩沖區(qū)太。5000個狀態(tài))。他們更喜歡使用深內(nèi)存的簡單觸發(fā),而不是淺內(nèi)存的復雜觸發(fā)。這與我們每次進行的客戶回訪是相當一致的。
重點是什么?與我們交談的工程師們沒有使用邏輯分析儀強大的觸發(fā)能力,而是選擇了難度小的方式。他們寧愿手動瀏覽冗長的跟蹤列表以找到感興趣的事件,也不去學習如何設置復雜的觸發(fā)條件。換句話說,要權衡是使用一個復雜的工具,還是使用一個功能較弱但更容易使用的工具。
你可能會說工程師們很懶,但是我不這么認為。我相信,如果我們工具設計師可以發(fā)明一種正在嘗試解決困難的調(diào)試問題的工程師與工具本身之間的更直觀、更友好的用戶接口,使工程師每次都能獲取解決方案,那么他的調(diào)試能力也會不斷提高。
為什么我要舉這個例子呢?我想在本書一開始就提到它,因為調(diào)試實時系統(tǒng)通常非常困難,工程師需要使用復雜的工具,以便及時將高質(zhì)量的產(chǎn)品推向市場。如果本書有助于學習如何使用工具,或者能促使讀者更深入地研究用戶手冊,那么本書就達到了目的。
本書初的目標讀者是學生,不僅是那些想要進入嵌入式系統(tǒng)設計領域的學生,而且是所有希望在設計調(diào)試中提高自己技能的電氣工程、計算機科學或計算機工程的學生。他們可以在工作面試時隨意地提到,自己已經(jīng)付出了一些努力,不僅能做項目,還能夠?qū)崿F(xiàn)沒有缺陷的項目。此外,他們還可以向面試官表示,他們進入就業(yè)市場時所擁有的技能比同期畢業(yè)生所擁有的要多。
對于已經(jīng)是從業(yè)者而且想磨煉技能的、有經(jīng)驗的工程師而言,我希望本書會提供一個他們可能還不知道的工具與技術的路線圖,或者提供更有效的方法來解決突然出現(xiàn)在工作中的問題。
在研究和編寫本書的過程中,我發(fā)現(xiàn)對特定類別錯誤而言,應用筆記和白皮書是好的信息來源。我自己寫過很多這樣的文章,因此對這些信息的質(zhì)量很有信心。
如果你仔細想想,這是顯而易見的。隨著技術的進步,公司會不斷地調(diào)查其客戶群以查找總是出現(xiàn)的設計和調(diào)試方面的問題。這些客戶的問題是創(chuàng)建工具的驅(qū)動力,這些工具將解決問題或者至少能指出問題的根源。
一旦發(fā)明了這種工具,公司必須向客戶解釋它的潛在價值,所以會在會議上發(fā)表演講,在行業(yè)出版物上發(fā)表技術文章,推出與問題關聯(lián)的應用筆記,以及問題、工具和解決方案相關的資源,以期得到工程師的認可并通過他們向高層管理人員證明采購的合理性。
這些文章雖然明顯是服務于發(fā)表文章的公司的,但依然是有價值的資源,它們能向工程師提供好的、的實用信息。對我來說,這些資源是本書的主要資料來源。
我們將從檢查調(diào)試問題本身著手。導致調(diào)試問題如此獨特的實時系統(tǒng)的本質(zhì)是什么?關于這個問題,你可能會說:實時性啊。但這只是問題的一部分。對大量的嵌入式系統(tǒng)而言,確定的硬件、可編程的硬件、固件、操作系統(tǒng)和應用軟件都可能是獨特的,或者至少大部分設計是獨特的。
甚至隨著產(chǎn)品的技術進步還算不上技術革命,就會有許多新元素必須被集成到整個設計中。因此,不僅僅是實時或者非實時的問題,還有系統(tǒng)中變量的數(shù)量,以及系統(tǒng)必須實時運行等問題。
在審視問題之后,我們會將注意力轉(zhuǎn)到如何調(diào)試硬件和軟件的整體策略上來。我們將著眼于實踐和通用策略。此外,考慮可測試性問題也很有用,因為調(diào)試那些沒有把調(diào)試作為首要設計的系統(tǒng)是一個挑戰(zhàn)。
從策略上,我們將把注意力轉(zhuǎn)向工具和技術。我們將著眼于一些基本問題,并尋求方法來解決。
接下來,我們將介紹芯片制造商提供片上調(diào)試和性能資源的形式,以幫助客戶將新設計推向市場。
本書的后一部分將涵蓋串行協(xié)議,以及如何調(diào)試它們。按照領域內(nèi)一些專家的觀點,越來越多的調(diào)試問題與串行數(shù)據(jù)傳輸相關,與經(jīng)典調(diào)試技術相關的問題越來越少了。
我盡力讓本書通俗易懂,不那么學究氣。我將很多個人的逸事寫進書中,因為它們可以幫助表達觀點,并且讀起來很有趣,寫起來也很有趣。這個方法我是從Bob Pease的經(jīng)典著作Troubleshooting Analog Circuits[1]中學到的。許多高級工程師都知道Bob在Electronic Design Magazine上的專欄Whats all this…。
他的書和這些專欄都是經(jīng)典的資料,我在本書中也借用了他的談話風格。順便說一下,我喜歡的Whats all this…專欄的內(nèi)容是他對那些正在使用的昂貴揚聲器電纜的分析,證明它們與簡單的電燈線相比更具音頻優(yōu)勢。Bob的分析很嚴格,同時具有閱讀的樂趣和教育性。更重要的是,他很好地讓音頻優(yōu)越性跌至谷底。
另外,我并沒有嚴格地將主題材料限定到該主題相關章節(jié)中。你會發(fā)現(xiàn)一些例子可能會出現(xiàn)在不同的章節(jié)。這是特意構思的,而不是我短暫失憶所致。這個做法來自教學實踐。我經(jīng)常反復回顧材料,以便把它放在不同的章節(jié)內(nèi)容中,而不是簡單地講講就過去了。因此,如果在關于常見軟件缺陷的章節(jié)中,你看到關于常見的實時操作系統(tǒng)(RTOS)錯誤的討論,然后發(fā)現(xiàn)它在調(diào)試實時操作系統(tǒng)的章節(jié)中再次出現(xiàn),不要說我沒有警告過你。
譯者序
前言
第1章 問題在何處 / 1
參考文獻 / 8
第2章 系統(tǒng)化的調(diào)試方法 / 9
2.1 調(diào)試的六個階段 / 9
2.1.1 誰有故障 / 12
2.1.2 我遇到過的一個缺陷 / 12
2.2 參考文獻 / 22
第3章 嵌入式軟件調(diào)試的實踐 / 23
3.1 引言 / 23
3.2 造成嵌入式系統(tǒng)與眾
不同的原因 / 24
3.2.1 嵌入式系統(tǒng)專門用于特定
的任務,而PC是通用的
計算平臺 / 24
3.2.2 軟件失效在嵌入式系統(tǒng)中
造成的影響要比在桌面系
統(tǒng)中嚴重得多 / 24
3.2.3 嵌入式系統(tǒng)具有實時性約束 / 25
3.2.4 嵌入式系統(tǒng)可被各式各樣
的處理器以及處理器架構
支持 / 26
3.2.5 嵌入式系統(tǒng)通常對成本
非常敏感 / 26
3.2.6 嵌入式系統(tǒng)具有功耗限制 / 27
3.2.7 嵌入式系統(tǒng)必須能在
環(huán)境下工作 / 27
3.2.8 嵌入式系統(tǒng)的資源要比桌面
系統(tǒng)少得多 / 27
3.2.9 嵌入式微處理器通常具有
專用調(diào)試電路 / 27
3.2.10 如果嵌入式系統(tǒng)用到了操作
系統(tǒng),那么它所用的很可能
是實時操作系統(tǒng) / 28
3.3 嵌入式系統(tǒng)調(diào)試的實踐 / 28
3.4 通用軟件調(diào)試實踐 / 32
3.5 嵌入式軟件調(diào)試實踐 / 36
3.6 內(nèi)存泄漏 / 37
3.7 時鐘抖動 / 39
3.8 優(yōu)先級反轉(zhuǎn) / 40
3.9 棧溢出 / 40
3.10 本章小結 / 41
3.11 拓展讀物 / 42
3.12 參考文獻 / 43
第4章 調(diào)試嵌入式硬件的實踐 / 44
4.1 概述 / 44
4.2 硬件調(diào)試過程 / 44
4.3 設計評審 / 45
4.4 測試計劃 / 47
4.5 可測試性設計 / 49
4.6 構建流程 / 50
4.7 了解你的工具 / 53
4.8 微處理器設計實踐 / 57
4.8.1 引言 / 57
4.8.2 可測試性設計 / 57
4.8.3 考慮PCB問題 / 58
4.9 本章小結 / 63
4.10 拓展讀物 / 64
4.11 參考文獻 / 64
第5章 嵌入式設計與調(diào)試工具概覽 / 66
5.1 概述 / 66
5.2 調(diào)試器 / 66
5.3 軟硬件協(xié)同驗證 / 69
5.4 ROM仿真器 / 73
5.5 邏輯分析儀 / 77
5.6 邏輯分析儀的優(yōu)勢 / 84
5.7 邏輯分析儀的問題 / 84
5.8 在線仿真器 / 85
5.9 拓展讀物 / 89
5.10 參考文獻 / 89
第6章 硬件/軟件集成階段 / 90
6.1 概述 / 90
6.2 硬件/軟件集成圖 / 90
6.3 非標準硬盤驅(qū)動器接口的案例 / 91
6.4 向量顯示器的后關頭 / 92
6.5 性能差勁的仿真器卡籠 / 92
6.6 功能蠕變和大客戶 / 93
6.7 參考文獻 / 108
第7章 片上調(diào)試資源 / 110
7.1 概述 / 110
7.2 后臺調(diào)試模式 / 111
7.3 JTAG / 112
7.4 MIPS EJTAG / 115
7.5 本章小結 / 116
7.6 參考文獻 / 118
第8章 片上系統(tǒng) / 119
8.1 概述 / 119
8.2 現(xiàn)場可編程門陣列 / 120
8.3 虛擬化 / 126
8.4 本章小結 / 129
8.5 拓展讀物 / 130
8.6 參考文獻 / 130
第9章 隔離缺陷的測試方法 / 131
9.1 概述 / 131
9.2 查找問題的障礙 / 131
9.3 臨時應急 / 132
9.4 尋求幫助 / 132
9.5 故障隔離 / 133
9.5.1 了解你的工具 / 134
9.5.2 理解你的設計 / 136
9.6 與性能相關的故障 / 137
9.7 可復現(xiàn)故障 / 137
9.8 間歇性故障 / 138
9.9 合規(guī)故障 / 141
9.10 擴頻振蕩器 / 142
9.11 熱故障 / 144
9.12 機械問題 / 146
9.13 與供電相關的故障 / 147
9.14 本章小結 / 149
9.15 參考文獻 / 151
第10章 調(diào)試實時操作系統(tǒng) / 152
10.1 概述 / 152
10.2 RTOS中的缺陷 / 152
10.3 同步問題 / 153
10.4 內(nèi)存崩潰 / 154
10.5 與中斷相關的問題 / 155
10.6 意想不到的編譯器優(yōu)化 / 157
10.7 異!/ 157
10.8 RTOS感知工具:一個示例 / 159
10.9 參考文獻 / 163
第11章 串行通信系統(tǒng) / 164
11.1 引言 / 164
11.2 RS-232 / 165
11.3 錯誤的COM端口分配 / 165
11.4 不正確的電纜引腳 / 166
11.5 錯誤的波特率(時鐘頻率) / 166
11.6 不正確的流控 / 167
11.7 I2C和SMBus協(xié)議 / 168
11.8 SPI協(xié)議 / 171
11.9 工具 / 174
11.10 控制器局域網(wǎng)絡(CAN總線) / 174
11.11 本章小結 / 175
11.12 拓展讀物 / 175
11.13 參考文獻 / 175
第12章 存儲器