Быстрый старт

В данном руководстве описана пошаговая инструкция по разработке и запуску 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
  1. Создать в директории 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.

  2. Экспортировать переменную BUILDROOT_SRC_DIR, указав полный путь до Buildroot:

    export BUILDROOT_SRC_DIR=/path/to/buildroot
    
  3. В рабочей директории выполнить:

    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.

  1. Создать в директории 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 .)
    
  2. Создать в корневой рабочей директории файл 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().

  3. Создать пакет Buildroot для сборки DSP-кернела:

    1. Внутри директории $BUILDROOT_SRC_DIR/external-elcore50/package создать директорию dsp-hello-world.

    2. Внутри директории 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
      
    3. Внутри директории 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))
      
    4. В файле dsp-hello-world.mk указать путь до рабочей директории с проектом в переменной DSP_HELLO_WORLD_SITE.

    5. В файле $BUILDROOT_SRC_DIR/external-elcore50/Config.in добавить строчку:

      source "$BR2_EXTERNAL_ELCORE50_PATH/package/dsp-hello-world/Config.in"
      

    Примечание

    Подробную информацию про пакетирование в Buildroot см. на странице Adding new packages to Buildroot.

  4. Выполнить в корневой директории Buildroot $BUILDROOT_SRC_DIR:

    make dsp-hello-world
    

    В случае успешного выполнения команды в директории $BUILDROOT_SRC_DIR/buildroot/output/build/target/usr/share/elcore50 появится ELF-файл dsp-hello-world.elf, готовый к запуску на отладочном модуле.

Запуск DSP-кернела

  1. Загрузить ОС на отладочном модуле.

  2. Скопировать ELF-файл dsp-hello-world.elf на отладочном модуле (например, в директорию /root/).

  3. Запустить DSP-кернел с помощью утилиты elcorecl-run:

    elcorecl-run -e /root/dsp-hello-world.elf --core=0