jeśli chcesz hostować repozytorium w organizacji OpenThread, możesz opublikować problem , aby poprosić o nowe repozytorium dla platformy lub poprosić o dodanie rozwidlenia istniejącego repozytorium.
W tym przykładzie utworzyliśmy repozytorium SiliconLabs/ot-efr32 na GitHubie i sklonowaliśmy je do ~/repos/ot-efr32
.
mkdir -p ~/repos
cd ~/repos
git clone git@github.com:SiliconLabs/ot-efr32.git
Cloning 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 status
On branch main
Your branch is up to date with 'origin/main'.
nothing to commit, working tree clean
Struktura repozytorium
Aby zapewnić spójność z istniejącymi repozytoriami platform należącymi do organizacji OpenThread GitHub, możesz zastosować taką strukturę repozytorium:
tree -F -L 1 --dirsfirst
.
├── examples/
├── openthread/
├── script/
├── src/
├── third_party/
├── CMakeLists.txt
├── LICENSE
└── README.md
Folder
Opis
examples
opcjonalne przykładowe aplikacje.
openthread
Repozytorium openthread
jako moduł podrzędny
script
Skrypty do tworzenia, testowania i linowania
src
Implementacja z warstwą abstrakcji platformy
third_party
Lokalizacja wszelkich źródeł zewnętrznych
Dodaj moduły podrzędne
Następnym krokiem jest dodanie openthread
i innych wymaganych repozytoriów jako podmodułów
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.
Uwaga: w katalogu third_party
należy umieścić dowolny nieoryginalny kod pochodny (np. skrypt łączący lub kod uruchamiający łańcuch narzędzi).
W tym przykładzie dodamy Lite w wersji uproszczonej pakietu Silicon Labs Gecko SDK w third_party
.
cd third_party
git submodule add git@github.com:SiliconLabs/sdk_support.git
Cloning 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 częstych zadań, możesz utworzyć skrypty w folderze script
. Może to obejmować skrypty do wykonywania takich zadań jak rozruch, tworzenie i uruchamianie linowego kodu oraz skrypt testowy na GitHubie CI.
Poniżej znajdziesz kilka przykładowych skryptów, które są standardem w większości istniejących repozytoriów platform.
bootstrap
Ten skrypt powinien zainstalować wszystkie narzędzia i pakiety wymagane przez platformę sprzętową. Powinien także wykonać skrypt rozruchowy openthread
, aby upewnić się, że użytkownik ma wszystko, czego potrzebuje do utworzenia stosu OpenThread.
Przykład znajdziesz w skrypcie programu rozruchowego w ot-efr32
.
build
Skrypt kompilacji CMake powinien umożliwiać użytkownikom tworzenie stosu OpenThread na platformie. Jeśli repozytorium określa jakiekolwiek przykładowe aplikacje, ten skrypt też powinien je tworzyć. Ten skrypt powinien zawierać podstawowe opcje konfiguracji systemu, w tym wszelkie definicje makr dla danej platformy.
Przykład znajdziesz w skrypcie kompilacji w ot-efr32
.
test
Skrypt testowy może być przydatny dla użytkowników do testowania zmian za pomocą zdefiniowanych przez Ciebie testów. Może to być dowolny test, np. uruchamianie kompilacji z rozwagą i skomplikowanie, na przykład uruchomienie pakietu testów jednostkowych.
W ot-efr32
skrypt po prostu wykonuje skrypt build
na każdej obsługiwanej tablicy na każdej platformie Efr32.
Przykład możesz znaleźć w skrypcie testowym w ot-efr32
.
Uwaga: ten skrypt jest opcjonalny, ale niektóre z repozytoriów platformy, w tym ot-efr32
, mogą być używane w ramach kontroli CI na GitHubie , którą można skonfigurować tak, aby brami przechwytywały żądania pull do main
. Przykład: ot-efr32#35
make-pretty
Aby zachować spójny styl, powinien on być sformatowany za pomocą kodu, skryptów i znaczników.
Możesz zdefiniować ten skrypt samodzielnie, ale najprościej jest użyć skryptu make-pretty
używanego przez istniejące repozytoria platformy. Skrypt wywołuje skrypty stylu openthread
, aby zapewnić spójny styl we wszystkich repozytoriach OpenThread.
Uwaga: jeśli w przyszłości zamierzasz hostować repozytorium w organizacji OpenThread, musisz użyć tego skryptu, aby bramować żądania pull do gałęzi main
. Przykład takiej kontroli CI znajdziesz tutaj .
Konfiguracja skryptu łączącego
Skrypt GNU Linker opisuje sposób mapowania wszystkich sekcji w plikach wejściowych (pliki „.o
” obiektu wygenerowane przez GNU Compiler Collection (GCC)) na końcowy plik wyjściowy (na przykład .elf
). Określa również lokalizację przechowywania każdego segmentu programu wykonywalnego, a także adres wpisu. Skrypt łączący usługę platformy jest często udostępniany za pomocą BSP.
Skonfiguruj narzędzie ld
tak, aby wskazywało na konkretny skrypt łączący za pomocą platformy, za pomocą celu target_link_libraries
utworzonego w platformie src/CMakeLists.txt
: CMake platformy:
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
)
Często uruchamiany jest kod startowy łańcucha narzędzi razem z BSP platformy. Zwykle ten kod:
Implementuje funkcję wprowadzania (Reset_Handler
) programu wykonywalnego
Określa tabelę wektorów przerw
Inicjuje stertę i stos
Kopiuje sekcję .data
z pamięci niezmiennej do pamięci RAM
Przechodzi do głównej funkcji aplikacji w celu wykonania logiki aplikacji
Kod uruchamiania (C lub kod źródłowy zestawu) musi być zawarty w bibliotece openthread-platform-name
na platformie. W przeciwnym razie niektóre kluczowe zmienne użyte w skrypcie tagu łączącego nie będą prawidłowo cytowane:
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
$
)