Перейти к содержанию

Компоненты и sf-pkg

В проектах SiFli часто используются промежуточное ПО, драйверы и компоненты, которые можно применять повторно. Когда проект выходит за рамки простого копирования примера, экосистема пакетов и компонентов SiFli позволяет публиковать и сопровождать такие блоки прошивки.

Когда выделять код в компонент

Оформляйте код в виде компонента, если его планируется использовать в нескольких продуктах или примерах:

  • Драйверы периферии.
  • Поддержка дисплейных панелей.
  • Службы Bluetooth.
  • Элементы графического интерфейса.
  • Адаптеры датчиков.
  • Вспомогательные средства для хранения данных.
  • Промежуточное ПО продукта.

Оставляйте прикладную логику, нужную только одному проекту, в этом проекте, пока её интерфейс не стабилизируется и она не понадобится нескольким пользователям.

Практический порядок работы

  1. Возьмите за основу работающий пример SDK.
  2. Определите, какую часть следует сделать повторно используемой.
  3. Выделите эту функциональность и предоставьте её через компактный API с чётко ограниченной областью ответственности.
  4. Добавьте настройку через стандартный механизм сборки и конфигурации SDK.
  5. Опишите зависимости, расход памяти и необходимые периферийные устройства.
  6. Только после этого упакуйте код в повторно используемый компонент.

Распространение компонентов через sf-pkg

Компонент — это повторно используемый программный модуль. Реестр компонентов SiFli основан на Conan; текущая подкоманда SDK называется sf-pkg.

Чтобы подключить пакет, выполните sdk.py sf-pkg init в каталоге project проекта SDK; команда создаст conanfile.py. Добавьте ссылки в поле requires в формате package/version@<username>, где username — имя пользователя в реестре пакетов. Затем выполните sdk.py sf-pkg install в том же каталоге. Установленные пакеты размещаются в project/sf-pkgs; их файлы Kconfig подключаются к menuconfig в разделе SiFli External Components.

Чтобы опубликовать компонент, выполните в его каталоге sdk.py sf-pkg new --name <package_name> и проверьте созданный файл conanfile.py. При создании можно добавить --support-sdk-version <sdk_version_range>, чтобы задать диапазон совместимых версий. Независимо от использования этого параметра убедитесь, что в рецепте в support_sdk_version указан нужный диапазон версий SDK; при необходимости скорректируйте его. Выберите версию пакета по правилам семантического версионирования и заполните метаданные и зависимости. После аутентификации в реестре соберите пакет и отправьте его в реестр:

sdk.py sf-pkg build --version <version>
sdk.py sf-pkg upload --name <package_name>/<version>@<username>

Точная последовательность действий может зависеть от версии SDK. Порядок настройки, аутентификацию и команды для конкретных версий см. в руководствах SiFli по подключению пакетов (на китайском), созданию и публикации пакетов (на английском) и китайской версии руководства.

Критерии качества компонента

Компонент готов к совместному использованию, если он:

  • собирается из чистой копии репозитория, а требования к среде и зависимостям задокументированы;
  • содержит минимальный пример;
  • документирует обязательные настройки;
  • не опирается на неявные предположения о плате;
  • ясно сообщает об ошибках;
  • документирует использование глобальных ресурсов, включая правила владения и освобождения;
  • описывает правила для потоков, обратных вызовов и владения памятью.

Что необходимо документировать

Для каждого повторно используемого компонента укажите:

  • Поддерживаемые микросхемы и платы.
  • Требуемую версию SDK.
  • Необходимую периферию и выводы.
  • Требуемые настройки RTOS и промежуточного ПО.
  • Поведение потоков и обратных вызовов.
  • Ожидаемый расход RAM, Flash и стека.
  • Путь к проекту-примеру.

Чего следует избегать

Таблица: Чего следует избегать
Ошибка Как лучше поступить
Копировать целый пример в каждый продукт. Выделяйте только стабильный повторно используемый слой.
Зашивать имена выводов в код компонента. Передавайте ресурсы платы через конфигурацию.
Считать, что существует только один путь вывода изображения или звука. Документируйте поддерживаемые варианты аппаратной реализации.
Не учитывать расход памяти. Фиксируйте требования к стеку, куче, DMA и буферам.
Выпускать компонент без примера. Добавляйте минимальный пример интеграции.

Последнее обновление: