1

我创建了一个 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 秒时超时,但这对于我想要的来说还不够好。

4

1 回答 1

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

这样,您的脚本根本不需要运行。您可以设置工具栏按钮、菜单项甚至是启动另一个脚本的对话框,这反过来会停止核心并删除断点。

于 2018-07-19T19:29:48.230 回答