RISC-V SDK
Модульный SDK для разработки под микроконтроллеры НИИЭТ на базе RISC-V ядер (SCR4, SCR5, BM-310): K1921VG015, K1921VG1T(K1921VG10YA), K1921VG3T(K1921VG11T), K1921VG5T, K1921VG7T.
Быстрый старт
Установка и использование SDK
Для удобного процесса установки SDK и зависимостей, рекомендуется установить утилиту командной строки anodik из репозитория. Если использование утилиты по какой-то причине не возможно, перейдите к следующей главе.
Скачайте пакет anodik, подходящий для вашей системы и архитектуры, распакуйте и добавьте в переменную среды PATH чтобы его было удобно вызывать из любой консоли.
Проверить правильность установки утилиты можно с помощью
anodik help # выведет список доступных команд и их описание
Проверить окружение:
anodik doctor # проверит наличие и видимость в окружении инструментов, которые используются для работы с SDK.
Установить недостающие пакеты:
anodik install help # выведет описание и возможное использование команды install. можно указать место установки и вывести полный список доступных пакетов.
anodik install openocd # используется для прошивки и взаимодействия с контролером
anodik install cmake # система сборки SDK и пользовательских проектов
anodik install ninja
anodik install compiler # riscv тулчейн: gcc, clang, линкеры, gdb, и т.д.
Если инструменты уже установлены где-то в системе, то можно вручную добавить местоположение, чтобы anodik их увидел: Приоритет поиска (от высшего к низшему):
- Файл
local.envв корне проекта. Пример заполнения .env можно посмотреть в example.env:
GCC_TOOLCHAIN_BIN_DIR=/path/to/riscv32-unknown-elf/bin
CLANG_TOOLCHAIN_BIN_DIR=/path/to/clang/bin
RISCV_TOOLCHAIN_PREFIX=riscv32-unknown-elf
OPENOCD=/path/to/openocd-executable
CMAKE=/path/to/cmake-executable
NINJA=/path/to/ninja-executable
- Файл
~/.config/riscv-sdk/toolchain.env(на Windows%APPDATA%/riscv-sdk/toolchain.env) c тем же форматом - Поиск в PATH
Затем необходимо склонировать и установить репозиторий SDK в любое удобное место и зарегистрировать его в системе, чтобы cmake и anodik могли найти его из любого места:
git clone https://gitflic.ru/project/niiet/riscv_cmake_sdk.git
cd riscv_cmake_sdk
anodik register
Чтобы проверить, что все работает правильно, попробуйте запустить пример из SDK:
anodik list # выведет доступный список примеров
anodik build run_leds # собирает пример run_leds
anodik info run_leds # покажет информацию о том под какой контроллер собран пример и где лежит ELF файл прошивки
anodik size run_leds # покажет размер прошивки
Если требуется изменить микроконтроллер, под который собирается прошивка, необходимо внести изменения в CMakeLists.txt проекта. У примера run_leds этот файл находится в examples/run_leds/CMakeLists.txt.
set(CONFIG_SOC "k1921vg1t")
set(CONFIG_BOARD "dev")
Переменные CONFIG_SOC и CONFIG_BOARD отвечают за микроконтроллер и конфигурацию платы, под которую собирается проект. Чтобы узнать доступные значения используйте
anodik list --socs
anodik list --boards
После изменения параметров сборки под нужный микроконтроллер и плату можно интерактивно прошить устройство и запустить консольный интерфейс GDB:
anodik run run_leds
Подробнее про использование утилиты anodik можно прочитать в docs/09-anodik.md
Альтернативная установка и использование без anodik
Действия ниже нужно выполнять только если вы не можете установить SDK с помощью anodik. Если SDK уже установлен, то можете перейти к следующей главе
Скачайте RISC-V GCC тулчейн (riscv32-unknown-elf) и, при необходимости, Clang тулчейн из репозитория, и распакуйте в удобную директорию. Если вы собираетесь прошивать микроконтроллеры, то аналогично нужно сделать с OpenOCD. В системе так же должен быть CMake версии >= 3.20 и Ninja
Установка видимости SDK в cmake
Чтобы можно было работать в отдельном проекте необходимо зарегестрировать SDK в системе:
-
Windows: В реестре, в ключе
HKEY_CURRENT_USERсоздать путьSoftware\Kitware\CMake\Packages\RiscvSdkи создать там переменнуюPathс путем к SDK/tools/cmake/RiscvSdk -
Posix (linux, darwin): В директории
~/.cmake/packages/RiscvSdk/создать файлriscv-sdkи написать в нем путь кSDK/tools/cmake/RiscvSdk
Сборка
Для сборки примера или проекта с использованием SDK без anodik используется cmake:
cmake \
-S /path/to/src/ \
-B /path/to/build/dir \
-G Ninja \
-DSDK_ROOT=/path/to/sdk/root \
-DGCC_TOOLCHAIN_BIN_DIR=/path/to/gcc/bin/dir/ \
-DRISCV_TOOLCHAIN_PREFIX=riscv32-unknown-elf \
-DCLANG_TOOLCHAIN_BIN_DIR=/path/to/clang/bin/dir/ \
-DCONFIG_FORCE_COMPILER=<gcc|clang|default> \
-DCMAKE_TOOLCHAIN_FILE=/path/to/sdk/root/tools/cmake/riscv_toolchain.cmake
Прошивка и отладка
Для того чтобы подключить openocd
openocd \
-s /path/to/sdk/tools/ocd/target \
-s /path/to/sdk/tools/ocd/interface \
-f jlink.cfg \
-f k1921vg1t.cfg \
Подключить GDB к openocd
riscv32-unknown-elf-gdb -ex "tar rem :3333" /path/to/elf/file
...
(gdb) load
(gdb) continue
Структура проекта
.
├── CMakeLists.txt # Главная точка входа SDK (автоподключается после project())
├── local.env # Локальные настройки тулчейна (gitignored)
├── tools/
│ ├── cmake/
│ │ ├── riscv_toolchain.cmake # Кросс-компилятор
│ │ ├── sdk_config.cmake # Загрузчик tools/cmake/config/
│ │ ├── sdk_functions.cmake # sdk_add_executable и утилиты
│ │ ├── config/ # option()-декларации CONFIG_* (soc, ll, hal, drivers, vendor)
│ │ └── RiscvSdk/ # Пакет find_package(RiscvSdk)
│ └── ocd/ # Конфиги OpenOCD
│ ├── interface/
│ └── target/
├── docs/ # Документация
├── components/
│ ├── core/ # Инициализация ядер
│ │ ├── cloudbear/
│ │ │ ├── bm310/
│ │ │ └── common/
│ │ └── syntacore/
│ │ ├── scr4/
│ │ ├── scr5/
│ │ └── common/
│ ├── startup/ # Стартап-код и общий линкерный скрипт
│ ├── soc/ # Описания периферии микроконтроллеров
│ │ ├── k1921vg015/
│ │ ├── k1921vg1t/
│ │ ├── k1921vg3t/
│ │ ├── k1921vg5t/
│ │ └── k1921vg7t/
│ ├── hal/ # Аппаратная абстракция
│ ├── drivers/ # Драйверы устройств
│ └── vendor/ # Порты сторонних библиотек
└── examples/ # Примеры
├── run_leds/
└── rotator/
Документация
Подробная документация о внутреннем устройстве SDK хранится в docs/. Рекомендуется ознакомиться с ней перед началом работы, чтобы понимать общую архитектуру и возможности SDK. Документация включает в себя только особенности, связанные с SDK. Общая документация: возможности микроконтроллера, особенности плат разработчика и другое - определяется руководством пользователя, errata и описанием плат для точной ревизии кристалла и корпуса.
Создание нового примера
Минимальный пример
examples/my_app/CMakeLists.txt:
cmake_minimum_required(VERSION 3.20)
set(CONFIG_SOC "k1921vg1t")
set(CONFIG_RISCV_ARCH "rv32imafc_zicsr_zifencei")
set(CONFIG_RISCV_ABI "ilp32f")
set(CONFIG_LINKER_MODE "flash")
set(CONFIG_LIBC "default")
find_package(RiscvSdk REQUIRED)
project(my_app LANGUAGES C ASM)
sdk_add_executable(my_app src/main.c)
my_app/src/main.c:
#include <soc.h>
int main(void)
{
while (1) {
/* ... */
}
return 0;
}
Сборка:
anodik build my_app
Отладка
Конфигурация OpenOCD
tools/ocd/
├── interface/ # cmsis-dap.cfg, jlink.cfg, ftdi.cfg, ...
└── target/ # k1921vg015.cfg, k1921vg1t.cfg, k1921vg3t.cfg, k1921vg5t.cfg
Полные списки: anodik list --interfaces и anodik list --socs.
В examples/my_app/build/ после сборки:
| Файл | Описание |
|---|---|
| name | ELF |
| artifacts/name.hex | Intel HEX |
| artifacts/name.bin | Raw binary |
| artifacts/name.dis | Дизассемблер |
| artifacts/name.map | Memory map |
| compile_commands.json | Для IDE/clangd |
| debug.mk | Параметры отладки |
Использование SDK из внешнего проекта
Можно воспользоваться командой anodik:
anodik new help
anodik new --path my_product
Или создать файлы вручную:
my_product/
├── src/
├── inc/
└── CMakeLists.txt
my_product/CMakeLists.txt:
cmake_minimum_required(VERSION 3.20)
find_package(RiscvSdk REQUIRED)
project(my_product LANGUAGES C ASM)
sdk_add_executable(my_product src/main.c src/app.c)
target_include_directories(my_product inc)
Сборка:
С помощью анодика:
anodik build
Без использования анодика - такая же как и с примерами.
Конвенции именования CMake-таргетов
| Тип | Формат | Пример |
|---|---|---|
| Драйвер | sdk_driver_<name> |
sdk_driver_st7735 |
| Библиотека (порт) | sdk_port_<name> |
sdk_port_freertos |
| HAL модуль | sdk_hal_<name> |
sdk_hal_gpio |
| LL (периферия) | sdk_ll_<name> |
sdk_ll_gpio |
| Ядро | sdk_core |
— |
| BSP | sdk_bsp |
— |