如何等待t32rem DO脚本完成?

时间:2019-02-15 16:21:00

标签: trace32 lauterbach

似乎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阅读,确实注意到T32_Cmd for DO是非阻塞的,建议使用T32_GetPractice进行轮询,但是尚不清楚如何将其转换为t32rem

1 个答案:

答案 0 :(得分:1)

我认为您的问题是一个很好的问题。

首先讨厌: t32rem 不适合等待脚本执行。实际上,t32rem在使用T32_Stop()执行命令之前会取消所有正在运行的脚本。 (您可以在TRACE32安装中的“ C:\ T32 \ demo \ api \ capi \ test \ t32rem.c”中找到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 <host> [port=<n>] <practice script>

我上面的示例代码已获得Creative Commons Zero 1.0的许可。以任何所需的方式,以任何所需的代码使用它。