Компоненты и sf-pkg¶
В проектах SiFli часто используются промежуточное ПО, драйверы и компоненты, которые можно применять повторно. Когда проект выходит за рамки простого копирования примера, экосистема пакетов и компонентов SiFli позволяет публиковать и сопровождать такие блоки прошивки.
Когда выделять код в компонент¶
Оформляйте код в виде компонента, если его планируется использовать в нескольких продуктах или примерах:
- Драйверы периферии.
- Поддержка дисплейных панелей.
- Службы Bluetooth.
- Элементы графического интерфейса.
- Адаптеры датчиков.
- Вспомогательные средства для хранения данных.
- Промежуточное ПО продукта.
Оставляйте прикладную логику, нужную только одному проекту, в этом проекте, пока её интерфейс не стабилизируется и она не понадобится нескольким пользователям.
Практический порядок работы¶
- Возьмите за основу работающий пример SDK.
- Определите, какую часть следует сделать повторно используемой.
- Выделите эту функциональность и предоставьте её через компактный API с чётко ограниченной областью ответственности.
- Добавьте настройку через стандартный механизм сборки и конфигурации SDK.
- Опишите зависимости, расход памяти и необходимые периферийные устройства.
- Только после этого упакуйте код в повторно используемый компонент.
Распространение компонентов через 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 и буферам. |
| Выпускать компонент без примера. | Добавляйте минимальный пример интеграции. |
Последнее обновление: