在PRACTICE脚本循环正在运行(并阻止)执行时,如何在劳特巴赫中使用AddMenu?

时间:2018-06-19 20:21:36

标签: scripting trace32 lauterbach

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

1 个答案:

答案 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

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