Как ждать завершения сценария t32rem DO?
Кажется, что делает t32rem localhost DO script.cmm
не блокирует Как я могу заблокировать в сценарии оболочки, пока не закончится сценарий cmm?
Вот сокращенный пример:
$ 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
,
1 ответ
На мой взгляд, ваши вопросы довольно хорошие.
Сначала облом: t32rem не подходит для ожидания выполнения скрипта. Фактически t32rem отменяет любой запущенный скрипт перед выполнением команды с помощью T32_Stop(). (Вы можете найти исходный код t32rem в вашей установке TRACE32 по адресу "C:\T32\demo\api\capi\test\t32rem.c")
Так что ваше предложение использовать t32rem localhost wait STATE.RUN()
определенно не будет работать, потому что это отменит запущенный скрипт. более того STATE.RUN()
возвращает рабочее состояние отлаженного ЦП, а не интерпретатора ПРАКТИКИ.
Поэтому на самом деле вы должны использовать T32_GetPractice(), чтобы дождаться завершения сценария PRACTICE. Чтобы использовать T32_GetPractice(), вы должны либо статически, либо динамически связать "API для удаленного управления и доступа JTAG в C" к приложению, которое запускает ваш скрипт.
Для динамической компоновки (например, из скрипта 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;
}
Поместите исходный код в файл с именем t32do.c в "C:\T32\demo\api\capi\src" и создайте приложение со следующим make-файлом, который работает как в Windows (с использованием компилятора MinGW из Cygwin), так и в 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. Используйте его так, как вы хотите, в любом коде, который вы хотите.