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