Configurar o ambiente de build

Veja o código-fonte no GitHub

Para promover o desenvolvimento sem custo financeiro e aberto, o OpenThread usa o CMake na o conjunto de ferramentas de build. No momento, esse conjunto de ferramentas é necessário para fazer a portabilidade OpenThread para uma nova plataforma de hardware.

Outros conjuntos de ferramentas de compilação podem receber suporte no futuro, mas não estão incluídos o escopo deste guia de portabilidade.

Criar um novo repositório

A primeira etapa é configurar uma nova página inicial para sua plataforma de hardware. Neste guia, criaremos um novo repositório chamado ot-efr32, que contém a camada de abstração da plataforma, o SDK da plataforma de hardware e alguns scripts úteis.

Neste exemplo, criamos o repositório SiliconLabs/ot-efr32 no GitHub e o clonamos em ~/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

Estrutura do repositório

Para ajudar a manter a consistência com os repositórios atuais da plataforma (link em inglês) na organização OpenThread GitHub, recomendamos estruturar seu repositório da seguinte maneira:

tree -F -L 1 --dirsfirst
.
├── examples/
├── openthread/
├── script/
├── src/
├── third_party/
├── CMakeLists.txt
├── LICENSE
└── README.md
Pasta Descrição
examples Exemplos de aplicativos opcionais
openthread O repositório openthread como um submódulo
script Scripts para criar, testar e inspecionar
src Implementação da camada de abstração da plataforma
third_party Localização de fontes de terceiros

Adicionar submódulos

A próxima etapa é adicionar openthread e qualquer outro repositório necessário como submódulos.

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.

Neste exemplo, vamos adicionar uma versão Lite do SDK do Silicon Labs Gecko como um submódulo em 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.

Scripts

Para facilitar tarefas comuns, você pode criar alguns scripts na pasta script. Isso pode incluir scripts para tarefas como bootstraping, criação e execução de um linter de código e um script de teste para verificações de CI do GitHub.

Abaixo estão alguns exemplos de scripts que são padrão para a maioria dos repositórios de plataforma existentes.

bootstrap

Esse script instala todas as ferramentas e pacotes exigidos pela plataforma de hardware. Ela também precisa executar o script de inicialização do openthread para garantir que o usuário tenha tudo o que é necessário para criar a pilha do OpenThread.

Consulte o script de inicialização em ot-efr32 (link em inglês) para ver um exemplo.

build

O script de build do CMake precisa permitir que os usuários criem a pilha do OpenThread para sua plataforma. Se o repositório definir aplicativos de exemplo, o script vai criá-los também. Esse script deve conter as opções básicas de configuração do sistema, incluindo quaisquer definições de macro específicas da plataforma.

Consulte o script de build em ot-efr32 (link em inglês) para conferir um exemplo.

test

Um script de teste pode ser útil para que os usuários testem as alterações usando qualquer teste que você tenha definido. Isso pode ser algo simples, como executar builds de verificação de integridade ou tão complicado quanto iniciar um pacote de teste de unidade.

No ot-efr32, o script simplesmente executa o script build para cada placa compatível em cada uma das plataformas efr32.

Consulte o script de teste em ot-efr32 para ver um exemplo.

make-pretty

Para manter um estilo consistente, ele precisa formatar códigos, scripts e arquivos de marcação.

Você pode definir esse script por conta própria, mas pode ser mais fácil usar o script make-pretty que os repositórios da plataforma atuais estão usando. O script chama os scripts de estilo do openthread e ajuda a garantir um estilo consistente em todos os repositórios do OpenThread.

Configuração do script do vinculador

O script do GNU Linker descreve como mapear todas as seções nos arquivos de entrada (arquivos de "objeto" .o gerado pelo GNU Compiler Collection (GCC) para o arquivo de saída final (por exemplo, .elf). Ele também determina o local de armazenamento de cada segmento de um programa executável e o endereço de entrada. O vinculador específico da plataforma script geralmente é fornecido com o BSP da plataforma.

Configure a ferramenta ld para apontar para o script do vinculador específico da plataforma usando target_link_libraries no destino do CMake da plataforma em 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
)

Código de inicialização do conjunto de ferramentas

O código de inicialização do conjunto de ferramentas geralmente é fornecido com o BSP da plataforma. Isso normalmente:

  1. Implementa a função de entrada (Reset_Handler) do programa executável
  2. Define a tabela de vetores de interrupção.
  3. Inicializa o heap e a pilha
  4. Copia a seção .data da memória não volátil para a RAM
  5. Pula para a função principal do aplicativo para executar a lógica dele

O código de inicialização (código-fonte C ou assembly) deve ser incluído no arquivo Biblioteca openthread-platform-name. Caso contrário, algumas variáveis importantes serão usadas no vinculador script não pode ser citado corretamente:

  • src/CMakeLists.txt

Exemplo: startup-gcc.c em ot-cc2538: src/CMakeLists.txt

add_library(openthread-cc2538
    alarm.c
...
    startup-gcc.c
...
    system.c
    logging.c
    uart.c
    $
)