Configure o ambiente de build

Veja o código-fonte no GitHub

Para promover o desenvolvimento aberto e sem custos financeiros, o OpenThread usa CMake no conjunto de ferramentas de build. Atualmente, esse conjunto de ferramentas é necessário para portar o OpenThread para uma nova plataforma de hardware.

Outros conjuntos de ferramentas de build podem ser compatíveis no futuro, mas não estão no escopo deste guia de portabilidade.

Crie um novo repositório

A primeira etapa é configurar um novo lar para sua plataforma de hardware. Neste guia, vamos criar 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 como ~/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 de plataforma atuais na organização do GitHub no OpenThread, é recomendável estruturar seu repositório desta forma:

tree -F -L 1 --dirsfirst
.
├── examples/
├── openthread/
├── script/
├── src/
├── third_party/
├── CMakeLists.txt
├── LICENSE
└── README.md
Pasta Descrição
examples Aplicativos de exemplo opcionais
openthread O repositório openthread como um submódulo
script Scripts para criação, teste e inspeção
src Implementação da camada de abstração da plataforma
third_party Local de qualquer fonte de terceiros

Adicionar submódulos

A próxima etapa é adicionar openthread e outros repositórios necessários 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.

Para este exemplo, vamos adicionar uma versão leve do SDK da Gecko do Silicon Labs 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, é possível criar alguns scripts na pasta script. Isso pode incluir scripts para tarefas como inicialização, criação, execução de um linter de código e um script de teste para verificações de CI do GitHub.

Veja abaixo alguns exemplos de scripts padrão para a maioria dos repositórios de plataforma existentes.

bootstrap

Esse script precisa instalar todos os pacotes e ferramentas exigidos pela plataforma do seu hardware. Ele 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 bootstrap em ot-efr32 para ver um exemplo.

build

O script de compilação do CMake precisa permitir que os usuários criem a pilha do OpenThread para sua plataforma. Se o repositório definir algum exemplo de aplicativo, esse script também deverá criá-los. 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 para ver um exemplo.

test

Um script de teste pode ser útil para testar alterações usando qualquer teste definido por você. Isso pode ser tão simples quanto executar builds de verificação de integridade ou tão complicado quanto lançar um pacote de teste de unidade.

Em 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, esse script precisa formatar arquivos de código, scripts e 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 de 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 OpenThread.

Configuração do script do vinculador

O script GNU Linker descreve como mapear todas as seções nos arquivos de entrada (arquivos "objeto" .o gerados pelo Coleção de GNU Compiler (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, bem como o endereço de entrada. O script do vinculador específico da plataforma 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 a BSP da plataforma. Esse código 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 a pilha 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 ou código-fonte de montagem) precisa ser incluído na biblioteca openthread-platform-name da sua plataforma. Caso contrário, algumas variáveis principais usadas no script do vinculador não podem ser citadas corretamente:

  • src/CMakeLists.txt

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

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