Как ждать завершения сценария t32rem DO? - PullRequest
0 голосов
/ 15 февраля 2019

Кажется, что 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 Ответ

0 голосов
/ 18 февраля 2019

На мой взгляд, ваши вопросы довольно хороши.

Сначала облом: t32rem не подходит для ожидания выполнения скрипта.Фактически t32rem отменяет любой запущенный скрипт перед выполнением команды с помощью T32_Stop ().(Вы можете найти исходный код t32rem в вашей установке TRACE32 по адресу "C: \ T32 \ demo \ api \ capi \ test \ t32rem.c")

Так что ваше предложение использовать t32rem localhost wait STATE.RUN() точно не будетработать, потому что это отменит запущенный скрипт.Более того, STATE.RUN() возвращает рабочее состояние отлаженного ЦП, а не интерпретатора PRACTICE.

Таким образом, фактически вы должны использовать 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 .Используйте его как хотите, в любом коде.

...