[i] Применение SEGGER Real Time Transfer (RTT) в микроконтроллерах серий К1986ВЕ1x и К1986ВЕ9x
В статье Printf через ITM рассматривалась возможность вывода информации (в том числе отладочной) с помощью отладчика по интерфейсу ITM. Однако, такой подход применим только для МК с ядром Cortex-M3 и выше. Для микросхем семейства К1986ВЕ1x, ядро которых функционально аналогично Cortex-M1, данная возможность не применима.
В статье Printf через UART рассмотрена возможность вывода информации через аппаратный блок UART и без использования отладчика, но данный способ задействует аппаратные ресурсы микросхемы, которые могли бы использоваться для задач вне отладки.
В качестве более быстрого и универсального, а также менее затрагивающего аппаратные ресурсы микросхем решения можно рассмотреть технологию Real Time Transfer (RTT), которая изначально была разработана SEGGER для JTAG-адаптеров J-Link.
1. Сводная информация
Метод Real Time Transfer, несмотря на то, что разработан для отладчиков J-Link, не привязан к конкретному JTAG-программатору, но предоставляемое компанией SEGGER программное обеспечение для ПК предназначено только для J-Link. Со стороны микроконтроллера требуется поддерживать фоновый доступ к памяти ("background memory access") - то есть это любые микроконтроллеры с ядром ARM Cortex-M или функционально аналогичным.
Программное обеспечение на ПК передает JTAG-отладчику команду записать или считать из ОЗУ микроконтроллера специальную структуру "SEGGER RTT Control Block", которая отвечает за "чтение" и "запись" информации из/в микроконтроллер. При конфигурации подключения RTT необходимо указать или непосредственно адрес на структуру, или адресный диапазон ОЗУ, в котором она находится. Конкретный адрес переменной_SEGGER_RTT можно найти в .map-файле после сборки проекта.
На стороне ПК программное обеспечение для обмена данными предоставляется SEGGER (JLinkRTTClient, JLinkRTTLogger, JLinkRTTViewer - они работают с J-Link).
На стороне микроконтроллера весь функционал реализуется проприетарной программной библиотекой RTT.
Библиотека RTT и ПО от SEGGER содержатся в составе "J-Link Software and Documentation Pack". Если устанавливаемое инсталлятором ПО (а для Windows и MacOS есть только инсталляторы) не требуется и нужна только библиотека RTT, можно скачать архив для любой операционной системы (на данный момент архивы есть только для Linux). Внутри архива или после установки инсталлятора библиотека RTT с примерами доступна в папке Samples\RTT\.
2. Пример запуска RTT на микроконтроллерах семейства К1986ВЕ9x
Для базового запуска достаточно скопировать в новый проект файлы SEGGER_RTT.c, SEGGER_RTT.h, SEGGER_RTT_printf.c и SEGGER_RTT_Conf.h. Конфигурационный файл SEGGER_RTT_Conf.h содержит ряд настроек, которые в рамках базового запуска можно не изменять.
В конце статьи приведен проект для микроконтроллера К1986ВЕ92QI в среде Keil uVision 5, где используется пример "Эхо ("Main_RTT_InputEchoApp.c"). В примере запуск осуществляется на микроконтроллере К1986ВЕ92QI, но может быть запущен полностью аналогично на любом микроконтроллере семейства К1986ВЕ9x.
Структура SEGGER_RTT_CB _SEGGER_RTT, на которую нужно указать адрес в ПО для ПК, расположена в адресной области ОЗУ SRAM (с адреса 0x2000_0000) - а именно (в рамках приложенного к статье проекта) по адресу 0x2000_0008. При использовании ПО от SEGGER (на примере J-Link RTT Viewer) адрес указывается при конфигурации соединения (File -> Connect) - см. рис. 1.
Рисунок 1 - Подключение к микроконтроллеру в J-Link RTT Viewer, указание адреса структуры в памяти микроконтроллера
После подключения к микросхеме отладчиком и установки соединения отправляемые в J-Link RTT Veiwer данные транслируются обратно (рисунок 2).
Рисунок 2 - Работа примера "Main_RTT_InputEchoApp" в J-Link RTT Viewer
3. Особенности запуска RTT на микросхемах семейства К1986ВЕ1x
Для микросхем семейства К1986ВЕ1x есть следующие особенности относительно запуска на микросхемах семейства К1986ВЕ9x:
1) В микросхеме помимо AHB-Lite SRAM (с адреса 0x2010_0000) реализовано DTCM SRAM (c адреса 0x2000_0000), где по умолчанию располагаются данные, в том числе структура SEGGER_RTT_CB _SEGGER_RTT. Однако для корректной работы RTT структуру SEGGER_RTT_CB _SEGGER_RTT нужно расположить во внутреннюю AHB-Lite SRAM.
Для этого в проекте в среде Keil нужно подключить scatter-файл c областью "EXECUTABLE_MEMORY_SECTION", как описано в статье "[i] Расположение функций в ОЗУ в IDE Keil". Далее в начале файла "SEGGER_RTT_Conf.h" добавить строку:
#define SEGGER_RTT_SECTION "EXECUTABLE_MEMORY_SECTION"
В результате структура SEGGER_RTT_CB _SEGGER_RTT будет расположена в области AHB-Lite SRAM и обмен через RTT будет осуществляться.
2) В связи с особенностями ядра и реализации задержки доступа к Flash-памяти корректная работа RTT возможна только при нулевой задержке (MDR_EEPROM->CMD.Delay = 0) - по сбросу при этом выставлена ненулевая задержка (Delay=0x04) и ее нужно будет сбросить в 0. Это накладывает ограничение на частоту микроконтроллера при использовании RTT - до 25 МГц.
3) При подключении нужно выбирать Unspecified Cortex-M1.
4) Как и для микросхем К1986ВЕ9x, для микросхем К1986ВЕ1x нужно указать или конкретный адрес структуры _SEGGER_RTT, или диапазон, в котором она находится. Для приложенного проекта адрес структуры 0x2010_0000, но в общем случае конкретный адрес структуры _SEGGER_RTT нужно смотреть в файле .map после сборки проекта.
В конце статьи приложены проекты:
- K1986VE1xI_RTT - для микросхем MDR32F1QI (К1986ВЕ1QI), так и MDR1213FI (К1986ВЕ1FI) и MDR1213GI (К1986ВЕ1GI).
- K1986VE1T_RTT - для микросхем К1986ВЕ1Т, К1986ВЕ1АТ.
Дополнительные пояснения приведены в файле main.c проектов.
4. Особенности запуска RTT J-Scope
J-scope - еще одна утилита от SEGGER, использующая функционал RTT. Она позволяет рисовать графики изменения переменных (которые записываются в структуру RTT) в реальном времени за счет постоянного чтения памяти отладчиком. Поскольку официально микроконтроллеры компании "Миландр" со стороны SEGGER не поддерживаются, для работы с J-Scope есть особенности (приведены ниже) для микросхем семейства К1986ВЕ9x. Для микросхем семейства К1986ВЕ1x работоспособности на данный момент добиться не удалось.
Поскольку используется Unspecified Cortex-M3, требуется явно прописать адреса микроконтроллера, по которым ПО будет искать структуру RTT. Это можно сделать через командную строку, используя специальный ключ. Для старых версий подобный ключ может отсутствовать, поэтому рекомендуется использовать актуальную версию (работа проверялась на J-Scope V9.48).
.\JScope.exe -RTTSearchRanges "0x20000000 0x8000"
После запуска SEGGER J-Scope нужно перейти в File -> New Project, выбрать контроллер Unspecified - Cortex-M3 и режим семплирования RTT (synchronus) (рисунок 3).
Рисунок 3 - Подключение к микроконтроллеру К1986ВЕ92 в SEGGER J-Scope
Запускаемый на микроконтроллере проект K1986VE92_JLINK_RTT_JSCOPE (должен быть записан в микроконтроллер перед работой с J-Scope) повторяет пример J-Scope_RTT_Example с сайта UM08028 J-Scope.
В процессе подключения ПО будет считывать отладчиком память ОЗУ (но только в том случае, если были указаны адреса при запуске через командную строку) и после нахождения структуры RTT CB будут выводиться графики, как на рисунке 4.
Рисунок 4 - Работа проекта K1986VE92_JLINK_RTT_JSCOPE в SEGGER J-Scope
Сохранить статью в PDF