VisualDSP: что такое BTC? Печать
Добавил(а) microsin   

Аббревиатура BTC означает Background Telemetry Channel (фоновый канал телеметрии). Он позволяет обмениваться данными между процессором и хостом (компьютером, на котором осуществляется отладка через JTAG-отладчик) во время работы процессора. Без BTC процессор должен быть остановлен, чтобы можно было передать данные. Т. е. без BTC есть только один способ просмотреть изменения данных - с помощью точек останова, останавливая процессор в каждой нужной точке программы. С использованием BTC данные можно постоянно обновлять, не останавливая программу. В частности это полезно, когда рассматривают большое количество наборов данных на графиках, как например диаграммы анализа спектра при быстром преобразовании Фурье (Fast Fourier Transform, FFT).

Следует также заметить, что передача данных с использованием BTC почти не мешает работающей на процессоре программе, и стоит совсем немного процессорного времени (от 70 до 200 циклов, в зависимости от операции).

Прим. переводчика: для подобных целей можно конечно использовать отладочный вывод через UART [3] или другой подобный последовательный канал связи. Однако подобный отладочный вывод иногда чреват значительными издержками на программную обработку, и требует некоторых дополнительных усилий при программировании.

Как использовать BTC? Это довольно несложно. Каналы телеметрии настраиваются на базе исполняемой программы процессора (.DXE). Сначала нужно подключить 3 файла в проект. Во-первых, понадобятся некоторые заголовочные файлы – btc.h и btc_struct.h. Затем Вам нужно подключить библиотеки BTC для Вашего используемого процессора. Например, если процессор ADSP-BF533, то это библиотечный файл libbtc532.dlb. После того, как эти 3 файла подключены в проект, Вы можете настроить BTC в коде своей программы. Вышеуказанные файлы можно найти в каталоге установки VisualDSP++ (для процессора Blackfin это может быть каталог наподобие c:\Program Files (x86)\VisualDSP 5.0\Blackfin\include\ для файлов заголовка и c:\Program Files (x86)\Analog Devices\VisualDSP 5.0\Blackfin\lib\ для файла libbtc532.dlb).

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

BTC_MAP_BEGIN
//            Имя канала    Начальный адрес   Длина
BTC_MAP_ENTRY("Channel #1", (long)&channel1,  sizeof(channel1))
BTC_MAP_ENTRY("Channel #2", (long)&channel2,  sizeof(channel2))
BTC_MAP_END

Макрос BTC_MAP_BEGIN задает начало карты каналов BTC, макрос BTC_MAP_END задает окончание. Строка комментария добавлена только для пояснения. Имена каналов можно задать любые (однако есть ограничение по длине строки имени, см. таблицу 2-17), также можно использовать любой начальный адрес. В качестве начального адреса указывается обычно просто имя переменной, которую Вы хотите представить в канале.

Таблица 2-17. Параметры для макроса BTC_MAP_ENTRY.

Параметр
Описание
Имя канала Текстовое имя для канала (до 32 символов максимум).
Начальный адрес Стартовый адрес для переменной в памяти.
Длина Длина данных канала, для процессоров ADSP-2126x выраженная в количестве 32-битных слов.

После настройки каналов пока еще нельзя использовать BTC. В начале программы нужно еще вызвать функцию btc_init(), чтобы инициализировать BTC. Это надо сделать только один раз. Вам также нужно добавить в главный цикл программы вызовы функции btc_poll(). Эта функция проверяет значения в каналах BTC и обновляет из, позволяя хосту получить доступ к новым значениям. Если эту функцию не вставить в какое-нибудь место программы, где она будет регулярно вызываться (желательно вызывать её примерно раз в полсекунды или чаще, если Вам это необходимо), то окно BTC пройдет таймаут и не сможет получить доступ к обновленным значениям BTC. Иногда функцию btc_poll() помещают куда-нибудь в постоянно повторяющийся цикл. Другое хорошее место для этой функции - обработчик прерывания. Место размещения функции и частота её вызова определит, какой будет задан приоритет обновления каналов BTC.

#include "btc.h"
 
.section/DM seg_dmda; // для процессоров ADSP-2126x
 
BTC_MAP_BEGIN
   BTC_MAP_ENTRY ('Channel0', 0xf0001000, 0x00100)
   BTC_MAP_ENTRY ('Channel1', 0xf0002000, 0x01000)
   BTC_MAP_ENTRY ('Channel2', 0xf0003000, 0x10000)
BTC_MAP_END

После того, как определения каналов добавлены, нужно проинициализировать BTC вызовом функции _btc_init в коде первоначальной настройки приложения (start-up code).

После инициализации команды BTC от хоста обрабатываются через низкоприоритетное прерывание эмулятора (emulator interrupt, EMULI). Должен быть установлен обработчик прерывания (ISR) на этот вектор. На языке ассемблера вектор может быть установлен переходом (jump) на инструкцию _btc_isr, размещенным по адресу вектора прерывания EMULI:

JUMP _btc_isr;

После того, как обработчик прерывания установлен, прерывание должно быть также разрешено следующим кодом:

