В данной статье рассмотрена установка и настройка среды Eclipse для работы с МК MDR1206FI, MDR1206AFI построенных на базе процессорного RISC-V ядра BM-310S0.
Основное отличие между микросхемами MDR1206FI и MDR1206AFI заключается в контроллере FLASH-памяти и требует использования разных алгоритмов для работы с FLASH. Микросхемы MDR1206FI и MDR1206AFI могут быть различены программно с помощью поля по полю CHIP_ID в регистре FLASH_CNTRL->CHIP_ID_CTRL - значение 215 соответствует MDR1206AFI, значение 217 соответствует MDR1206FI.
Исходные файлы проектов ("MDR32VF0xI_Template"/"MDR1206_Template"/"MDR1206FI_Template"/"MDR1206AFI_Template", "MDR32VF0xI_Led") доступны
в конце статьи в разделе "Документация" и
в составе Standard Peripherals Library на официальном сайте.
Статья содержит информацию о:
1)
Установке IDE Eclipse и подготовке к работе с МК MDR1206(A)FI.
2)
Подготовке отладчика для работы с OpenOCD.
3)
Создании и настройке проекта.
4)
Сборке проекта.
5)
Создании и настройке конфигурации отладки.
6)
Программировании загрузочной программы в микроконтроллер.
7)
Дополнительных возможностях для работы с памятью при разработке ПО.
Вводные сведения о библиотеке MDR32VF0xI и организации проектов
Микросхемы MDR1206FI, MDR1206AFI являются усовершенствованной версией К1986ВК025 (MDR32F02) с некоторыми отличиями. Поскольку МК MDR1206(A)FI функционально близки к К1986ВК025, программная поддержка уровня CMSIS и SPL для микроконтроллеров К1986ВК025 (MDR32F02), MDR1206FI и MDR1206AFI реализована в общей библиотеке - MDR32VF0xI. Поэтому информация из данной статьи по большей части также применима для К1986ВК025 (MDR32F02).
В свою очередь проекты (в том числе шаблонов) для микроконтроллеров реализованы как один общий для всех, так и раздельные индивидуально под МК. Помимо этого, для микроконтроллеров MDR1206FI и MDR1206AFI реализованы общие проекты MDR1206, поскольку функциональные отличия минимальны.
Для выбора конкретного МК необходимо выбрать соответствующий макрос USE_MDR... в файле MDR32VF0xI_config.h на уровне SPL или, если уровень SPL не используется и используется только уровень CMSIS, в файле system_MDR32VF0xI_config.h на уровне поддержки устройства (DeviceSupport) в CMSIS. После выбора конкретного МК с помощью макроса при сборке проекта необходимо также выбрать соответствующую микроконтроллеру конфигурацию сборки.
Примеры проектов с общим для микроконтроллеров MDR32F02, MDR1206FI, MDR1206AFI функционалом реализованы в общем для всех примере. Например, проект MDR32VF0xI_Led является общим для всех этих МК.
1. Установка и подготовка к работе IDE Eclipse
Среда разработки Eclipse, а также дополнительный набор программных компонентов, могут быть скачаны в уже установленном виде, а потому требуют только распаковки, права администратора при этом не требуются. Все скачанные программы могут быть распакованы в любую удобную директорию на ПК.
Скачать IDE Eclipse (Eclipse IDE for Embedded C/C++ Developers) можно по следующей ссылке:
https://projects.eclipse.org/projects/iot.embed-cdt/downloads.
Помимо самой среды Eclipse также понадобятся следующие программные средства:
1. GNU RISC-V Embedded GCC – набор программ (компилятор, ассемблер, компоновщик, библиотеки, отладчик GDB), которые необходимы для разработки ПО на устройствах с ядром RISC-V.
GNU RISC-V Embedded GCC доступен для скачивания по ссылке:
https://github.com/xpack-dev-tools/riscv-none-elf-gcc-xpack/releases. Т.к. пакет xPack собирается разработчиками для нескольких платформ, скачивать нужно архив для целевой ОС.
2. Windows Build Tools – набор программ (make, rm), которые необходимы для сборки и очистки проекта в среде Eclipse.
Windows Build Tools доступен для скачивания по ссылке:
https://xpack.github.io/dev-tools/windows-build-tools/install/. Для скачивания Windows Build Tools в виде архива необходимо на странице для скачивания перейти в раздел "Manual install", затем после перехода на GitHub открыть
страницу "Releases".
3. OpenOCD - ПО для программирования и отладки устройств. OpenOCD для Windows, собранный с поддержкой МК MDR1206FI и MDR1206AFI, доступен для скачивания в конце статьи, раздел "Программное обеспечение",
или на официальном сайте компании Миландр.
Для работы среды разработки Eclipse также требуется JRE (Java Runtime Environment) - комплекс ПО, необходимый для запуска Java-приложений. Поэтому, если запуск Eclipse не выполняется, то необходимо скачать и установить JRE. Скачать JRE можно с официального сайта: https://www.oracle.com/java/technologies/javase-jre8-downloads.html.
После выбора требуемой версии JRE необходимо войти в учётную запись Oracle, после чего скачать ПО.
При первом запуске среды Eclipse, исполняемый файл которой расположен в архиве "eclipse/eclipse.exe", необходимо выбрать директорию, в которой будет создан workspace, рисунок 1, после чего нажать кнопку "Launch".
Рисунок 1 – Выбор директории в качестве workspace
Для подключения программных средств для работы с МК MDR1206FI, MDR1206AFI в среде Eclipse необходимо указать соответствующие пути. Для этого необходимо открыть окно "Window->Preferences" и перейти во вкладку "MCU".
Во вкладке "MCU->Global Build Tools Path" необходимо прописать путь к папке bin Build Tools (xPack Windows Build Tools), рисунок 2.
Рисунок 2 – Указание пути к Windows Build Tools
Во вкладке "MCU->Global OpenOCD Path" необходимо прописать путь к папке OpenOCD (xPack OpenOCD), рисунок 3. Данный путь используется в отладочных конфигурациях.
Рисунок 3 – Указание пути к OpenOCD
Во вкладке "MCU->Global RISC-V Toolchains Paths", необходимо выбрать toolchain по умолчанию "xPack GNU RISC-V Embedded GCC (riscv-none-elf-gcc)" и прописать путь к папке bin GNU RISC-V (xPack GNU RISC-V Embedded GCC), рисунок 4.
Рисунок 4 – Указание пути к GNU RISC-V Embedded GCC
После указания всех путей необходимо нажать кнопку "Apply and Close".
На этом подготовка среды Eclipse завершена.
2. Подготовка отладчика для работы с OpenOCD
МК MDR1206FI, MDR1206AFI поддерживают отладку только через интерфейс JTAG. Для отладки МК MDR1206FI, MDR1206AFI на отладочной плате установлена микросхема FT2232HL компании FTDI, имеющая два независимых интерфейса. Интерфейс 0 позволяет выполнять отладку МК по интерфейсу JTAG. Интерфейс 1 позволяет выполнять обмен данными с МК по интерфейсу UART1 на выводах PB[1], PB[0]. Подключение микросхемы к ПК выполняется с помощью кабеля USB A-B, разъём USB на отладочной плате.
На отладочной плате также предусмотрено подключение внешнего отладчика через разъём JTAG. В качестве внешнего отладчика можно использовать J-Link. Выбор используемого отладчика задаётся с помощью перемычек на разъёме JTAG to USB:
- перемычки установлены - используется встроенный отладчик, реализованный на базе микросхемы FT2232HL;
- перемычки сняты – используется внешний отладчик.
Не допускается подключение внешнего отладчика к отладочной плате при установленных перемычках на разъёме JTAG to USB.
Для корректной работы отладчика с OpenOCD в Windows необходимо переустановить стандартные драйвера отладчика на WinUSB. Это можно сделать с помощью программы Zadig, подробнее об этом написано на сайте:
https://xpack.github.io/openocd/install/, пункты "Drivers" и "Zadig".
Следует обратить внимание, что переустановка драйверов для внешнего отладчика делает его совместимым с OpenOCD, но при этом другие ПО (например, Keil, IAR, утилиты J-Link), использующие оригинальные драйвера, не смогут работать с отладчиком на данном ПК. Чтобы вернуть драйвера отладчика на ПК в исходное состояние, необходимо удалить драйвер Zadig и переустановить драйвер производителя.
Поэтому, чтобы не переустанавливать оригинальные драйвера для внешнего отладчика, рекомендуется использовать встроенный отладчик, установленный на отладочной плате.
Для встроенного отладчика также требуется переустановить драйвера. Для этого необходимо скачать программу Zadig с сайта:
https://zadig.akeo.ie/, после чего запустить её с правами администратора. Далее следует включить питание на отладочной плате и подключить с помощью кабеля USB A-B отладочную плату к ПК. В программе Zadig в меню "Options" требуется выбрать пункт "List All Devices" - это позволит отобразить все устройства USB, подключенные к ПК. Как показано на рисунке 5, в списке устройств необходимо выбрать "Dual RS232-HS (Interface 0)", выбрать драйвер "WinUSB (v6.1.7600.16385)" (выбран по умолчанию), и нажать кнопку "Replace Driver". Через некоторое время программа выведет окно о завершении установки драйвера.
Рисунок 5 – Переустановка драйвера для "Dual RS232-HS (Interface 0)" в Zadig
Драйвер устройства "Dual RS232-HS (Interface 1)" переустанавливать не нужно, так как это устройство используется для обмена данными с МК по интерфейсу UART.
Переустановка драйвера завершена, программу Zadig можно закрыть.
3. Создание и настройка проекта в IDE Eclipse
Для быстрого старта можно использовать один из шаблонов проектов "MDR32VF0xI_Template"/"MDR1206_Template"/"MDR1206FI_Template"/"MDR1206AFI_Template", в которых уже помимо готовых настроек проектов подключена библиотека SPL. Или же можно взять пример "MDR32VF0xI_Led", где помимо этого реализовано мигание светодиода на отладочной плате. Проекты можно взять из материалов к статье или из Standard Peripherals Library на официальном сайте. Далее по статье для примеры используются проекты "MDR32VF0xI_Template" и "MDR32VF0xI_Led".
Чтобы добавить проект в Workspace, необходимо выполнить процедуру импорта проекта. Для этого требуется выбрать "File->Import". В открывшемся окне выбрать "General->Existing Projects into Workspace" и нажать "Next >", как показано на рисунке 6.
Рисунок 6 – Импорт "Existing Projects into Workspace"
В пункте "Select root directory" необходимо указать папку с проектом "MDR32VF0xI_Template" или "MDR32VF0xI_Led". В поле "Projects" установить галочку напротив выбранного проекта, а также установить пункт "Copy projects into workspace", чтобы проект был скопирован в workspace, рисунок 7. Далее следует нажать "Finish". При появлении окна "Overwrite '.settings' in folder ..." - нажать "Not To All".
Рисунок 7 – Импорт – выбор ранее созданного проекта
Чтобы отобразилось основное окно проекта, необходимо закрыть стартовое окно "Welcome". Слева в поле "Project Explorer" должен отобразиться добавленный проект, рисунок 8.
Рисунок 8 – Отображение проекта "MDR32VF0xI_Led" в "Project Explorer"
Добавленный проект можно переименовать. Для это следует нажать ПКМ на имя проекта и выбрать пункт "Rename" (или нажать F2). После переименования следует изменить папку ресурсов. Для этого необходимо перейти в свойства проекта (ПКМ на имя проекта -> Properties или нажать "Alt+Enter"). В открывшемся окне необходимо перейти в "C/C++ Build -> Refresh Policy" и удалить папку со старым названием проекта, как показано на рисунке 9. Следует учитывать, что переименование проекта вызовет необходимость изменения предварительно сохраненных конфигураций отладки (см. Использование предварительно сохраненных файлов отладочных конфигураций).
Рисунок 9 – Удаление папки со старым названием проекта
Теперь необходимо нажать "Add Resourse…" и выбрать папку с новым названием проекта, рисунок 10. Далее следует нажать "ОК" и "Apply and Close".
Рисунок 10 – Добавление папки с новым названием проекта
Добавление проекта в IDE Eclipse завершено.
3.1 Дополнительные особенности настройки проектов - включение расширений ядра для компилятора
Примечание: В рамках предоставляемых проектов все необходимые настройки, включая настройку расширений, уже сделаны и дополнительно производить настройку не требуется.
Начиная с версии 2.1 системы команд RV32I инструкции FENCE.I и CSR-инструкции вынесены в отдельные расширения - Zifencei и Zicsr соответственно. В то же время ядро BM-310S0 реализует систему команд RV32I версии 2.0, когда данные инструкции являлись частью базовой системы команд. В связи с этим в настройках GNU RISC-V Embedded GCC проекта необходимо указать использование расширений Zicsr и Zifencei. Помимо этого, согласно п.11 "Система команд" спецификации, поддерживаются расширения команд для битовых манипуляций и для скалярной криптографии.
Настройка расширений осуществляется в настройках проекта (ПКМ по названию проект в Workspace -> Properties -> C/C++ Build -> Settings -> Tool Settings -> Target Processor), в поле "Other extensions" нужна записать "_zicsr_zifencei_zba_zbb_zbc_zbs_zbkb_zbkc_zbkx_zknd_zkne_zknh_zksed_zksh" (рисунок 11).
Рисунок 11 – Настройка использования расширений Zicsr и Zifencei
Инструкции работы с CSR-регистрами используются на уровне CMSIS. Без указания использования расширений Zifencei и Zicsr сборка проекта будет завершаться, например, с ошибками вида "Error: unrecognized opcode `csrr s10,mhartid'" и аналогичными ошибками.
4. Сборка проектов
Компиляция проекта под выбранную конфигурацию в GUI осуществляется с помощью кнопки в виде молотка на панели инструментов (выделен зеленым на рисунке 12). Нажав на стрелку рядом, можно выбрать конфигурацию сборки. Значок документа (выделен синим) компилирует активные конфигурации в каждом открытом проекте (Сtrl+B).
Рисунок 12 – Кнопки для сборки проекта
По умолчанию в проектах реализован набор разных видов сборки, которые отличаются настройками конфигурационного файла компоновщика (link_*.ld):
- "FLASH" - код расположен во Flash-памяти, данные - в ОЗУ на системной шине TCM;
- "RAM_TCM_Debug/_Release" - код и данные расположены в ОЗУ на системной шине TCM.
Отличия между Debug/Release конфигурациями для сборки под области RAM заключается в том, что для конфигурации Debug код изначально располагается сразу в ОЗУ (в связи с этим существует особенность с отладкой в части опции "Debug in RAM", описанная далее) и его загрузка в память возможна только отладчиком-программатором (при штатном запуске МК после сброса или подачи питания программа не будет исполняться, т.к. не записана в энергонезависимую память). В то же время в конфигурации Release код изначально располагается в Flash-памяти и копируется в ОЗУ с помощью startup-файла, в связи с чем исполнение загруженного ПО при штатном запуске МК возможно.
Для каждой конфигурации сборки используется свой конфигурационный файл компоновщика link_*.ld. Отличие данных link_*.ld файлов заключается в различном описании регионов памяти (блоки REGION_ALIAS для разных конфигураций). В каждом .ld файле раскомментировано только требуемое описание.
Для частных проектов под конкретный МК неиспользуемые конфигурации сборки убраны - например, из MDR1206_Template удалены конфигурации сборки для MDR32F02 (К1986ВК025), а из MDR32F02_Template убраны конфигурации сборки для MDR1206FI и MDR1206AFI.
Перед запуском сборки под конкретный МК его необходимо выбрать с помощью соответствующего макроса USE_MDR... в файле MDR32VF0xI_config.h на уровне SPL или, если уровень SPL не используется и используется только уровень CMSIS, в файле system_MDR32VF0xI_config.h на уровне поддержки устройства (DeviceSupport) в CMSIS.
5. Создание и настройка конфигурации отладки
5.1. Создание новых конфигураций отладки
Примечание: В приложенных проектах созданы готовые для использования шаблоны файлов конфигурации (см. "Использование предварительно сохраненных файлов отладочных конфигураций"). Приведенные в текущем пункте настройки нужны для создания новых или модификации имеющихся отладочных конфигураций.
После сборки проекта для создания конфигурации отладки необходимо нажать на стрелку у значка "жука" и выбрать пункт "Debug Configurations…", рисунок 13.
Рисунок 13 – Расположение кнопки Debug Configurations
В открывшемся окне слева необходимо выбрать пункт "GDB OpenOCD Debugging" и нажать кнопку "New", как показано на рисунке 14.
Рисунок 14 – Настройки окна Debug Configurations
Во вкладке "Main" необходимо выбрать требуемый проект, при этом также можно изменить название отладочной конфигурации. Для выбора проекта необходимо нажать кнопку "Search Project" и выбрать соответствующий elf-файл (рисунок 15).
Рисунок 15 – Конфигурация отладки во вкладке Main
Во вкладке "Debugger" в поле "Config options" необходимо указать файлы конфигурации отладчика (рисунок 16):
|
MDR1206AFI
|
MDR1206FI
|
On-board FTDI2232HL
|
-f interface/ftdi/mdr-ft2232hl.cfg -f target/MDR1206AFI.cfg
|
-f interface/ftdi/mdr-ft2232hl.cfg -f target/MDR1206FI.cfg
|
J-Link
|
-f interface/jlink.cfg -f target/MDR1206AFI.cfg
|
-f interface/jlink.cfg -f target/MDR1206FI.cfg
|
При использовании данных файлов конфигурации отладчика для повышения скорости обмена между отладчиком и микросхемой при начале отладки в качестве источника системной частоты микросхемы отладчиком настраивается частота HSI без предделителей. По сбросу предварительный делитель активен и, если системная частота не настраивается в ПО, будет видна разница между скоростью работы ПО без отладки и скоростью работы ПО при использовании отладки. Для работы на требуемой частоте, чтобы разница между штатной работой и работой под отладкой не наблюдалась, необходимо настроить частоты в используемой программе микроконтроллера.
В случае необходимости прошивки загрузочной программы при запуске отладки в поле "Config options" можно дополнительно после подключения файла конфигурации прописать команду программирования BOOT загрузочной программой:
-c "program bootloader/bootloader.hex preverify verify"
Данная команда запрограммирует образ типовой загрузочной программы bootloader.hex (описание типовой загрузочной программы приведено в спецификации) в область BOOT.
В поле "Commands" необходимо указать следующие команды:
set mem inaccessible-by-default off
set arch riscv:rv32
set remotetimeout 250
Рисунок 16 – Конфигурация отладки во вкладке Debugger для MDR1206AFI и MDR1206FI
Во вкладке "Startup" необходимо убрать галочку с пункта "Enable Arm semihosting".
ВАЖНО!
Опция "Debug in RAM" указывает отладчику при каждом запуске отладки выполнять загрузку программы, а также принудительно устанавливать начальный адрес программы (функция _start из файла startup). Данную опцию необходимо устанавливать в двух случаях:
- выполняется отладка программы, загруженной в память ОЗУ (конфигурации сборки "RAM_TCM_Debug");
- используется микросхема без загрузочной программы (загрузочная программа не запрограммирована в область BOOT) и выполняется отладка программы, загруженной во Flash-память (конфигурация сборки "FLASH").
Когда галочка убрана с "Debug in RAM", то после загрузки программы отладчик установит точку останова на функцию main() и сбросит МК. МК стартует с загрузочной программы, которая передаёт управление во Flash-память (режим MODE[1:0] = 00 для стандартной загрузочной программы). Когда выполнение программы дойдёт до точки останова в main(), то МК остановится, а в окне отладки появится синяя стрелочка напротив main(), указывающая, что МК остановлен.
Рисунок 17 – Конфигурация отладки во вкладке Startup
Во вкладке "SVD Path" необходимо указать путь к SVD-файлу, описывающему периферию МК, рисунок 18. SVD-файл также расположен локально в приложенных проектах, в папке svd, выбирается в зависимости от микросхемы, MDR1206FI.svd или MDR1206AFI.svd. Если проекты взяты из состава Standard Peripherals Library, данные файлы нужно копировать в проект самостоятельно.
Рисунок 18 – Конфигурация отладки во вкладке SVD Path на примере MDR1206AFI
5.2. Использование предварительно сохраненных файлов отладочных конфигураций
В приложенных проектах файлы отладочных конфигураций под все конфигурации сборок для отладки с помощью FTDI2232HL уже реализованы (рисунок 19). Отладочные конфигурации сохранены в проектах в папке launch_cfg и автоматически добавляются в список отладочных конфигураций в окне "Debug Configurations" после импорта проекта (изменять имя проекта при этом не рекомендуется - иначе руководствоваться примечанием ниже). При необходимости настройки могут быть скорректированы (например, при использовании другого отладчика и образа собранной программы для загрузки) согласно инструкциям, приведенным в пункте выше.
Дополнительно следует отметить, что в отладочных конфигурациях для FLASH-памяти в них прописана команда программирования образа загрузочной программы bootloader.hex из папки bootloader. При каждом запуске отладки с командой программирования образа загрузочной программы осуществляется проверка на наличие загрузочной программы в памяти и программирование ее, если контрольная сумма не совпадает (загрузочная программа не запрограммирована или запрограммирована другая загрузочная программа).
Рисунок 19 – Предварительно созданные отладочные конфигурации
Если проект был переименован, сохраненные отладочные конфигурации не будут работать, т.к. в их структуре содержится информация о названии проекта и собираемого elf-файла. Для того, чтобы они работали с переименованным проектом, необходимо каждый файл отладочной конфигурации .launch открыть как текстовый файл (ПКМ по файлу .launch, в контекстном меню "Open with" -> "Text Editor"), найти все старые названия проекта (Ctrl+F) и заменить на новые. Также рекомендуется изменить названия проектов на новые в названии файлов .launch.
5.3. Запуск отладки
Для запуска отладки необходимо включить питание отладочной платы, подключить кабель USB A-B от платы к ПК, после чего нажать кнопку "Debug" в окне "Debug Configuraions" при выбранной отладочной конфигурации.
Перед включением блока питания в сеть необходимо проверить, что переключатель "Power" находится в положении "Off". Только после включения блока питания в сеть можно включать питание на плате: "Power" -> "On".
На модуле отладочном для микросхем MLDR1206FI (на основе отладочной платы К1986ВК025 ТСКЯ.468998.125) необходимо выбрать один из нескольких способов подачи батарейного питания VCCB. Батарейное питание VCCB может быть подано либо от батарейки, либо с разъёма BUcc Ext, либо от питания VCC. Для подачи батарейного питания от VCCB необходимо установить перемычку между разъёмами Ucc и BUcc.
После запуска отладки на модуле отладочном для микросхем MLDR1206FI (на основе отладочной платы К1986ВК025 ТСКЯ.468998.125) будут мигать светодиоды LED4-LED1, подключенным к выводам PD[3:0] микроконтроллера.
5.3.1. Программное определение микросхем MDR1206FI/MDR1206AFI по полю CHIP_ID регистра FLASH_CNTRL->CHIP_ID_CTRL
Поле CHIP_ID для определения микросхемы MDR1206FI или MDR1206AFI может быть прочитано в режиме отладки с помощью файла периферии SVD в окне "Memory". Для этого достаточно запустить любую отладочную конфигурацию RAM_TCM_Debug - при отладке только в ОЗУ различия в алгоритме программирования не влияют на возможность запуска отладки, поскольку механизм доступа к памяти ОЗУ одинаков, и используемый SVD-файл также не влияет, поскольку регистр FLASH_CNTRL->CHIP_ID_CTRL расположен по одинаковым адресам в MDR1206FI и MDR1206AFI. После перехода в отладку через окно Memory необходимо открыть просмотр регистров блока RST_CLK и установить в "1" бит PCLK[3] – FLASH в регистре RST_CLK->PER2_CLOCK для дальнейшего доступа к регистрам блока FLASH_CNTRL. Затем открыть регистры FLASH_CNTRL. В регистре FLASH_CNTRL->CHIP_ID_CTRL поле CHIP_ID указывает на версию микросхемы - значение 215 соответствует MDR1206AFI, значение 217 соответствует MDR1206FI (рисунок 20).
Рисунок 20 – Определение номера версии микросхемы по полю CHIP_ID в режиме отладки из ОЗУ
6. Программирование загрузочной программы в область BOOT FLASH
Микросхемы MDR1206FI, MDR1206AFI поставляются запрограммированными загрузочной программой. Загрузочная программа в микроконтроллере расположена в области BOOT (информационной области Flash-памяти) и может быть стерта или перезаписана при использовании. Рекомендуется всегда использовать актуальную версию загрузочной программы с
сайта.
Скомпилированный образ описанного в спецификации примера загрузочной программы доступен в составе приложенных проектов в папках bootloader - файл bootloader.hex. Данный файл общий для MDR1206FI и MDR1206AFI.
Для программирования загрузочной программы в область BOOT можно скомпилировать любой из прилагаемых проектов, выбрать прилагаемую отладочную конфигурацию "FLASH with Bootloader FTDI2232HL" и запустить отладку (следует обратить внимание, что конфигурация настроена именно для использования микросхемы-отладчика FTDI2232HL). Загрузка образа типовой загрузочной программы перед загрузкой программы проекта осуществляется с помощью прописанной в настройках отладочной конфигурации команды '-c "program bootloader/bootloader.hex preverify verify"' для OpenOCD.
Если требуется, например, выбрать другой отладчик или отключить загрузку образа основной программы проекта, необходимо изменить настройки отладочной конфигурации согласно п.
"Создание новых конфигураций отладки".
7. Дополнительные возможности
При разработке программы имеется возможность использовать дополнительные настройки проекта, такие как размещение функций в ОЗУ, размещение данных в AHB RAM для контроллера DMA, использование функций для работы с динамической памятью. Подробнее об этом описано в пунктах ниже.
7.1 Размещение функций в ОЗУ
В конфигурационный файл компоновщика (link_*.ld) добавлена специальная секция ".ramfunc", которая предназначена для размещения требуемых функций в ОЗУ (по умолчанию это TCMB RAM). В startup-файл добавлен код, который копирует при старте МК все функции, расположенные в секции ".ramfunc", из Flash в ОЗУ.
Для размещения функции в ОЗУ необходимо указать атрибут "__attribute__ ((section (".ramfunc")))" в объявлении функции. Пример размещения функции foo() в ОЗУ приведён во фрагменте кода 1.
Фрагмент кода 1 - Размещение функции foo() в ОЗУ
#define __RAMFUNC __attribute__ ((section (".ramfunc"))) // объявлен в MDR32VF0xI_config.h
__RAMFUNC void foo(void);
Необходимо обратить внимание, что точки останова, которые проставлены в функции, расположенной в ОЗУ, могут работать некорректно и вызывать исключение "illegal instruction". Это происходит из-за того, что отладчик в таких функциях ставит программные точки останова до их инициализации.
В результате возникает следующая ситуация. При запуске отладки МК сбрасывается. После сброса МК содержимое ОЗУ, в котором будет находится требуемая функция, неопределенно. Отладчик до копирования функции из Flash в ОЗУ ставит в ОЗУ, где, как он предполагает, уже размещена функция, программную точку останова. Программная точка останова предполагает перезапись инструкции специальной командой, при этом инструкция, расположенная на месте точки останова, запоминается отладчиком. Так как точка останова ставится до копирования функции из Flash в ОЗУ, то отладчик запоминает данные неиницализированной ОЗУ, т.е. "мусор". После остановки в функции main(), когда ОЗУ уже проинициализировано, отладчик восстанавливает инструкции на местах точек останова, тем самым записывая в ОЗУ сохранённый ранее "мусор". Реальная инструкция будет утрачена.
Таким образом, не рекомендуется перед запуском отладки устанавливать или активировать точки останова, которые находятся в функциях, расположенных в ОЗУ. После остановки в main(), когда ОЗУ уже проинициализировано, можно устанавливать точки останова в любую область программы.
7.2 Размещение данных в памяти AHB RAM
МК MDR1206FI, MDR1206AFI имеют три области ОЗУ: TCMA RAM, TCMB RAM и AHB RAM. Ядро имеет доступ ко всем трём областям ОЗУ, контроллер DMA получает доступ к памяти TCM RAM по шине AHB-Lite (рисунок 21) через арбитр доступа к блокам памяти TCM в ядре.
Рисунок 21 – Доступ к областям ОЗУ со стороны процессорного ядра и контроллера DMA
Интенсивный обмен данными в TCM RAM с помощью DMA может значительно замедлить работу, поскольку ядро и DMA будут работать по одной шине. Поэтому данные, используемые контроллером DMA, предпочтительней размещать в области памяти AHB RAM. Для этого в конфигурационный файл компоновщика (link_*.ld) добавлены секции ".ahbram_data" и "ahbram_bss", которые предназначены для размещения инициализированных и неинициализированных данных соответственно. В startup-файл добавлен код инициализации данных.
Для размещения требуемых данных в область памяти AHB RAM необходимо указать атрибут "__attribute__ ((section (".ahbram_data")))" в объявлении инициализируемых данных, и атрибут "__attribute__ ((section (".ahbram_bss")))" в объявлении неинициализируемых данных. Пример размещения массивов данных в памяти AHB RAM приведён во фрагменте кода 2.
Фрагмент кода 2 - Размещение массивов данных в памяти AHB RAM
#define __ahbram_data __attribute__ ((section (".ahbram_data"))) // объявлен в MDR32VF0xI_config.h
#define __ahbram_bss __attribute__ ((section (".ahbram_bss"))) // объявлен в MDR32VF0xI_config.h
__ahbram_bss int array[100];
__ahbram_data char init_message[] = "Hello World from MDR1206FI!";
7.3 Использование функций для работы с динамической памятью
Функции для работы с динамической памятью (malloc(), calloc(), realloc(), free()) предоставляет библиотека newlib (реализация стандартной библиотеки C). Библиотека newlib поставляется в двух вариантах - обычная версия (newlib) и компактная версия (newlib-nano). Для использования newlib-nano в настройках проекта "C/C++ Build -> Settings -> GNU RISC-V Cross C++ Linker -> Miscellaneous", необходимо установить опцию "Use newlib-nano", рисунок 22.
Рисунок 22 – Использование библиотеки newlib-nano
Библиотека newlib взаимодействует с операционной системой (ОС) через системные вызовы. Реализация системных вызовов по умолчанию вызывает ОС с помощью исключения ecall. Если в проекте не используется ОС, то функции системных вызовов необходимо реализовать самостоятельно. Подробнее про реализацию функций системных вызовов написано на
сайте newlib.
Для работы с функциями, которые используют динамическую память, необходимо реализовать функцию _sbrk(). Реализация данной функции представлена в файле "syscalls.c", который приложен к примерам.