Интерфейс OpenOCD Tcl

Я программирую приложение на C #, которое будет использоваться для программирования и тестирования микроконтроллеров STM32 во время производства. Я хотел бы запрограммировать и проверить микросхему, затем записать некоторую конфигурацию во флеш-память и, наконец, установить защиту от чтения. В качестве бэкэнда я решил использовать OpenOCD и его интерфейс Tcl, работающий на порту 6666.

Проблема: я могу выполнять команды и получать их результаты, но я не знаю, как проверить, была ли команда выполнена успешно или нет. Например. команда reset возвращает пустую строку, независимо от того, подключена ли цель или нет ... Некоторые другие команды, такие как mdw, возвращают данные или строку ошибки, но я ищу общий способ проверить, выполнена ли команда или нет.

Спасибо за ваши идеи.


person klasyc    schedule 13.01.2021    source источник


Ответы (1)


Предполагая, что в вашем Tcl-коде есть что-то вроде sendBack [eval $script], вы бы изменили его так:

set code [catch {eval $script} result]
sendBack [list $code $result]

или даже это:

set code [catch {eval $script} result options]
sendBack [list $code $result $options]

Вам нужно будет распаковать этот список с другой стороны. Первый элемент - это код результата (0 для успеха, 1 для ошибки, несколько других теоретически, но вы, вероятно, их не увидите), второй - это значение результата или сообщение об ошибке, а третий (если вы используете второй фрагмент кода) - это словарь параметров, который может содержать различные вещи, полезные для отладки (включая структурированные коды ошибок, трассировку стека и т. д.)


Передача полного кортежа результата - это способ переноса всего результата из одного контекста в другой. Ряд инструментов удаленной отладки для Tcl используют почти такой же прием.

person Donal Fellows    schedule 13.01.2021
comment
Собственно команда catch именно та, которую я искал. Спасибо! - person klasyc; 14.01.2021
comment
Наконец, я получил эту оболочку команды: list [catch {capture "$script"} result] $result, которая создает список из двух элементов, где первый элемент - это код возврата, а второй элемент - фактический вывод команды. - person klasyc; 14.01.2021