我创建了PRACTICE Lauterbach脚本,以从不同情况下的缓冲区中检索某些字符串。
我在从中检索缓冲区的不同位置放置了4个断点。
我想以非阻塞方式检索信息,好像它是一个中断服务程序一样。为此,我使用了GLOBALON命令,如下所示:
GLOBALON PBREAK GOSUB BB_HIT_CALLBACK
在BB_HIT_CALLBACK内,我为4个断点分别插入了服务例程。
BB_HIT_CALLBACK:
IF (sYmbol.EXIST(BREAK_LABEL1))
(
IF (REGISTER(pc)==ADDRESS.offset(BREAK_LABEL1))
(
GOSUB ISR1
)
)
IF (sYmbol.EXIST(BREAK_LABEL2))
(
IF (REGISTER(pc)==ADDRESS.offset(BREAK_LABEL2))
(
GOSUB ISR1
)
)
IF (sYmbol.EXIST(BREAK_LABEL3))
(
IF (REGISTER(pc)==ADDRESS.offset(BREAK_LABEL3))
(
GOSUB ISR1
)
)
IF (sYmbol.EXIST(BREAK_LABEL4))
(
IF (REGISTER(pc)==ADDRESS.offset(BREAK_LABEL4))
(
GOSUB ISR1
)
)
RETURN
另一方面,在正常执行中,我放置了一个简单的无限循环。
WHILE TRUE()
(
If (!STATE.RUN())
(
Go
)
)
ENDDO
这将使程序循环保存,仅由GLOBALON PBREAK命令破坏。我希望能够有一个工具栏按钮来结束此循环的执行,但是在运行时,脚本仅响应断点,并且UI元素被忽略。
如何从UI元素停止执行循环?
我已经能够设置秒数和60秒的超时时间,但这对于我想要的还不够。
答案 0 :(得分:0)
听起来GLOBALON PBREAK
并不是解决问题的最佳方法。
可以在命中每个断点时使用命令断点直接执行任何PRACTICE命令或脚本:
Break.Set BREAK_LABEL1 /CMD "DO your_script.cmm ISR1"
Break.Set BREAK_LABEL2 /CMD "DO your_script.cmm ISR2"
Break.Set BREAK_LABEL3 /CMD "DO your_script.cmm ISR3"
Break.Set BREAK_LABEL4 /CMD "DO your_script.cmm ISR4"
如果您单击“高级”按钮,也可以通过Break.Set
对话框来实现。
使用此设置,your_script.cmm
可能看起来像这样:
PRIVATE &arg
ENTRY &arg
IF "&arg"!=""
(
GOSUB &arg
)
ELSE
(
// script called without arguments -- maybe set the breakpoints here
)
ENDDO
ISR1:
PRINT "ISR1 reached!"
// resume execution of core
Go.direct
RETURN
// and so on for ISR2 to ISR4
这样,您的脚本根本不需要运行。您可以设置工具栏按钮,菜单项,甚至是启动另一个脚本的对话框,这又将停止核心并删除断点。