Быстрый старт
В данном руководстве описана пошаговая инструкция по разработке и запуску DSP-кернела hello-world.
Требования:
на x86-64 системе установлен cmake не младше 3.10.
на x86-64 системе собран Buildroot и на отладочном модуле прошиты образы согласно инструкции. Путь к директории с Buildroot далее по тексту обозначается как
BUILDROOT_SRC_DIR
.
Сборка программы для CPU выполняется с помощью CPU-тулчейна. CPU-тулчейн интегрирован в Buildroot.
toolchain-файл — $BUILDROOT_SRC_DIR/buildroot/output/host/share/buildroot/toolchainfile.cmake
.
Сборка DSP-кернела выполняется с помощью DSP-тулчейна eltools_4.0_linux
. DSP-тулчейн
интегрирован в Buildroot. toolchain-файл —
$BUILDROOT_SRC_DIR/buildroot/output/host/opt/toolchain-elcore50/share/cmake/elcore50-toolchain.cmake
.
Предупреждение
Компилятор поддерживает только x86-64. Разработка и сборка DSP-кернелов выполняется на x86-64.
Утилиты для работы с объектным кодом (readelf, size, strip, objdump, …) также доступны на отладочном модуле по имени с префиксом elcore32-elvees-elf.
Создание DSP-кернела
Создать рабочую директорию для проекта, назвав, например, dsp-hello-world
. В рабочей директории
создать директорию src
. В директории src
создать файл dsp-hello-world.c
:
// Copyright 2022 RnD Center "ELVEES", JSC
#include <stdio.h>
int main(int argc, char* argv[]) {
printf("Hello World running on DSP\n");
return 0;
}
Сборка DSP-кернела
Сборка DSP-кернела может осуществляться как внутри, так и вне Buildroot.
Сборка DSP-кернела вне Buildroot
В данной главе будет создана следующая иерархия файлов:
dsp-hello-world
├── CMakeLists.txt
├── build
│ ├── ...
│ └── dsp-hello-world.elf
└── src
├── CMakeLists.txt
└── dsp-hello-world.c
Создать в директории src файл
CMakeLists.txt
:cmake_minimum_required(VERSION 3.10) project(dsp-hello-world.elf C) find_package(ElcoreRuntime REQUIRED) add_executable(${PROJECT_NAME} dsp-hello-world.c) target_link_libraries(${PROJECT_NAME} PRIVATE elcore-runtime) target_compile_options(${PROJECT_NAME} PRIVATE -O3)
Примечание
Все DSP-кернелы должны линковаться с runtime-библиотекой elcore-runtime, которая находится в составе Buildroot. Подробное описание библиотеки elcore-runtime — в документе Библиотека DSP elcore-runtime.
Экспортировать переменную
BUILDROOT_SRC_DIR
, указав полный путь до Buildroot:export BUILDROOT_SRC_DIR=/path/to/buildroot
В рабочей директории выполнить:
cmake src -B build \ -DCMAKE_TOOLCHAIN_FILE=$BUILDROOT_SRC_DIR/buildroot/output/host/opt/toolchain-elcore50/share/cmake/elcore50-toolchain.cmake \ -DElcoreRuntime_DIR=$BUILDROOT_SRC_DIR/buildroot/output/staging/usr/lib/cmake/ElcoreRuntime cmake --build build
В случае успешного выполнения команды, в директории build появится ELF-файл
dsp-hello-world.elf
, готовый к запуску на отладочном модуле.
Сборка DSP-кернела пакетом Buildroot
В данной главе будет создана следующее дерево файлов:
├── dsp-hello-world
│ ├── CMakeLists.txt
│ └── src
│ ├── CMakeLists.txt
│ └── dsp-hello-world.c
└── mcom03-defconfig-src
├── buildroot
│ └── output
│ └── target
│ └── usr
│ └── share
│ └── elcore50
│ └── dsp-hello-world.elf
└── external-elcore50
├── Config.in
└── package
└── dsp-hello-world
├── Config.in
└── dsp-hello-world.mk
где полный путь до директории mcom03-defconfig-src равен переменной $BUILDROOT_SRC_DIR.
Создать в директории src файл
CMakeLists.txt
:cmake_minimum_required(VERSION 3.10) project(dsp-hello-world.elf C) find_package(ElcoreRuntime REQUIRED) add_executable(${PROJECT_NAME} dsp-hello-world.c) target_link_libraries(${PROJECT_NAME} PRIVATE elcore-runtime) target_compile_options(${PROJECT_NAME} PRIVATE -O3) install(TARGETS ${PROJECT_NAME} DESTINATION .)
Создать в корневой рабочей директории файл
CMakeLists.txt
:cmake_minimum_required(VERSION 3.10) find_package(ElcoreRuntime REQUIRED) find_package(ElcoreCL REQUIRED) # for elcoreproject_add() elcoreproject_add(DSP_HELLO_WORLD src CMAKE_ARGS -DElcoreRuntime_DIR=${ElcoreRuntime_DIR}) install(FILES ${DSP_HELLO_WORLD_DIR}/dsp-hello-world.elf DESTINATION share/elcore50)
Примечание
Данный корневой CMake-файл использует
elcoreproject_add()
для подключения DSP проекта какExternalProject
. Функцияelcoreproject_add()
становится доступной после подключения пакета elcorecl, используя функциюfind_package()
.Создать пакет Buildroot для сборки DSP-кернела:
Внутри директории
$BUILDROOT_SRC_DIR/external-elcore50/package
создать директориюdsp-hello-world
.Внутри директории
dsp-hello-world
создать файлConfig.in
:config BR2_PACKAGE_DSP_HELLO_WORLD bool "dsp-hello-world" select BR2_PACKAGE_ELCORECL help DSP Hello World application to be run via elcorecl-run
Внутри директории
dsp-hello-world
создать файлdsp-hello-world.mk
:################################################################################ # # dsp-hello-world # ################################################################################ DSP_HELLO_WORLD_SITE = </path/to/project/directory> DSP_HELLO_WORLD_SITE_METHOD = local DSP_HELLO_WORLD_DEPENDENCIES = elcorecl host-toolchain-elcore50 DSP_HELLO_WORLD_CONF_OPTS += -DELCORE_CMAKE_TOOLCHAIN_FILE=$(TOOLCHAIN_ELCORE50_TOOLCHAIN_FILE) $(eval $(cmake-package))
В файле
dsp-hello-world.mk
указать путь до рабочей директории с проектом в переменнойDSP_HELLO_WORLD_SITE
.В файле
$BUILDROOT_SRC_DIR/external-elcore50/Config.in
добавить строчку:source "$BR2_EXTERNAL_ELCORE50_PATH/package/dsp-hello-world/Config.in"
Примечание
Подробную информацию про пакетирование в Buildroot см. на странице Adding new packages to Buildroot.
Выполнить в корневой директории Buildroot
$BUILDROOT_SRC_DIR
:make dsp-hello-world
В случае успешного выполнения команды в директории
$BUILDROOT_SRC_DIR/buildroot/output/build/target/usr/share/elcore50
появится ELF-файлdsp-hello-world.elf
, готовый к запуску на отладочном модуле.
Запуск DSP-кернела
Загрузить ОС на отладочном модуле.
Скопировать ELF-файл
dsp-hello-world.elf
на отладочном модуле (например, в директорию/root/
).Запустить DSP-кернел с помощью утилиты elcorecl-run:
elcorecl-run -e /root/dsp-hello-world.elf --core=0