Configura el entorno de compilación

Ver código fuente en GitHub

Para promover el desarrollo libre y abierto, OpenThread usa CMake en la cadena de herramientas de compilación. Actualmente, esta cadena de herramientas es obligatoria para portar OpenThread a una nueva plataforma de hardware.

Es posible que se admitan otras cadenas de herramientas de compilación en el futuro, pero no están dentro del alcance de esta guía de portabilidad.

Crea un repositorio nuevo

El primer paso es configurar una nueva casa para tu plataforma de hardware. En esta guía, crearemos un repositorio nuevo llamado ot-efr32 que contiene la capa de abstracción de la plataforma, el SDK de la plataforma de hardware y algunas secuencias de comandos útiles.

En este ejemplo, creamos el repositorio SiliconLabs/ot-efr32 en GitHub y lo clonamos en ~/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

Estructura del repositorio

Para mantener la coherencia con los repositorios de plataformas existentes en la organización de GitHub de OpenThread, te recomendamos que estructures tu repositorio de la siguiente manera:

tree -F -L 1 --dirsfirst
.
├── examples/
├── openthread/
├── script/
├── src/
├── third_party/
├── CMakeLists.txt
├── LICENSE
└── README.md
Carpeta Descripción
examples Ejemplos de aplicaciones opcionales
openthread El repositorio openthread como submódulo
script Secuencias de comandos para compilar, probar y lint
src Implementación de la capa de abstracción de la plataforma
third_party Ubicación de cualquier fuente de terceros

Agrega submódulos

El siguiente paso es agregar openthread y cualquier otro repositorio requerido 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.

En este ejemplo, agregaremos una versión lite del SDK de Gecko de Silicon Labs como un submódulo en 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.

Secuencias de comandos

Para facilitar las tareas comunes, te recomendamos que crees algunas secuencias de comandos en la carpeta script. Esto puede incluir secuencias de comandos para tareas como el inicio, la compilación, la ejecución de un lint de código y una secuencia de comandos de prueba para las verificaciones de CI de GitHub.

A continuación, se muestran algunos ejemplos de secuencias de comandos que son estándar para la mayoría de los repositorios de plataformas existentes.

bootstrap

Esta secuencia de comandos debe instalar todas las herramientas y paquetes que requiere tu plataforma de hardware. También debe ejecutar la secuencia de comandos de inicio de openthread para garantizar que el usuario tenga todo lo necesario para compilar la pila de OpenThread.

Consulta la secuencia de comandos de arranque en ot-efr32 para ver un ejemplo.

build

La secuencia de comandos de compilación de CMake debería permitir que los usuarios compilen la pila de OpenThread para tu plataforma. Si tu repositorio define aplicaciones de ejemplo, esta secuencia de comandos también debería compilarlas. Esta secuencia de comandos debe contener las opciones básicas de configuración del sistema, incluidas las definiciones de macros específicas de la plataforma.

Consulta la secuencia de comandos de compilación en ot-efr32 para ver un ejemplo.

test

Una secuencia de comandos de prueba puede ser útil para que los usuarios prueben los cambios con las pruebas que hayas definido. Esto puede ser tan simple como ejecutar compilaciones de verificación de coherencia o tan complicado como iniciar un paquete de pruebas de unidades.

En ot-efr32, la secuencia de comandos simplemente ejecuta la secuencia de comandos build para cada placa compatible en cada una de las plataformas efr32.

Consulta la secuencia de comandos de prueba en ot-efr32 para ver un ejemplo.

make-pretty

Para mantener un estilo coherente, esta secuencia de comandos debe dar formato al código, a las secuencias de comandos y a los archivos de Markdown.

Puedes definir esta secuencia de comandos por tu cuenta, pero puede ser más fácil usar la secuencia de comandos make-pretty que usan los repositorios de plataformas existentes. La secuencia de comandos llama a las secuencias de comandos de estilo de openthread y ayuda a garantizar un estilo coherente en todos los repositorios de OpenThread.

Configuración de la secuencia de comandos del vinculador

La secuencia de comandos del vinculador de GNU describe cómo asignar todas las secciones de los archivos de entrada (archivos “objeto” .o que genera la colección de compiladores de GNU (GCC)) al archivo de salida final (por ejemplo, .elf). También determina la ubicación de almacenamiento de cada segmento de un programa ejecutable, así como la dirección de entrada. A menudo, la secuencia de comandos del vinculador específico de la plataforma se proporciona con el BSP de la plataforma.

Configura la herramienta ld para que apunte a la secuencia de comandos del vinculador específica de la plataforma con target_link_libraries en el destino CMake de tu plataforma en 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 inicio de la cadena de herramientas

El código de inicio de la cadena de herramientas suele proporcionarse junto con el BSP de la plataforma. Por lo general, este código hace lo siguiente:

  1. Implementa la función de entrada (Reset_Handler) del programa ejecutable.
  2. Define la tabla de vectores de interrupción
  3. Inicializa el montón y la pila
  4. Copia la sección .data de la memoria no volátil a la RAM.
  5. Salta a la función principal de la aplicación para ejecutar la lógica de la aplicación.

El código de inicio (código fuente de C o ensamblado) se debe incluir en la biblioteca openthread-platform-name de tu plataforma. De lo contrario, algunas variables clave que se usan en la secuencia de comandos del vinculador no se pueden citar correctamente:

  • src/CMakeLists.txt

Ejemplo: startup-gcc.c en ot-cc2538: src/CMakeLists.txt

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