3. 多工位测试资源管理
当测试系统从单工位扩展到多工位并行时,最先暴露的问题往往不是测试逻辑本身,而是资源争用。典型场景是:4 个工位同时执行同一测试序列,序列中都要调用同一台程控电源、同一个射频开关矩阵或同一个数据采集卡。如果没有任何协调机制,两个工位可能在同一时刻向同一仪器发送 SCPI 命令,导致命令交错、响应错配,甚至仪器进入不可预期的状态。TestStand 提供的资源管理机制,本质上就是解决“谁在什么时间可以独占或共享某个资源”的问题。
资源锁:最基础的互斥手段
资源锁(Lock)是 TestStand 中最直接的互斥工具。它的语义是:一个执行线程在进入临界区前获取锁,离开时释放锁;在锁被占用期间,其他线程若尝试获取,会被阻塞或按策略等待。TestStand 的 Lock 对象支持两种获取方式:Lock() 为阻塞式,调用线程会一直等待直到获得锁;TryLock() 为非阻塞式,立即返回布尔结果,适合需要做超时判断或降级处理的场景。
一个常见的教学示例是:假设 4 个工位共享一台 Keysight N6705C 直流电源,每个工位在测试开始阶段需要设置电压为 5.0 V、限流 1.0 A,然后读取电流值。若不加锁,两个工位可能先后发送 VOLT 5.0 和 VOLT 3.3,导致后一个工位读到的是前一个工位设置的电压。正确做法是在设置与读取之间用同一把锁保护:
Lock("PSU_N6705C")
WriteSCPI("VOLT 5.0")
WriteSCPI("CURR 1.0")
WriteSCPI("OUTP ON")
current = QuerySCPI("MEAS:CURR?")
Unlock("PSU_N6705C")
这里的关键不是“加锁”这个动作,而是锁的粒度。锁的粒度太粗,会把整个测试序列串行化,并行收益归零;粒度太细,又可能无法覆盖完整的“设置—稳定—读取”事务。经验上,锁应覆盖一个不可分割的仪器交互事务,而不是覆盖整个测试步骤或整个序列。
资源池:把“独占”变成“可复用”
资源锁解决的是“同一资源同一时刻只能一个工位用”,但有些资源本身是可复用的,例如 8 通道的数据采集卡、16 端口的射频开关矩阵、多通道的电源模块。这类资源不需要整台独占,而是按通道或按端口分配。资源池(Resource Pool)就是为这种场景设计的:池中预先登记若干可用资源单元,工位使用时从池中申请,用完归还,池负责记录哪些单元空闲、哪些被占用。
在 TestStand 中,资源池通常用队列(Queue)或数组加信号量来实现。以 8 通道 DAQ 为例,可以建立一个包含 8 个通道号的队列,每个工位执行到采集步骤时从队列取出一个通道号,采集完成后把通道号放回队列。这样 4 个工位可以同时使用 4 个不同通道,而不是排队等待整台设备。资源池的核心参数是池容量和分配策略:容量决定最大并发数,分配策略决定是先进先出、优先级还是随机分配。
工位独占与共享资源的冲突处理
多工位系统中,资源可以按访问方式分为三类:工位独占资源、完全共享资源、条件共享资源。工位独占资源指每个工位有自己独立的仪器或通道,例如每个工位一台专用电源,这类资源不需要锁,也不应放入共享池。完全共享资源指所有工位都必须串行访问的资源,例如一台高精度源表,这类资源必须用锁保护。条件共享资源最复杂:某些时段可以并行,某些时段必须独占,例如一台频谱仪在配置模式时需要独占,在测量模式时可以多工位分时读取。
冲突处理的判断逻辑可以归纳为:先判断资源是否可分区,可分区则用资源池按通道分配;不可分区则判断是否可重入,不可重入则用锁串行化;若既不可分区又需要高并发,则应考虑增加硬件或改用其他测试架构。这个判断顺序很重要,因为很多工程师第一反应是加锁,结果把并行系统做成了串行系统。
实际配置中的关键参数与观察点
在 TestStand 中实现资源管理时,有几个参数直接影响行为。第一是锁的超时时间。若使用 Lock() 阻塞式获取,建议设置超时,避免某个工位异常退出后锁未释放导致其他工位永久阻塞。超时后应记录错误并进入清理流程。第二是资源池的容量。容量应等于实际可分配的通道数或端口数,不应大于物理资源数,否则会出现“池中还有资源但物理上已冲突”的假象。第三是释放策略。锁和池资源都应在 Post-Step 或 Cleanup 中释放,而不是依赖序列正常结束,因为异常分支可能跳过释放步骤。
观察资源管理是否生效,可以看三个指标:工位等待时间、仪器命令交错次数、测试总时长。若加锁后总时长接近串行执行时间,说明锁粒度过粗;若仪器仍出现响应错配,说明锁未覆盖完整事务;若资源池分配后仍有工位长时间空闲,说明池容量或分配策略需要调整。
冲突处理的工程判断
多工位资源管理的目标不是“消除所有冲突”,而是“让冲突以可控、可预期的方式发生”。完全避免冲突往往意味着过度串行化,牺牲并行收益。合理的做法是:对不可分区资源用锁保证正确性,对可分区资源用池提高并发度,对条件共享资源用“锁+池”组合,并在设计阶段就明确每个资源的访问类别。这样在出现工位等待或测试失败时,能快速定位是锁竞争、池耗尽还是资源类别判断错误,而不是盲目增加延时或重试。