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

ID статьи: 37102
Дата последнего изменения: 17.08.2024 11:09:28

В данной статье рассмотрена установка и настройка среды Eclipse для работы с МК К1986ВК025 (MDR32F02), построенного на базе процессорного RISC-V ядра BM-310S. Исходные файлы проектов ("MDR32VF0xI_Template"/"MDR32F02_Template", "MDR32VF0xI_Led", "MDR32F02_OTP_Word") доступны в конце статьи в разделе "Документация" и в составе Standard Peripherals Library на официальном сайте.

Статья содержит информацию о:
1) Установке IDE Eclipse и подготовке к работе с МК К1986ВК025.
2) Подготовке отладчика для работы с OpenOCD.
3) Создании и настройке проекта.
4) Сборке проекта.
5) Создании и настройке конфигурации отладки.
6) Дополнительных возможностях при разработке ПО

Вводные сведения о библиотеке MDR32VF0xI и организации проектов

По состоянию на 2024 год предполагается переход на микросхемы MDR1206FI, MDR1206AFI, которые являются усовершенствованной версией К1985ВК025 (MDR32F02) с некоторыми отличиями. Поскольку МК MDR1206(A)FI функционально близки к К1986ВК025, программная поддержка уровня CMSIS и SPL для микроконтроллеров К1986ВК025 (MDR32F02), MDR1206FI и MDR1206AFI реализована в общей библиотеке - MDR32VF0xI. Поэтому информация из данной статьи по большей части также применима и для MDR1206(A)FI.

В свою очередь проекты (в том числе шаблонов) для микроконтроллеров реализованы как один общий для всех, так и раздельные индивидуально под МК.

Для выбора конкретного МК необходимо выбрать соответствующий макрос USE_MDR... в файле MDR32VF0xI_config.h на уровне SPL или, если уровень SPL не используется и используется только уровень CMSIS, в файле system_MDR32VF0xI_config.h на уровне поддержки устройства (DeviceSupport) в CMSIS. После выбора конкретного МК с помощью макроса при сборке проекта необходимо также выбрать соответствующую микроконтроллеру конфигурацию сборки. Для К1986ВК025, не смотря на то, что микроконтроллер один, макросов предусмотрено два (с сохранением одной конфигурации сборки) - для ревизий 1.0, 1.1 и ревизии 2.0. 

Примеры проектов с общим для микроконтроллеров 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, собранный с поддержкой МК К1986ВК025, доступен для скачивания в конце статьи, раздел "Программное обеспечение", или на официальном сайте компании Миландр

Для работы среды разработки 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 необходимо указать соответствующие пути. Для этого необходимо открыть окно "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

МК К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:

Не допускается подключение внешнего отладчика к отладочной плате при установленных перемычках на разъёме 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"/"MDR32F02_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".


Рисунок 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-310S реализует систему команд RV32I версии 2.0, когда данные инструкции являлись частью базовой системы команд. В связи с этим в настройках GNU RISC-V Embedded GCC проекта необходимо указать использование расширений Zicsr и Zifencei. 

Настройка расширений осуществляется в настройках проекта (ПКМ по названию проект в Workspace -> Properties -> C/C++ Build -> Settings -> Tool Settings -> Target Processor), в поле "Other extensions" нужна записать "_zicsr_zifencei" (рисунок 11).


Рисунок 11 – Настройка использования расширений Zicsr и Zifencei


Инструкции работы с CSR-регистрами используются на уровне CMSIS. Без указания использования расширений Zifencei и Zicsr сборка проекта будет завершаться, например, с ошибками вида "Error: unrecognized opcode `csrr s10,mhartid'" и аналогичными ошибками. 


4. Сборка проектов

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


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

По умолчанию в проектах реализован набор разных видов сборки, которые отличаются настройками конфигурационного файла компоновщика (link_*.ld):

Отличия между 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):

 On-board FTDI2232HL -f interface/ftdi/mdr-ft2232hl.cfg -f target/MDR32F02.cfg
J-Link -f interface/jlink.cfg -f target/MDR32F02.cfg

В поле "Commands" необходимо указать следующие команды: set mem inaccessible-by-default off
set arch riscv:rv32
set remotetimeout 250
 

Рисунок 16 – Конфигурация отладки во вкладке Debugger для MDR32F02 (К1986ВК025)

Во вкладке "Startup" необходимо убрать галочку с пункта "Enable Arm semihosting".

