README.md

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 их увидел: Приоритет поиска (от высшего к низшему):

  1. Файл 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
  1. Файл ~/.config/riscv-sdk/toolchain.env (на Windows %APPDATA%/riscv-sdk/toolchain.env) c тем же форматом
  2. Поиск в 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
Описание
CMake SDK для работы с RISC-V контроллерами НИИЭТ.
Конвейеры
0 успешных
0 с ошибкой
Разработчики