// настройка imask
ustat1 = imask;
BIT SET ustat1 EMULI;
imask = ustat1;
 
// разрешение прерываний
ustat1 = mode1;
BIT SET ustat1 IRPTEN;
mode1 = ustat1;

На языке C/C++ вектор можно установить функцией прерывания:

interrupt (SIG_EMUL, btc_isr);

На C/C++ функция прерывания разрешает для Вас это прерывание. После добавления кода для инициализации BTC и разрешения прерывания BTC, нужно пристыковать к проекту библиотеку BTC library (libbtc26x.dlb для приложений на ассемблере или libcbtc26x.dlb для приложений C/C++). Эта библиотека содержит функцию инициализации, обработчик прерывания и другие функции, которые позволяют передавать данные через BTC.

Приоритет BTC. На процессорах ADSP-2126x и ADSP-BFBF36x SHARC передачи данных BTC обрабатываются низкоприоритетным прерыванием эмуляции (EMULI). Поскольку приоритет этого прерывания фиксирован, то приоритет обработки BTC также фиксирован.

Приоритет BTC может повлиять на время ответа на запросы хоста для получения данных - хост ждет некоторое время, пока процессор ответит. Как только процессор начал обрабатывать запрос, другие прерывания все еще могут быть обработаны процессором. На производительность BTC может повлиять частота системных прерываний.

Окно данных памяти BTC (BTC Memory Window). BTC Memory window позволяет Вам просмотреть содержимое каналов телеметрии в реальном времени. Окно отображает содержимое памяти по адресу, который Вас интересует. Можно поменять окно просмотра в соответствии с Вашими нуждами.

Открыть окно данных BTC можно через меню View -> Debug Windows -> BTC Memory. На рис. 2-51 показано содержимое только одного определенного канала (например Channel1).

BTC view one channel

Рис. 2-51. Пример просмотра данных одного канала.

На рис. 2-52 показан список определенных сейчас каналов и содержимое выбранного канала.

BTC channel list and view selected channel

Рис. 2-52. Текущие настроенные каналы и содержимое выбранного канала.

В таблице 2-18 показаны команды контекстного меню (доступного по правому клику мыши) окна памяти BTC.

Таблица 2-18. BTC Memory Window Right-Click Menu.

Команда
Назначение
Go To Открыть окно диалога Go To, в котором Вы указываете адрес. Указанный адрес появится в левом верхнем углу дисплея. Адрес должен находиться в пределах диапазона, заданного для текущего отображаемого канала.

Подсказка: окно Go To также можно открыть двойным кликом курсора мыши в столбце адреса окна памяти данных BTC.
Show Map
или
Hide Map
Показывает или прячет более информативное отображение карты текущих определений каналов. Show Map отобразит список каналов. Двойной клик на канале покажет его содержимое в нижней части окна. Hide Map уберет список каналов. Выбранный канал останется для отображения.
Lock Columns Блокирует или освобождает количество колонок, отображаемых в окне просмотра.
Select Format Задает, как будут показаны данные в окне. Можно выбрать двойные слова (32 бита), слова (16 бит) или байты (8 бит).
Refresh Rate Задает скорость обновления данных, что применимо, если разрешено автообновление (Auto Refresh). Данные в окне отображения будут обновляться с заданным интервалом.
Auto Refresh Разрешает окну обновлять данные самостоятельно с указанным интервалом времени (автообновление). Скорость обновления задается через Refresh Rate. Автообновление работает только если процессор работает (не остановлен).
Channel Timeout Задает время ожидания для любого отдельного ответа от BTC. Если время таймаута истекло, то текущая транзакция заканчивается.

Каналы будут доступны в окне BTC debug (наподобие окна графика plot window). Для этого окна можно изменить скорость обновления значений, а также разные опции настройки отображения. Можно также привязать доступ окна графика (plot window) к каналу BTC, чтобы график постоянно обновлялся. См. руководство пользователя VisualDSP++ [2], и примеры, которые поставляются вместе с VisualDSP++, чтобы узнать больше подробностей по использованию этих функций. Также можно посмотреть презентацию PowerPoint [].

Теперь Ваши каналы BTC работают. Вы можете поместить значения как обычные переменные в каналы BTC, и затем запустить btc_poll(), чтобы они обновились и были готовы для доступа со стороны хоста.

BTC можно использовать с несколькими разными процессорами. В этом руководстве рассматривался процессор ADSP-BF533, но новые процессоры SHARC и процессоры Blackfin также поддерживают BTC. Большинство новых эмуляторов (отладчиков JTAG) поддерживают BTC, данные в хост передаются по обычному кабелю USB. Старые эмуляторы могут не поддерживать BTC. Свяжитесь с Analog Devices, чтобы узнать, поддерживает ли BTC Ваш эмулятор и/или процессор.

[Ссылки]

1. Introduction to VisualDSP++ BTC (Background Telemetry Channel) site:people.ucalgary.ca.
2. VisualDSP++ 5.0 User’s Guide site:analog.com.
3. Blackfin: форматированный вывод в окно терминала через UART.