三、如何设定触发 设定逻辑分析仪的触发有时非常困难且耗时,即使知道如何写程序,也不一定会做触发设定。这是因为就逻辑分析仪而言,有许多独特的概念。但是只要一旦了解这些概念,触发设定就一点也不困难了。本文的目的即在说明触发设定的概念,以及如何有效利用它们。 比如,为嵌入式系统进行故障查找时,需要监控系统中许多信号及其数据流的实时行为,而逻辑分析仪是最能观察到嵌入式系统内详细数据的工具。不过,逻辑分析仪也不是魔术,要建立正确的触发,才能正确对嵌入式系统进行故障查找。 逻辑分析仪中的内存可比喻成一条很长的输送带,从待测物(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」。 有些问题是不能单用逻辑分析仪解决的,因为通常是在见到不正常现象时,才触发逻辑分析仪。例如为找出系统总是周期性死机(crash)的原因 ,我们发现某一变量A总是在死机前变成72,所以选择在A=72前提下做触发,但如此一来,触发后待测系统却继续动作直到过了十万状态后才死机。若能在撷取到代表系统即将毁损的信号时,让系统暂停,再单步执行直到系统死机,便可找出真正的问题。这就要使用内部模块触发(Intermodule Trigger)功能,连结逻辑分析仪与能控制该处理器执行(Run Control)的仿真器,在找到A=72时暂停待测物,以观察究竟发生了什么状况,导致周期性死机。 通常逻辑分析仪的触发设定与软件的编辑大不相同,如果能以事先定义的触发函数以及具有完整说明的现成触发为参考,设定的工作便可简化许多。只有在没有任何一项可使用时,才需要自己编辑触发顺序。最后,在面临较复杂的触发设定时,别忘了先将问题分解,再一项一项地进行处理,同时活用逻辑分析仪中不同模块的功能组合,以扩大其使用功效。 |