|
Para promover el desarrollo libre y abierto, OpenThread usa GNU Autotools en la cadena de herramientas de construcción. Actualmente, esta cadena de herramientas es necesaria para portar OpenThread a una nueva plataforma de hardware.
Es posible que en el futuro se admitan otras cadenas de herramientas de compilación, pero no están dentro del alcance de esta guía de migración.
GNU Autoconf
El script Autoconf contiene las opciones básicas de configuración del sistema, incluidas las definiciones de macro específicas relativas a la plataforma. Estas macros pueden exponerse para compilación condicional en otros Makefiles durante la fase de precompilación.
El script OpenThread Autoconf se encuentra en: /openthread/configure.ac
Nombre de ejemplo de plataforma
En la AC_ARG_WITH(examples ...)
, agregue el nombre del ejemplo de la nueva plataforma de hardware. El nombre debe agregarse en orden alfabético.
Ejemplo:
AC_ARG_WITH(examples, [AS_HELP_STRING([--with-examples=TARGET], [Specify the examples from one of: none, simulation, cc2538, cc2650, efr32, nrf52840 @<:@default=none@:>@.])], [ case "${with_examples}" in none) ;; simulation|cc2538|cc2650|efr32|nrf52840) if test ${enable_posix_app} = "yes"; then AC_MSG_ERROR([--with-examples must be none when POSIX apps are enabled by --enable-posix-app]) fi ;; *) AC_MSG_ERROR([Invalid value ${with_examples} for --with-examples]) ;; esac ], [with_examples=none])
Símbolo de preprocesador C específico de la plataforma
Defina un símbolo de preprocesador C específico de la plataforma para el ejemplo de plataforma y expóngalo.
El símbolo del preprocesador de C específico de la plataforma se expone en include/openthread-config.h
. Al incluir el símbolo en este archivo de encabezado, podemos aprovecharlo en nuestro código fuente para casos de compilación condicional del preprocesador.
Ejemplo:
case ${with_examples} in ... efr32) OPENTHREAD_EXAMPLES_EFR32=1 AC_DEFINE_UNQUOTED([OPENTHREAD_EXAMPLES_EFR32],[${OPENTHREAD_EXAMPLES_EFR32}],[Define to 1 if you want to use efr32 examples]) ;; ... esac ... AC_SUBST(OPENTHREAD_EXAMPLES_EFR32) AM_CONDITIONAL([OPENTHREAD_EXAMPLES_EFR32], [test "${OPENTHREAD_EXAMPLES}" = "efr32"])
Directorio de salida de Makefile
En la macro AC_CONFIG_FILES
, agregue un directorio de salida Makefile para el ejemplo de plataforma.
Ejemplo:
AC_CONFIG_FILES ([ examples/platforms/efr32/Makefile ])
GNU Automake
Cree y modifique archivos de Automake para admitir el ejemplo de la nueva plataforma.
Es necesario crear los siguientes archivos de Automake específicos de la plataforma:
-
/openthread/examples/Makefile- platform-name
-
/openthread/examples/platforms/ platform-name /Makefile.am
-
/openthread/examples/platforms/ platform-name /Makefile.platform.am
Consulte /examples
para ver /examples
de implementaciones de estos archivos.
Los siguientes archivos de Automake también deben actualizarse con la información de su plataforma:
Configuración del script del vinculador
El script GNU Linker describe cómo mapear todas las secciones en los archivos de entrada ( .o
archivos "objeto" generados por la Colección de compiladores 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. El script del enlazador específico de la plataforma a menudo se proporciona con el BSP de la plataforma.
Configure la herramienta ld
para que apunte al script del vinculador específico de la plataforma mediante la opción -T
de la variable LDADD_COMMON
.
Cree /openthread/examples/platforms/ platform-name /Makefile.platform.am
y apunte la nueva plataforma a su script de enlace:
if OPENTHREAD_EXAMPLES_EFR32 LDADD_COMMON += \ $(top_builddir)/examples/platforms/efr32/libopenthread-efr32.a \ $(top_srcdir)/third_party/silabs/gecko_sdk_suite/v1.0/platform/radio/rail_lib/autogen/librail_release/librail_efr32xg12_gcc_release.a \ $(NULL) LDFLAGS_COMMON += \ -T $(top_srcdir)/third_party/silabs/gecko_sdk_suite/v1.0/platform/Device/SiliconLabs/EFR32MG12P/Source/GCC/efr32mg12p.ld \ $(NULL) endif # OPENTHREAD_EXAMPLES_EFR32
Agregue la configuración del script del enlazador de la plataforma a la utilidad /openthread/examples/platforms/Makefile.platform.am
Makefile:
if OPENTHREAD_EXAMPLES_EFR32 include $(top_srcdir)/examples/platforms/efr32/Makefile.platform.am endif
Configuración de subdirectorio
Modifique /openthread/examples/platforms/Makefile.am
para configurar los subdirectorios del paquete para el ejemplo de la nueva plataforma.
Agregue el nombre del subdirectorio de la plataforma en la lista de make dist
, en orden alfabético:
# Always package (e.g. for 'make dist') these subdirectories. DIST_SUBDIRS = \ cc2538 \ cc2650 \ efr32 \ nrf52840 \ simulation \ utils \ $(NULL)
SUBDIRS
el nombre del subdirectorio de la plataforma a la variable SUBDIRS
:
# Always build (e.g. for 'make all') these subdirectories. if OPENTHREAD_EXAMPLES_EFR32 SUBDIRS += efr32 endif
Código de inicio de la cadena de herramientas
El código de inicio de la cadena de herramientas a menudo se proporciona junto con el BSP de la plataforma. Este código normalmente:
- Implementa la función de entrada (
Reset_Handler
) del programa ejecutable - Define la tabla de vectores de interrupción
- Inicializa el montón y la pila
- Copia la sección
.data
de la memoria no volátil a la RAM - 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 o código fuente ensamblador) debe agregarse al Makefile.am
específico de la plataforma; de lo contrario, algunas variables clave utilizadas en el script del vinculador no se pueden citar correctamente:
-
/openthread/examples/platforms/ platform-name /Makefile.am
Ejemplo:
libopenthread_efr32_a_SOURCES = \ @top_builddir@/third_party/silabs/gecko_sdk_suite/v1.0/hardware/kit/common/bsp/bsp_bcc.c \ @top_builddir@/third_party/silabs/gecko_sdk_suite/v1.0/hardware/kit/common/bsp/bsp_stk.c \ @top_builddir@/third_party/silabs/gecko_sdk_suite/v1.0/platform/Device/SiliconLabs/EFR32MG12P/Source/system_efr32mg12p.c \ @top_builddir@/third_party/silabs/gecko_sdk_suite/v1.0/platform/Device/SiliconLabs/EFR32MG12P/Source/GCC/startup_efr32mg12p.c \