三、如何設(shè)定觸發(fā) 設(shè)定邏輯分析儀的觸發(fā)有時(shí)非常困難且耗時(shí),即使知道如何寫程序,也不一定會(huì)做觸發(fā)設(shè)定。這是因?yàn)榫瓦壿嫹治鰞x而言,有許多獨(dú)特的概念。但是只要一旦了解這些概念,觸發(fā)設(shè)定就一點(diǎn)也不困難了。本文的目的即在說明觸發(fā)設(shè)定的概念,以及如何有效利用它們。 比如,為嵌入式系統(tǒng)進(jìn)行故障查找時(shí),需要監(jiān)控系統(tǒng)中許多信號(hào)及其數(shù)據(jù)流的實(shí)時(shí)行為,而邏輯分析儀是最能觀察到嵌入式系統(tǒng)內(nèi)詳細(xì)數(shù)據(jù)的工具。不過,邏輯分析儀也不是魔術(shù),要建立正確的觸發(fā),才能正確對(duì)嵌入式系統(tǒng)進(jìn)行故障查找。 邏輯分析儀中的內(nèi)存可比喻成一條很長的輸送帶,從待測物(DUT)擷取到的取樣點(diǎn),便是輸送帶上的物品。在輸送帶的一端放上新的物品時(shí),舊的物品便會(huì)在另一端被取出。換句話說,因?yàn)檫壿嫹治鰞x的存儲(chǔ)深度(亦即可儲(chǔ)存的取樣點(diǎn))有限,因此當(dāng)存儲(chǔ)記錄滿時(shí),再多擷取一個(gè)新的取樣點(diǎn),就需要?jiǎng)h除一個(gè)最舊的取樣點(diǎn)。以這樣的比喻來看,邏輯分析儀的觸發(fā)設(shè)定就像是“操作員站在輸送帶前,尋找某一個(gè)特殊的物品,他同時(shí)可控制整條輸送帶,在此物品被運(yùn)送到某一個(gè)特定的位置時(shí)停止運(yùn)送”。這個(gè)特殊的物品便是「觸發(fā)點(diǎn)」。當(dāng)邏輯分析儀檢測到在內(nèi)存的某個(gè)適當(dāng)位置,擷取到符合觸發(fā)條件的取樣點(diǎn)時(shí),邏輯分析儀便會(huì)停止搜集數(shù)據(jù)。同時(shí),觸發(fā)位置是可以設(shè)在內(nèi)存內(nèi)任何地方的。 觸發(fā)序列 (Trigger Sequence) 雖然邏輯分析儀的觸發(fā)條件通常很直覺而簡單,但卻有可能需要做相當(dāng)復(fù)雜的程序編輯,例如,使用者可能希望緊接在一個(gè)信號(hào)的上升沿后,另一個(gè)信號(hào)又產(chǎn)生上升沿時(shí),將它定為觸發(fā)點(diǎn)。由于需要一連串的步驟才能找到觸發(fā)點(diǎn),因此可稱這些步驟為觸發(fā)順序,而其中的每一個(gè)步驟則稱為觸發(fā)狀態(tài)。 每一個(gè)觸發(fā)狀態(tài)都由條件與動(dòng)作兩部份組成。條件即為布爾代數(shù),例如,「若ADDR=1000」或「若SIG1產(chǎn)生一個(gè)上升沿」;動(dòng)作則為當(dāng)條件符合時(shí),邏輯分析儀應(yīng)執(zhí)行的工作。例如:觸發(fā)邏輯分析儀、轉(zhuǎn)到另一狀態(tài)(Go To)、或激活定時(shí)器,類似于程序編輯中的If/Then敘述。每一個(gè)觸發(fā)狀態(tài)都會(huì)依序編號(hào),起始時(shí)一定是執(zhí)行第一個(gè)觸發(fā)狀態(tài),但其它狀態(tài)則可依照Go To指令,以任意順序來執(zhí)行。當(dāng)一個(gè)觸發(fā)點(diǎn)在某一狀態(tài)中不符合條件時(shí),邏輯分析儀會(huì)擷取下一個(gè)取樣點(diǎn),并驗(yàn)證是否符合該狀態(tài)的條件。以下面的觸發(fā)狀態(tài)為例: If DATA = 7000 Then Trigger 邏輯分析儀會(huì)不斷搜集取樣點(diǎn),直到DATA為7000時(shí)才做觸發(fā)。一旦邏輯分析儀觸發(fā)后,即使符合觸發(fā)條件的取樣點(diǎn)不只一個(gè),它也不會(huì)再觸發(fā)。 若此條件不符合,邏輯分析儀將搜集下一個(gè)取樣點(diǎn)并執(zhí)行同一狀態(tài)進(jìn)行比較。若取樣點(diǎn)符合條件,邏輯分析儀便會(huì)在另一個(gè)觸發(fā)狀態(tài)執(zhí)行前,擷取到下一個(gè)取樣點(diǎn),因此絕不會(huì)有一個(gè)點(diǎn)符合兩層以上的條件,而且每一狀態(tài)代表的是在不同時(shí)間點(diǎn)發(fā)生的事件。 又以下面的觸發(fā)順序?yàn)槔?br /> If ADDR=1000 Then Go To 2 If DATA=2000 Then Trigger 若邏輯分析儀擷取到的數(shù)據(jù)如下,雖然第一點(diǎn)可符合條件1,但觸發(fā)點(diǎn)應(yīng)發(fā)生在第7個(gè)點(diǎn): | Sample No. | ADDR | DATA | 備注 | | 1 | 1000 | 2000 | 此取樣點(diǎn)符合第一層的條件 | | 2 | 1010 | 3000 | | | 3 | 1020 | 4000 | | | 4 | 1030 | 5000 | | | 5 | 1040 | 6000 | | | 6 | 1050 | 7000 | | | 7 | 1060 | 2000 | 此為邏輯分析儀觸發(fā)的點(diǎn) | 由于新的取樣點(diǎn)會(huì)在第一狀態(tài)條件符合后,與開始測試第二狀態(tài)條件之前被擷取到,因此邏輯分析儀不會(huì)在第一狀態(tài)便觸發(fā)。較佳的觸發(fā)順序邏輯應(yīng)為「Find ADDR=1000 followed by DATA=2000 and then trigger」。下一步若觸發(fā)狀態(tài)的條件能夠符合,邏輯分析儀便會(huì)跳至「Go To」指定的層數(shù)執(zhí)行,但若沒有「Go To」指令可執(zhí)行,下一步該執(zhí)行哪一狀態(tài)便只能由邏輯分析儀決定了。有些邏輯分析儀在此時(shí)會(huì)直接執(zhí)行下一狀態(tài),有些則會(huì)再執(zhí)行原來那一狀態(tài),因此,為了避免如此模棱兩可,最好能明白指示「Go To」這個(gè)動(dòng)作。 布爾代數(shù) 若需要以數(shù)個(gè)條件同時(shí)發(fā)生的情況作為觸發(fā)點(diǎn),則應(yīng)使用布爾代數(shù),例如「If ADDR=1000 AND DATA=2000」。 到底要使用多層式觸發(fā)順序,還是采用布爾代數(shù),混淆二者是觸發(fā)設(shè)定中常見的錯(cuò)誤。通常布爾代數(shù)是用于許多事件同時(shí)發(fā)生時(shí);而對(duì)于一個(gè)事件發(fā)生在另一事件之后,有排列先后的情形,則應(yīng)使用多層式觸發(fā)順序。 分支(Branching) 分支與C語言中的Switch敘述,或Basic語言中的Select Case相類似,都可提供具有個(gè)別動(dòng)作之復(fù)合條件的測試方法。例如: 1.If ADDR<1000 Then Go To 2 (此為第一狀態(tài)的第一個(gè)分支) Else If ADDR>2000 Then GoTo 3 (此為第一狀態(tài)的第二個(gè)分支) Else If DATA=2000 Then Trigger (此為第一狀態(tài)的第三個(gè)分支) 2.If DATA<=7000 Then Trigger 3.If SIG1 rising edge Then Trigger 第一狀態(tài)含有三個(gè)分支,因此有三種可能的動(dòng)作,若能符合第一分支的條件,則其它分支便不做測試;同時(shí),即使一個(gè)取樣點(diǎn)能符合多個(gè)分支的條件,最多也只能執(zhí)行一個(gè)分支的動(dòng)作。 另一種觸發(fā)則可利用并行計(jì)數(shù)器(occurrence counter),找到一個(gè)事件發(fā)生第N次的情況。以下的例子可設(shè)定當(dāng)「ADDR=1000」發(fā)生5次時(shí)做觸發(fā): 1.If ADDR=1000 occurs 5 times Then Trigger 使用定時(shí)器(Timer) 在某些例子中,使用者有興趣的是信號(hào)間的相互影響,此時(shí)可使用定時(shí)器來核對(duì)事件間所耗費(fèi)的時(shí)間。若想在一個(gè)邊沿信號(hào)(edge),與前一個(gè)邊沿信號(hào)相隔 500ns 以內(nèi)時(shí)做觸發(fā),就需要使用定時(shí)器。要記得的是,定時(shí)器必須在檢測前激活。設(shè)定定時(shí)器的關(guān)鍵在于,要辨別何時(shí)激活與何時(shí)做檢測。定時(shí)器需在檢測到SIG1的上升沿時(shí)激活,并在出現(xiàn)SIG2上升沿時(shí)檢測。因此,這樣的測量可設(shè)定為: 1.If theres a Rising Edge on SIG1, then Start Timer 1 Go to 2. 2.If theres a Rising Edge on SIG2 And Timer 1 < 500ns then Trigger. 以上的觸發(fā)順序看似正確,其實(shí)隱藏了一個(gè)很危險(xiǎn)的缺陷。若SIG1與SIG2的上升緣相隔超過500 ns時(shí)會(huì)發(fā)生什么事?沒錯(cuò),邏輯分析儀不會(huì)做觸發(fā),因?yàn)門imer1會(huì)持續(xù)計(jì)時(shí),使得觸發(fā)條件永遠(yuǎn)也無法滿足,但稍后可能又出現(xiàn)SIG1,并在 500ns 內(nèi)發(fā)生了SIG2。 若要解決這個(gè)問題,應(yīng)在定時(shí)器每超過 500ns 而沒觸發(fā)時(shí),重新回到第一狀態(tài),尋找SIG1的上升沿,正確的觸發(fā)順序應(yīng)為: 1.If theres a Rising Edge on SIG1, then Start Timer1 Go to 2. 2.If theres a Rising Edge on SIG2 And Timer1<500 ns then Trigger Else If Timer1>=500 ns, then Reset Timer1 Go to 1 節(jié)省內(nèi)存 為嵌入式軟件糾錯(cuò)時(shí),常遇到無法精確指出到底是匯編語言中哪一行指令是程序的問題所在。只知道錯(cuò)誤點(diǎn)接著百萬狀態(tài)后,發(fā)生了不正常動(dòng)作,因此可在此現(xiàn)象作觸發(fā),但卻因內(nèi)存有限,而無法同時(shí)看到原因(錯(cuò)誤)與現(xiàn)象(問題)。兩種最簡單節(jié)省內(nèi)存的方法是時(shí)鐘與儲(chǔ)存資格限制。 時(shí)鐘限定(Clock Qualification) 分析儀采用系統(tǒng)時(shí)鐘做為狀態(tài)分析的取樣率,同時(shí)擷取幾個(gè)其它信號(hào),例如:*TA與TSIZ,作為時(shí)鐘限定。因此只有當(dāng)系統(tǒng)時(shí)鐘為上升沿,同時(shí)*TA(K-clock)為低基準(zhǔn)時(shí),才儲(chǔ)存該取樣點(diǎn)。 存儲(chǔ)限定(Storage Qualification) 存儲(chǔ)限定也可達(dá)到有效運(yùn)用邏輯分析儀內(nèi)存的目的,更進(jìn)一步地,在觸發(fā)點(diǎn)前后可采用不同的存儲(chǔ)設(shè)定。最簡單的存儲(chǔ)限定是預(yù)設(shè)儲(chǔ)存(default storage),除非觸發(fā)狀態(tài)另有特別的設(shè)定,否則就須儲(chǔ)存取樣點(diǎn)。因此,如果只想要儲(chǔ)存 ADDR 在 1000 至 2000 的點(diǎn),則預(yù)設(shè)儲(chǔ)存應(yīng)設(shè)定為「ADDR In Range 1000 to 2000」,若全部不存,則可設(shè)為儲(chǔ)存「Nothing」。 有些問題是不能單用邏輯分析儀解決的,因?yàn)橥ǔJ窃谝姷讲徽,F(xiàn)象時(shí),才觸發(fā)邏輯分析儀。例如為找出系統(tǒng)總是周期性死機(jī)(crash)的原因 ,我們發(fā)現(xiàn)某一變量A總是在死機(jī)前變成72,所以選擇在A=72前提下做觸發(fā),但如此一來,觸發(fā)后待測系統(tǒng)卻繼續(xù)動(dòng)作直到過了十萬狀態(tài)后才死機(jī)。若能在擷取到代表系統(tǒng)即將毀損的信號(hào)時(shí),讓系統(tǒng)暫停,再單步執(zhí)行直到系統(tǒng)死機(jī),便可找出真正的問題。這就要使用內(nèi)部模塊觸發(fā)(Intermodule Trigger)功能,連結(jié)邏輯分析儀與能控制該處理器執(zhí)行(Run Control)的仿真器,在找到A=72時(shí)暫停待測物,以觀察究竟發(fā)生了什么狀況,導(dǎo)致周期性死機(jī)。 通常邏輯分析儀的觸發(fā)設(shè)定與軟件的編輯大不相同,如果能以事先定義的觸發(fā)函數(shù)以及具有完整說明的現(xiàn)成觸發(fā)為參考,設(shè)定的工作便可簡化許多。只有在沒有任何一項(xiàng)可使用時(shí),才需要自己編輯觸發(fā)順序。最后,在面臨較復(fù)雜的觸發(fā)設(shè)定時(shí),別忘了先將問題分解,再一項(xiàng)一項(xiàng)地進(jìn)行處理,同時(shí)活用邏輯分析儀中不同模塊的功能組合,以擴(kuò)大其使用功效。 |