ВАЖНО!
Опция "Debug in RAM" указывает отладчику при каждом запуске отладки выполнять загрузку программы, а также принудительно устанавливать начальный адрес программы (функция _start из файла startup). Данную опцию необходимо устанавливать в двух случаях:
  1. выполняется отладка программы, загруженной в память ОЗУ (конфигурации "RAM_TCM_Debug");
  2. используется микросхема с чистой OTP-памятью (загрузочная программа не запрограммирована) и выполняется отладка программы, загруженной во Flash-память (конфигурации "FLASH").
Микросхемы К1986ВК025 ревизии 2 (маркировка 2140 и более) поставляются с чистой OTP-памятью для возможности самостоятельно запрограммировать загрузочную программу, исходя из требуемых задач. Маркировка указывается на крышке корпуса микросхемы в формате ГГНН, где ГГ – год изготовления, НН – неделя изготовления. Подробнее о программировании загрузочной программы в OTP-память приведено в статье "Программирование памяти OTP микроконтроллера К1986ВК025"

Если же используется микросхема с запрограммированной в OTP-память загрузочной программой, которая передаёт управление во Flash-память (для стандартной загрузочной программы необходимо установить режим MODE[1:0] = 00), и при этом выполняется отладка программы, загруженной во Flash-память (конфигурации "FLASH"), то опцию "Debug in RAM" необходимо выключить, рисунок 17.

Когда галочка убрана с "Debug in RAM", то после загрузки программы отладчик установит точку останова на функцию main() и сбросит МК. МК стартует с загрузочной программы, которая передаёт управление во Flash-память (режим MODE[1:0] = 00 для стандартной загрузочной программы). Когда выполнение программы дойдёт до точки останова в main(), то МК остановится, а в окне отладки появится синяя стрелочка напротив main(), указывающая, что МК остановлен.
 

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

Во вкладке "SVD Path" необходимо указать путь к SVD-файлу, описывающему периферию МК, рисунок 18. SVD-файл также расположен локально в приложенных проектах, в папке svd. Если проекты взяты из состава Standard Peripherals Library, данные файлы нужно копировать в проект самостоятельно. Следует отметить, что из-за различий в ревизиях 1 и 2 микроконтроллера SVD-файлы разделены на два для соответствующих ревизий. Поэтому выбор SVD-файла зависит от используемой ревизии контроллера.


Рисунок 18 – Конфигурация отладки во вкладке SVD Path на примере MDR32F02 (К1986ВК025) ревизии 2.0

Для запуска отладки необходимо включить питание отладочной платы, подключить кабель USB A-B от платы к ПК, после чего нажать кнопку "Debug".

5.2. Использование предварительно сохраненных файлов отладочных конфигураций

В приложенных проектах файлы отладочных конфигураций под все конфигурации сборок для отладки с помощью FTDI2232HL уже реализованы (рисунок 19). Отладочные конфигурации сохранены в проектах в папке launch_cfg и автоматически добавляются в список отладочных конфигураций в окне "Debug Configurations" после импорта проекта (изменять имя проекта при этом не рекомендуется - иначе руководствоваться примечанием ниже). При необходимости настройки могут быть скорректированы (например, при использовании другого отладчика и образа собранной программы для загрузки) согласно инструкциям, приведенным в пункте выше. 


Рисунок 19 – Предварительно созданные отладочные конфигурации


Для К1986ВК025 ревизий 1.0/1.1 и ревизии 2.0 отладочные конфигурации различаются только подключаемым SVD-файлом.

Если проект был переименован, сохраненные отладочные конфигурации не будут работать, т.к. в их структуре содержится информация о названии проекта и собираемого 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.

После запуска отладки на отладочной плате К1986ВК025 ТСКЯ.468998.125 будут мигать светодиоды LED4-LED1, подключенным к выводам PD[3:0] микроконтроллера.

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

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

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

В конфигурационный файл компоновщика (link_*.ld) добавлена специальная секция ".ramfunc", которая предназначена для размещения требуемых функций в ОЗУ (по умолчанию это TCMA 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(), когда ОЗУ уже проинициализировано, можно устанавливать точки останова в любую область программы.

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

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


Рисунок 20 – Доступ к областям ОЗУ со стороны процессорного ядра и контроллера 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 K1986VK025!";

6.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", рисунок 21.


Рисунок 21 – Использование библиотеки newlib-nano

Библиотека newlib взаимодействует с операционной системой (ОС) через системные вызовы. Реализация системных вызовов по умолчанию вызывает ОС с помощью исключения ecall. Если в проекте не используется ОС, то функции системных вызовов необходимо реализовать самостоятельно. Подробнее о реализации функций системных вызовов можно ознакомиться на сайте newlib.

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

Контактная информация

Сайт:https://support.milandr.ru
E-mail:support@milandr.ru
Телефон: +7 495 221-13-55