|
Pour promouvoir le développement libre et ouvert, OpenThread utilise GNU Autotools dans la chaîne d'outils de construction. Actuellement, cette chaîne d'outils est requise pour le portage d'OpenThread sur une nouvelle plate-forme matérielle.
D'autres chaînes d'outils de construction pourraient être prises en charge à l'avenir, mais elles n'entrent pas dans le cadre de ce guide de portage.
GNU Autoconf
Le script Autoconf contient les options de configuration système de base, y compris les définitions de macros spécifiques à la plate-forme. Ces macros peuvent être exposées pour la compilation conditionnelle dans d'autres Makefiles pendant la phase de pré-compilation.
Le script OpenThread Autoconf se trouve à: /openthread/configure.ac
Nom d'exemple de plateforme
Dans la AC_ARG_WITH(examples ...)
, ajoutez le nouveau nom d'exemple de plate-forme matérielle. Le nom doit être ajouté par ordre alphabétique.
Exemple:
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])
Symbole de préprocesseur C spécifique à la plate-forme
Définissez un symbole de préprocesseur C spécifique à la plateforme pour l'exemple de plateforme et exposez-le.
Le symbole de préprocesseur C spécifique à la plate-forme est exposé dans include/openthread-config.h
. En incluant le symbole dans ce fichier d'en-tête, nous pouvons l'exploiter dans notre code source pour les cas de compilation conditionnelle du préprocesseur.
Exemple:
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"])
Répertoire de sortie Makefile
Dans la macro AC_CONFIG_FILES
, ajoutez un répertoire de sortie Makefile pour l'exemple de plateforme.
Exemple:
AC_CONFIG_FILES ([ examples/platforms/efr32/Makefile ])
GNU Automake
Créez et modifiez des fichiers Automake pour prendre en charge le nouvel exemple de plateforme.
Les fichiers Automake suivants spécifiques à la plate-forme doivent être créés:
-
/openthread/examples/Makefile- platform-name
-
/openthread/examples/platforms/ platform-name /Makefile.am
-
/openthread/examples/platforms/ platform-name /Makefile.platform.am
Voir /examples
pour des /examples
d'implémentation de ces fichiers.
Les fichiers Automake suivants doivent également être mis à jour avec les informations de votre plate-forme:
Configuration du script de l'éditeur de liens
Le script GNU Linker décrit comment mapper toutes les sections des fichiers d'entrée ( .o
fichiers "objet" générés par la collection de compilateurs GNU (GCC)) au fichier de sortie final (par exemple, .elf
). Il détermine également l'emplacement de stockage de chaque segment d'un programme exécutable, ainsi que l'adresse d'entrée. Le script de l'éditeur de liens spécifique à la plate-forme est souvent fourni avec le BSP de la plate-forme.
Configurez l'outil ld
pour qu'il pointe vers le script de l'éditeur de liens spécifique à la plate-forme à l'aide de l'option -T
de la variable LDADD_COMMON
.
Créez /openthread/examples/platforms/ platform-name /Makefile.platform.am
et pointez la nouvelle plateforme vers son script de liaison:
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
Ajoutez la configuration du script de l'éditeur de liens de la plateforme à l'utilitaire /openthread/examples/platforms/Makefile.platform.am
Makefile:
if OPENTHREAD_EXAMPLES_EFR32 include $(top_srcdir)/examples/platforms/efr32/Makefile.platform.am endif
Configuration du sous-répertoire
Modifiez /openthread/examples/platforms/Makefile.am
pour configurer les sous-répertoires du package pour le nouvel exemple de plateforme.
Ajoutez le nom du sous-répertoire de la plateforme dans la liste pour make dist
, par ordre alphabétique:
# Always package (e.g. for 'make dist') these subdirectories. DIST_SUBDIRS = \ cc2538 \ cc2650 \ efr32 \ nrf52840 \ simulation \ utils \ $(NULL)
Ajoutez le nom du sous-répertoire de la plateforme à la variable SUBDIRS
:
# Always build (e.g. for 'make all') these subdirectories. if OPENTHREAD_EXAMPLES_EFR32 SUBDIRS += efr32 endif
Code de démarrage de la chaîne d'outils
Le code de démarrage de la chaîne d'outils est souvent fourni avec le BSP de la plate-forme. Ce code généralement:
- Implémente la fonction d'entrée (
Reset_Handler
) du programme exécutable - Définit la table des vecteurs d'interruption
- Initialise le tas et la pile
- Copie la section
.data
de la mémoire non volatile vers la RAM - Passe à la fonction principale de l'application pour exécuter la logique de l'application
Le code de démarrage (C ou code source de l'assembly) doit être ajouté au Makefile.am
spécifique à la plate-forme, sinon certaines variables clés utilisées dans le script de l'éditeur de liens ne peuvent pas être correctement citées:
-
/openthread/examples/platforms/ platform-name /Makefile.am
Exemple:
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 \