【问题标题】:How to wait for t32rem DO script to complete?如何等待 t32rem DO 脚本完成?
【发布时间】:2019-02-15 16:20:59
【问题描述】:

看来t32rem localhost DO script.cmm 是非阻塞的。在 cmm 脚本完成之前,如何阻止 shell 脚本?

这是一个简短的例子:

$ time t32rem localhost wait 5s
real    0m5.048s

$ cat wait-5s.cmm 
WAIT 5s
ENDDO    
$ time t32rem localhost do wait-5s
real    0m0.225s

我可以尝试根据确切的脚本执行某种t32rem localhost wait STATE.RUN(),但这不是一个很好的解决方案。

通读 api_remote.pdf 确实注意到 DO 的 T32_Cmd 是非阻塞的,并建议使用 T32_GetPractice 进行轮询,但不清楚如何将其转换为 t32rem

【问题讨论】:

    标签: trace32 lauterbach


    【解决方案1】:

    在我看来,你的问题是一个相当不错的问题。

    首先是无赖:t32rem 不适合等待脚本执行。事实上 t32rem 在使用 T32_Stop() 执行命令之前取消任何正在运行的脚本。 (您可以在“C:\T32\demo\api\capi\test\t32rem.c”找到您的TRACE32安装中t32rem的源代码)

    所以你使用t32rem localhost wait STATE.RUN() 的建议肯定行不通,因为它会取消正在运行的脚本。此外,STATE.RUN()返回被调试 CPU 的运行状态,而不是 PRACTICE 解释器的运行状态。

    所以实际上你必须使用 T32_GetPractice() 来等待 PRACTICE 脚本终止。要使用 T32_GetPractice(),您必须将“C 中用于远程控制和 JTAG 访问的 API”静态或动态链接到启动脚本的应用程序。

    对于动态链接(例如从 Python 脚本)加载“C:\T32\demo\api\capi\dll\t32api.dll”。 (根据您的主机操作系统,您可能需要 t32api64.dll、t32api.so 或 t32api64.so。)

    对于静态链接(例如,来自用 C 编写的二进制应用程序),将“C:\T32\demo\api\capi\src”中的文件添加到您的项目中。

    下面是编写命令行应用程序 t32do 的代码,它启动 PRACTICE 脚本并等待脚本终止:

    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <unistd.h>
    #include "t32.h"
    
    int main(int argc, char *argv[])
    {
        int         pstate;
        const char *script;
    
        if (argc == 4  &&  !strncmp(argv[2],"port=", 5)) {
            if ( T32_Config( "PORT=", argv[2]+5 ) == -1 ) {
                printf("Port number %s not accepted\n", argv[2] );
                exit(2);
            }
            script = argv[3];
        } else {
            if (argc != 3) {
                printf( "Usage: t32do <host> [port=<n>] <script>\n" );
                exit(2);
            }
            script = argv[2];
        }
        if ( T32_Config( "NODE=", argv[1] ) == -1 ) {
            printf( "Hostname %s not accepted\n", argv[1] );
            exit(2);
        }
        if ( T32_Init() != 0 ||  T32_Attach(1) != 0){
            printf( "Failed to connect to TRACE32\n" );
            exit(2);
        }
    
        if ( T32_Cmd_f("DO \"%s\"", script) != 0 ){   // Launch PRACTICE script
            printf( "Failed to start PRACTICE script\n" );
            T32_Exit();
            exit(1);
        }
        while (T32_GetPracticeState(&pstate) == 0  &&  pstate != 0){   // Wait until PRACTICE script terminates 
            usleep(10000);
        }
        T32_Exit();
        return 0;
    }
    

    将源代码放入“C:\T32\demo\api\capi\src”中名为 t32do.c 的文件中,并使用以下 makefile 构建应用程序,该文件适用于两个 Windows(通过使用 Cygwin 的 MinGW 编译器) ) 和 Linux:

    BIN   := t32do
    OBJ   := t32do.o hremote.o hlinknet.o
    
    OS := $(shell uname -s)
    
    ifneq ($(findstring CYGWIN,$(OS)),)
    CC    := x86_64-w64-mingw32-gcc
    LOPT  := -lws2_32
    COPT  := -DT32HOST_LE
    endif
    
    ifneq ($(findstring Linux,$(OS)),)
    CC    := gcc
    COPT  := -DT32HOST_LE
    endif
    
    all: $(BIN)
    
    $(BIN): $(OBJ)
        $(CC) $^ -s -o $@  $(LOPT)
    
    %.o: %.c t32.h
        $(CC) -c $(COPT) -o $@  $<
    
    clean:
        -rm $(OBJ) $(BIN)
    

    如果编译和链接正常,您将获得一个应用程序 t32do.exe。 使用形式:t32do &lt;host&gt; [port=&lt;n&gt;] &lt;practice script&gt;

    我上面的示例代码在Creative Commons Zero 1.0 下获得许可。以任何你想要的方式,在你想要的任何代码中使用它。

    【讨论】:

    • 不幸的是,答案是“使用 t32api 自己动手”,如果内置 t32rem 工具使用 --option 处理这个问题会好得多。我最终在 python 中使用 ctypes 而不是 subprocess.run('t32rem DO') 编写了类似的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    • 2011-05-22
    • 1970-01-01
    • 2016-05-23
    • 1970-01-01
    相关资源
    最近更新 更多