Посмотреть исходный код на GitHub
Чтобы продвигать бесплатную и открытую разработку, OpenThread использует CMake в цепочке инструментов сборки. В настоящее время этот набор инструментов необходим для переноса OpenThread на новую аппаратную платформу.
В будущем могут поддерживаться и другие наборы инструментов сборки, но они не входят в сферу применения данного руководства по портированию.
Создать новый репозиторий
Первым шагом является настройка нового дома для вашей аппаратной платформы. В этом руководстве мы создадим новый репозиторий с именем ot-efr32 , который будет содержать уровень абстракции платформы, SDK аппаратной платформы и несколько полезных скриптов.
В этом примере мы создали репозиторий SiliconLabs/ot-efr32 на GitHub и клонировали его в ~/repos/ot-efr32 .
mkdir -p ~/reposcd ~/reposgit clone git@github.com:SiliconLabs/ot-efr32.gitCloning into 'ot-efr32'... remote: Enumerating objects: 99, done. remote: Counting objects: 100% (99/99), done. remote: Compressing objects: 100% (60/60), done. remote: Total 333 (delta 65), reused 39 (delta 39), pack-reused 234 Receiving objects: 100% (333/333), 170.78 KiB | 5.69 MiB/s, done. Resolving deltas: 100% (194/194), done.git statusOn branch main Your branch is up to date with 'origin/main'. nothing to commit, working tree clean
Структура репозитория
Чтобы обеспечить согласованность с существующими репозиториями платформы в организации OpenThread GitHub, вы можете структурировать свой репозиторий следующим образом:
tree -F -L 1 --dirsfirst
.
├── examples/
├── openthread/
├── script/
├── src/
├── third_party/
├── CMakeLists.txt
├── LICENSE
└── README.md
| Папка | Описание |
|---|---|
examples | дополнительные примеры приложений |
openthread | Репозиторий openthread как подмодуль |
script | Скрипты для сборки, тестирования, линтинга |
src | Реализация уровня абстракции платформы |
third_party | Расположение любых сторонних источников |
Добавить подмодули
Следующим шагом будет добавление openthread и любых других необходимых репозиториев в качестве подмодулей.
git submodule add git@github.com:openthread/openthread.git
Cloning into '/home/user/repos/ot-efr32/openthread'...
remote: Enumerating objects: 78281, done.
remote: Counting objects: 100% (1056/1056), done.
remote: Compressing objects: 100% (488/488), done.
remote: Total 78281 (delta 639), reused 864 (delta 556), pack-reused 77225
Receiving objects: 100% (78281/78281), 76.62 MiB | 35.24 MiB/s, done.
Resolving deltas: 100% (61292/61292), done.
В этом примере мы добавим облегченную версию Silicon Labs Gecko SDK в качестве подмодуля в third_party .
cd third_partygit submodule add git@github.com:SiliconLabs/sdk_support.gitCloning into '/home/user/repos/ot-efr32/third_party/sdk_support'... remote: Enumerating objects: 32867, done. remote: Counting objects: 100% (8181/8181), done. remote: Compressing objects: 100% (3098/3098), done. remote: Total 32867 (delta 4945), reused 7469 (delta 4732), pack-reused 24686 Receiving objects: 100% (32867/32867), 128.83 MiB | 30.91 MiB/s, done. Resolving deltas: 100% (19797/19797), done.
Скрипты
Чтобы упростить выполнение общих задач, вы можете создать несколько сценариев в папке script . Сюда могут входить сценарии для таких задач, как загрузка, сборка, запуск линтера кода, а также тестовый сценарий для проверок GitHub CI.
Ниже приведены примеры скриптов, которые являются стандартными для большинства существующих репозиториев платформы.
bootstrap
Этот скрипт должен установить все инструменты и пакеты, необходимые вашей аппаратной платформе. Он также должен выполнить сценарий начальной загрузки openthread , чтобы гарантировать, что у пользователя есть все необходимое для построения стека OpenThread.
См. пример сценария начальной загрузки в ot-efr32 .
build
Сценарий сборки CMake должен позволять пользователям создавать стек OpenThread для вашей платформы. Если в вашем репозитории определены какие-либо примеры приложений, этот сценарий также должен их создать. Этот сценарий должен содержать основные параметры конфигурации системы, включая любые определения макросов для конкретной платформы.
Пример см. в сценарии сборки в ot-efr32 .
test
Тестовый сценарий может быть полезен пользователям для проверки изменений с помощью любых определенных вами тестов. Это может быть что угодно: простое выполнение сборок для проверки работоспособности или такое же сложное, как запуск набора модульных тестов.
В ot-efr32 сценарий просто выполняет сценарий build для каждой поддерживаемой платы на каждой из платформ efr32.
Пример см. в тестовом сценарии в ot-efr32 .
make-pretty
Для обеспечения единообразия стиля этот сценарий должен форматировать код, сценарии и файлы уценки.
Вы можете определить этот сценарий самостоятельно, но, возможно, проще всего использовать сценарий make-pretty , который используют существующие репозитории платформы. Скрипт вызывает сценарии стиля openthread и помогает обеспечить единообразный стиль во всех репозиториях OpenThread.
Конфигурация скрипта компоновщика
Сценарий GNU Linker описывает, как сопоставить все разделы входных файлов ( .o «объектных» файлов, созданных коллекцией компиляторов GNU (GCC)) с конечным выходным файлом (например, .elf ). Он также определяет место хранения каждого сегмента исполняемой программы, а также адрес входа. Сценарий компоновщика, специфичный для платформы, часто предоставляется вместе с BSP платформы.
Настройте инструмент ld так, чтобы он указывал на сценарий компоновщика для конкретной платформы, используя target_link_libraries на целевой платформе CMake в src/CMakeLists.txt :
set(LD_FILE "${CMAKE_CURRENT_SOURCE_DIR}/efr32mg12.ld")
target_link_libraries(openthread-efr32mg12
PRIVATE
ot-config
PUBLIC
-T${LD_FILE}
-Wl,--gc-sections -Wl,-Map=$.map
)
Код запуска цепочки инструментов
Код запуска Toolchain часто предоставляется вместе с BSP платформы. Обычно этот код:
- Реализует функцию входа (
Reset_Handler) исполняемой программы. - Определяет таблицу векторов прерываний
- Инициализирует кучу и стек
- Копирует раздел
.dataиз энергонезависимой памяти в ОЗУ. - Переход к основной функции приложения для выполнения логики приложения.
Код запуска (исходный код C или ассемблера) должен быть включен в библиотеку openthread- platform-name вашей платформы, в противном случае некоторые ключевые переменные, используемые в скрипте компоновщика, не могут быть правильно заключены в кавычки:
-
src/CMakeLists.txt
Пример : startup-gcc.c в ot-cc2538 — src/CMakeLists.txt
add_library(openthread-cc2538
alarm.c
...
startup-gcc.c
...
system.c
logging.c
uart.c
$
)
