37102

Создаем проект для МК К1986ВК025 в IDE Eclipse

Дата последнего изменения: 14.10.2021 15:40:35

В данной статье рассмотрена установка и настройка среды Eclipse для работы с МК К1986ВК025, построенного на базе процессорного RISC-V ядра BM-310S. Исходные файлы проектов ("Template", "Led", "Interrupt_Example", "LCD_Example") доступны в конце статьи в разделе "Файлы для скачивания".
На данный момент файлы поддержки находятся в активной разработке и предоставляются в ознакомительных целях. О найденных ошибках в SPL рекомендуется сообщать на почту отдела технической поддержки (support@milandr.ru), или на форум (https://forum.milandr.ru/viewtopic.php?p=26758).

1. Установка и подготовка к работе IDE Eclipse

Среда разработки Eclipse, а также дополнительный набор программных компонентов, могут быть скачаны в уже установленном виде, а потому требуют только распаковки, права администратора при этом не требуются. Все скачанные программы могут быть распакованы в любую удобную директорию на ПК, например, C:\Eclipse

Скачать IDE Eclipse можно по следующей ссылке:
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://xpack.github.io/riscv-none-embed-gcc/install/

2. Windows Build Tools – набор программ (make, rm), которые необходимы для сборки и очистки проекта в среде Eclipse.
Windows Build Tools доступен для скачивания по ссылке: https://xpack.github.io/windows-build-tools/install/

3. OpenOCD - ПО для программирования и отладки устройств. OpenOCD, собранный с поддержкой МК 1986ВК025, доступен для скачивания в конце статьи, раздел "Файлы для скачивания".

Для скачивания указанных выше программных средств в виде архива необходимо на странице для скачивания перейти в раздел «Manual install», где открыть страницу «releases» на GitHub. В открывшейся окне требуется выбрать архив в зависимости от версии ОС.

Для работы среды разработки 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

Для подключения программных средств для работы с МК К1986ВК025 в среде Eclipse необходимо указать соответствующие пути. Для этого необходимо открыть окно «Windows->Preferences» и перейти во вкладку «MCU».

Во вкладке «MCU->Global Build Tools Paths» необходимо прописать путь к папке bin Build Tools (xPack Windows Build Tools), рисунок 2.

Рисунок 2 – Указание пути к Windows Build Tools

Во вкладке «MCU->Global OpenOCD Paths» необходимо прописать путь к папке bin OpenOCD (xPack OpenOCD), рисунок 3.

Рисунок 3 – Указание пути к OpenOCD

Во вкладке «MCU->Global RISC-V Toolchains Paths», необходимо выбрать тулчейн по умолчанию «xPack GNU RISC-V Embedded GCC» и прописать путь к папке bin GNU RISC-V (xPack GNU RISC-V Embedded GCC), рисунок 4.

Рисунок 4 – Указание пути к GNU RISC-V Embedded GCC

После указания всех путей необходимо нажать кнопку «Apply and Close».

На этом подготовка среды Eclipse завершена.

2. Подготовка отладчика для работы с OpenOCD

МК К1986ВК025 поддерживает отладку только через интерфейс JTAG. Для отладки МК К1986ВК025 на отладочной плате установлена микросхема 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

Для быстрого старта можно использовать шаблон проекта «Template» или пример «Led», в которых уже подключена библиотека SPL. Проекты приложены в материалах к статье.

Чтобы добавить проект в Workspace, необходимо выполнить процедуру импорта проекта. Для этого требуется выбрать «File->Import». В открывшемся окне выбрать «General->Existing Projects into Workspace» и нажать «Next >», как показано на рисунке 6.

Рисунок 6 – Импорт «Existing Projects into Workspace»

В пункте «Select root directory» необходимо указать папку с проектом «Template» или «Led». В поле «Projects» установить галочку напротив выбранного проекта, а также установить пункт «Copy projects into workspace», чтобы проект был скопирован в workspace, рисунок 7. Далее следует нажать «Finish».

Рисунок 7 – Импорт – выбор ранее созданного проекта

Чтобы отобразилось основное окно проекта, необходимо закрыть стартовое окно «Welcome». Слева в поле «Project Explorer» должен отобразиться добавленный проект, рисунок 8.

Рисунок 8 – Отображение проекта «Led» в «Project Explorer»
  
Добавленный проект можно переименовать. Для это следует нажать ПКМ на имя проекта и выбрать пункт «Rename» (или нажать F2). После переименования следует изменить папку ресурсов. Для этого необходимо перейти в свойства проекта (ПКМ на имя проекта -> Properties или нажать «Alt+Enter»). В открывшемся окне необходимо перейти в «C/C++ Build -> Refresh Policy» и удалить папку со старым названием проекта, как показано на рисунке 9.

Рисунок 9 – Удаление папки со старым названием проекта

Теперь необходимо нажать «Add Resourse…» и выбрать папку с новым названием проекта, рисунок 10. Далее следует нажать «ОК» и «Apply and Close».
  
Рисунок 10 – Добавление папки с новым названием проекта

Добавление проекта в IDE Eclipse завершено.

4. Создание и настройка конфигурации отладки

Перед созданием отладочной конфигурации необходимо скомпилировать проект. Значок молотка (выделен зеленым на рисунке 11) выполняет компиляцию. Нажав на стрелку рядом, можно выбрать конфигурацию сборки. Значок документа (выделен синим) скомпилирует все конфигурации (Сtrl+B).

Рисунок 11 – Кнопки для сборки проекта

По умолчанию в проектах реализовано два вида сборки для отладки, которые отличаются настройками конфигурационного файла компоновщика (link_*.ld):
  • «Debug_Flash» - код расположен во Flash-памяти, данные - в ОЗУ;
  • «Debug_RAM» - код и данные расположены в ОЗУ;
Для каждой конфигурации сборки используется свой конфигурационный файл компоновщика link_*.ld. Отличие данных link_*.ld файлов заключается в различном описании регионов памяти: /* RUN IN FLASH */ и /* RUN IN RAM */. В каждом .ld файле раскомментировано только требуемое описание.

После сборки проекта для создания конфигурации отладки необходимо нажать на стрелку у значка «жука» и выбрать пункт «Debug Configurations…», рисунок 12.

Рисунок 12 – Расположение кнопки Debug Configurations

В открывшемся окне слева необходимо выбрать пункт «GDB OpenOCD Debugging» и нажать кнопку «New», как показано на рисунке 13.

Рисунок 13 – Настройки окна Debug Configurations

Во вкладке «Main» необходимо выбрать требуемый проект, при этом также можно изменить название отладочной конфигурации. Для выбора проекта необходимо нажать кнопку «Search Project» и выбрать соответствующий elf файл, рисунок 14.

Рисунок 14 – Конфигурация отладки во вкладке Main

Во вкладке «Debugger» в поле «Config options» необходимо указать файл конфигурации отладчика, как показано на рисунке 15. Например, для встроенного отладчика необходимо прописать:
-f MLDR187-ft2232hl.cfg
В поле «Commands» необходимо указать следующие команды:
set mem inaccessible-by-default off
set arch riscv:rv32
set remotetimeout 250

Рисунок 15 – Конфигурация отладки во вкладке Debugger

Во вкладке «Startup» необходимо убрать галочку с пункта «Enable Arm semihosting». Если отладка будет выполняться из Flash, конфигурация "Debug_Flash", то опцию «Debug in RAM» необходимо выключить, рисунок 16.

Если же отладка будет выполняться из ОЗУ, конфигурация "Debug_RAM", то опцию «Debug in RAM» необходимо установить. Установка данной опции указывает отладчику загружать программу при каждом сбросе. Также при запуске отладки будет принудительно установлен начальный адрес программы, и отладка будет стартовать сразу с функции _start из файла startup. Если убрать галочку с «Debug in RAM», то после загрузки программы отладчиком в память ОЗУ отладчик установит точку останова на функцию main() и сбросит МК. МК запустится в соответствии с режимом MODE, заданным на выводах, и если выполнение программы дойдёт до точки останова в main(), то МК остановится, а в окне отладки появится синяя стрелочка напротив main(), указывающая, что МК остановлен.
 
Рисунок 16 – Конфигурация отладки во вкладке Startup

Во вкладке «SVD Path» необходимо указать путь к SVD файлу «MLDR187.svd», описывающему периферию МК, рисунок 17.

Рисунок 17 – Конфигурация отладки во вкладке SVD Path

Для запуска отладки необходимо включить питание отладочной платы, подключить кабель USB A-B от платы к ПК, после чего нажать кнопку «Debug».
Перед включением блока питания в сеть необходимо проверить, что переключатель «Power» находится в положении «Off». Только после включения блока питания в сеть можно включать питание на плате: «Power» -> «On».
На отладочной плате "MLDR187B Ver2" необходимо выбрать один из нескольких способов подачи батарейного питания BUcc. Батарейное питание BUcc может быть подано либо от батарейки, либо с разъёма XP22 (BUcc Ext), либо от питания Ucc. Для подачи батарейного питания от Ucc необходимо установить перемычку между разъёмами Ucc (XP31) и BUcc (XP32).

5. Дополнительные возможности

При разработке программы имеется возможность использовать дополнительные настройки проекта, такие как размещение функций в ОЗУ, размещение данных в AHB RAM для контроллера DMA, использование функций для работы с динамической памятью. Подробнее об этом описано в пунктах ниже.

5.1 Размещение функций в ОЗУ

В конфигурационный файл компоновщика (link_*.ld) добавлена специальная секция ".ramfunc", которая предназначена для размещения требуемых функций в ОЗУ (по умолчанию это TCMA RAM). В startup-файл добавлен код, который копирует при старте МК все функции, расположенные в секции ".ramfunc", из Flash в ОЗУ. По умолчанию в секции ".ramfunc" также находится основной обработчик прерываний - "trap_vector". Это позволяет достичь наибольшей производительности МК.

Для размещения функции в ОЗУ необходимо указать атрибут "__attribute__ ((section (".ramfunc")))" в объявлении функции. Пример размещения функции foo() в ОЗУ приведён во фрагменте кода 1.

Фрагмент кода 1 - Размещение функции foo() в ОЗУ
#define __ramfunc  __attribute__ ((section (".ramfunc")))

__ramfunc void foo(void);

Необходимо обратить внимание, что точки останова, которые проставлены в функции, расположенной в ОЗУ, могут работать некорректно и вызывать исключение "illegal instruction". Это происходит из-за того, что отладчик в таких функциях ставит программные точки останова до их инициализации.

Получается следующая ситуация. При запуске отладки МК сбрасывается. После сброса МК содержимое ОЗУ, в котором будет находится требуемая функция, неопределенно. Отладчик до копирования функции из Flash в ОЗУ ставит в ОЗУ, где, как он предполагает, уже размещена функция, программную точку останова. Программная точка останова предполагает перезапись инструкции специальной командой, при этом инструкция, расположенная на месте точки останова, запоминается отладчиком. Так как точка останова ставится до копирования функции из Flash в ОЗУ, то отладчик запоминает данные неиницализированной ОЗУ, т.е. "мусор". После остановки в функции main(), когда ОЗУ уже проинициализировано, отладчик восстанавливает инструкции на местах точек останова, тем самым записывая в ОЗУ сохранённый ранее "мусор". Реальная инструкция будет утрачена.

Таким образом, не рекомендуется перед запуском отладки устанавливать или активировать точки останова, которые находятся в функциях, расположенных в ОЗУ. После остановки в main(), когда ОЗУ уже проинициализировано, можно устанавливать точки останова в любую область программы.

5.2 Размещение данных в памяти AHB RAM

МК К1986ВК025 имеет три области ОЗУ: TCMA RAM, TCMB RAM и AHB RAM. Ядро имеет доступ ко всем трём областям ОЗУ, однако контроллер DMA имеет доступ только к памяти AHB RAM, рисунок 18.

Рисунок 18 – Доступ к областям ОЗУ со стороны процессорного ядра и контроллера 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")))
#define __ahbram_bss   __attribute__ ((section (".ahbram_bss")))

__ahbram_bss int array[100];
__ahbram_data char init_message[] = "Hello World from K1986VK025!";

5.3 Использование функций для работы с динамической памятью

Функции для работы с динамической памятью (malloc(), calloc(), realloc(), free()) предоставляет стандартная библиотека newlib. Данная библиотека подключается в настройках проекта "C/C++ Build -> Settings -> GNU RISC-V Cross C++ Linker -> Miscellaneous", опция "Use newlib-nano", рисунок 19.

Рисунок 19 – Подключение библиотеки newlib к проекту

Библиотека newlib взаимодействует с операционной системой (ОС) через системные вызовы. Если в проекте не используется ОС, то функции системных вызовов необходимо реализовать самостоятельно. Подробнее про реализацию функций системных вызовов написано в документе "porting.pdf", расположенному по пути "xpack-riscv-none-embed-gcc-8.3.0-2.3\share\doc\pdf", либо на сайте newlib.

Для работы с функциями, которые используют динамическую память, необходимо реализовать функцию _sbrk(). Реализация данной функции представлена в файле "syscalls.c", который приложен к материалам статьи.

Сохранить статью в PDF

Файлы для скачивания

Документация

Теги

Была ли статья полезной?