Aby promować bezpłatne i otwarte programowanie, OpenThread korzysta z narzędzia CMake w łańcuchu narzędzi do tworzenia. Obecnie ten łańcuch narzędzi jest wymagany do przenoszenia OpenThread na nową platformę sprzętową.
Inne łańcuchy narzędzi do tworzenia mogą być obsługiwane w przyszłości, ale nie są dostępne w tych łańcuchach tego przewodnika.
Utwórz nowe
Pierwszym krokiem jest skonfigurowanie nowej strony głównej dla platformy sprzętowej. W tym przewodniku utworzymy nowe repozytorium o nazwie ot-efr32, które będzie zawierać warstwę abstrakcji platformy, pakiet SDK platformy sprzętowej i kilka przydatnych skryptów.
W tym przykładzie utworzyliśmy repozytorium SiliconLabs/ot-efr32 na GitHubie i sklonowaliśmy je do folderu ~/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
Struktura repozytorium
Aby zachować spójność z istniejącymi repozytoriami platformy w organizacji OpenThread na GitHubie, warto zastosować taką strukturę repozytorium:
tree -F -L 1 --dirsfirst
.
├── examples/
├── openthread/
├── script/
├── src/
├── third_party/
├── CMakeLists.txt
├── LICENSE
└── README.md
| Folder | Opis |
|---|---|
examples |
optional Przykładowe aplikacje |
openthread |
Repozytorium openthread jako moduł podrzędny |
script |
Skrypty do tworzenia, testowania i lintowania |
src |
Implementacja warstwy abstrakcji platformy |
third_party |
Lokalizacja wszystkich źródeł zewnętrznych |
Dodaj moduły podrzędne
Następnym krokiem jest dodanie openthread i innych wymaganych repozytoriów jako modułów podrzędnych.
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.
W tym przykładzie dodamy do third_party jako moduł podrzędny pakietu SDK Silicon Labs Gecko w wersji uproszczonej.
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.
Skrypty
Aby ułatwić sobie wykonywanie typowych zadań, możesz utworzyć skrypty w folderze script. Może to obejmować skrypty do zadań takich jak wczytywanie, kompilowanie i uruchamianie lintera oraz skrypt testowy kontroli CI na GitHubie.
Poniżej znajdziesz kilka przykładów skryptów, które są standardem w większości istniejących repozytoriów platformy.
bootstrap
Skrypt ten powinien zainstalować wszystkie narzędzia i pakiety wymagane przez daną platformę sprzętową. Powinien również wykonać skrypt wczytywania platformy openthread, aby mieć pewność, że użytkownik ma wszystko, co jest potrzebne do utworzenia stosu OpenThread.
Przykład znajdziesz w skrypcie Boottrap w ot-efr32.
build
Skrypt kompilacji CMake powinien umożliwiać użytkownikom utworzenie stosu OpenThread dla Twojej platformy. Jeśli w Twoim repozytorium są zdefiniowane przykładowe aplikacje, ten skrypt też powinien je utworzyć. Skrypt ten powinien zawierać podstawowe opcje konfiguracji systemu, w tym wszelkie definicje makr związanych z daną platformą.
Przykład znajdziesz w skrypcie kompilacji w ot-efr32.
test
Skrypt testowy może być przydatny dla użytkowników w celu przetestowania zmian za pomocą zdefiniowanych przez Ciebie testów. Może to być coś prostego, jak uruchamianie kompilacji pod kątem poprawności, albo tak skomplikowanego jak uruchamianie pakietu do testów jednostkowych.
W ot-efr32 skrypt po prostu wykonuje skrypt build dla każdej obsługiwanej płytki na każdej z platform efr32.
Przykład znajdziesz w skrypcie testowym w ot-efr32.
make-pretty
Aby zachować spójny styl, ten skrypt powinien formatować kod, skrypty i pliki Markdown.
Możesz zdefiniować ten skrypt samodzielnie, ale najłatwiejszym będzie użycie skryptu make-pretty, z którego korzystają istniejące repozytoria platformy. Skrypt wywołuje skrypty stylu openthread i pomaga zapewnić spójny styl we wszystkich repozytoriach OpenThread.
Konfiguracja skryptu łączącego
skrypt GNU Linker,
opisuje, jak zmapować wszystkie sekcje w plikach wejściowych (pliki „object”: .o
wygenerowanych przez narzędzie GNU Compiler Collection (GCC) do ostatecznego pliku wyjściowego (dla
np. .elf). Określa też lokalizację przechowywania każdego segmentu pliku danych
programu wykonywalnego oraz adresu wejściowego. Łącznik związany z konkretną platformą
często jest dostarczany w BSP platformy.
Skonfiguruj narzędzie ld tak, aby wskazywało skrypt łączący właściwy dla danej platformy za pomocą
target_link_libraries na Twojej platformie docelowej w 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
)
Kod uruchamiania łańcucha narzędzi
Kod startowy łańcucha narzędzi jest często dostarczany wraz z pakietem BSP platformy. Ten zwykle:
- Implementuje funkcję wpisu (
Reset_Handler) programu wykonywalnego - Definiuje tabelę wektorów przerwania
- Inicjuje stertę i stos
- Kopiuje sekcję
.dataz pamięci nieulotnej do pamięci RAM - Przechodzi do głównej funkcji aplikacji, aby wykonać logikę aplikacji
Kod startowy (kod źródłowy C lub asemblera) musi być zawarty w kodzie Twojej platformy.
biblioteka openthread-platform-name, w przeciwnym razie używane są niektóre kluczowe zmienne w tagu łączącym
nie można poprawnie zacytować skryptu:
src/CMakeLists.txt
Przykład: startup-gcc.c w ot-cc2538 – src/CMakeLists.txt
add_library(openthread-cc2538
alarm.c
...
startup-gcc.c
...
system.c
logging.c
uart.c
$
)