如何等待 t32rem DO 脚本完成?
How to wait for t32rem DO script to complete?
看来做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
对于 DO 是非阻塞的并且建议使用 T32_GetPractice
进行轮询,但不清楚如何将其转换为 t32rem
.
我觉得你的问题比较好。
首先是无赖:t32rem 不适合等待脚本的执行。事实上,t32rem 在使用 T32_Stop() 执行命令之前会取消任何 运行 脚本。 (您可以在 "C:\T32\demo\api\capi\test\t32rem.c" 的 TRACE32 安装中找到 t32rem 的源代码)
所以您建议使用 t32rem localhost wait STATE.RUN()
肯定行不通,因为它会取消 运行 脚本。此外 STATE.RUN()
returns 被调试 CPU 而不是 PRACTICE 解释器的 运行 状态。
所以实际上你必须使用 T32_GetPractice() 来等待 PRACTICE 脚本终止。要使用 T32_GetPractice(),您必须静态地 link 或动态地 "API for Remote Control and JTAG Access in C" 到启动脚本的应用程序。
对于动态 linking(例如从 Python 脚本)加载 "C:\T32\demo\api\capi\dll\t32api.dll"。 (根据您的主机操作系统,您可能需要 t32api64.dll、t32api.so 或 t32api64.so。)
对于静态 linking(例如,从用 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)
如果编译成功并且 link 没问题,您将获得一个应用程序 t32do.exe。
在表格中使用它:t32do <host> [port=<n>] <practice script>
我上面的示例代码是根据 Creative Commons Zero 1.0 获得许可的。在您想要的任何代码中以您希望的任何方式使用它。
看来做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
对于 DO 是非阻塞的并且建议使用 T32_GetPractice
进行轮询,但不清楚如何将其转换为 t32rem
.
我觉得你的问题比较好。
首先是无赖:t32rem 不适合等待脚本的执行。事实上,t32rem 在使用 T32_Stop() 执行命令之前会取消任何 运行 脚本。 (您可以在 "C:\T32\demo\api\capi\test\t32rem.c" 的 TRACE32 安装中找到 t32rem 的源代码)
所以您建议使用 t32rem localhost wait STATE.RUN()
肯定行不通,因为它会取消 运行 脚本。此外 STATE.RUN()
returns 被调试 CPU 而不是 PRACTICE 解释器的 运行 状态。
所以实际上你必须使用 T32_GetPractice() 来等待 PRACTICE 脚本终止。要使用 T32_GetPractice(),您必须静态地 link 或动态地 "API for Remote Control and JTAG Access in C" 到启动脚本的应用程序。
对于动态 linking(例如从 Python 脚本)加载 "C:\T32\demo\api\capi\dll\t32api.dll"。 (根据您的主机操作系统,您可能需要 t32api64.dll、t32api.so 或 t32api64.so。)
对于静态 linking(例如,从用 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)
如果编译成功并且 link 没问题,您将获得一个应用程序 t32do.exe。
在表格中使用它:t32do <host> [port=<n>] <practice script>
我上面的示例代码是根据 Creative Commons Zero 1.0 获得许可的。在您想要的任何代码中以您希望的任何方式使用它。