ARCH

Siccome tutto il codice che andremo a compilare verrà eseguito direttamente dalla CPU e non tramite interpreti python o chissà cosa, è necessario sapere per quale architettura di CPU stiamo compilando. Il processore è un STM32MP257f ed è composto da molteplici core:

  • dual-core Arm® Cortex®-A35
  • single-core Arm® Cortex®-M33 with FPU
  • single-core Arm® Cortex®-M0+

con della memoria integrata e tutte una serie di periferiche. ARM è solo una macrocategoria e all’interno presenta varie famiglie che si sono susseguite nel tempo come:

  • ARMv6-A (32 bit)
  • ARMv7-A (32 bit)
  • ARMv7-M (32 bit)
  • ARMv8-A (32 bit e 64 bit)

ciascuna di queste presenta un instruction set diverso e non necessariamente compatibile. Le istruzioni possono essere a 32bit o 64bit. Ognuna di queste ha poi delle denominazioni che ne indicano la tipologia di utilizzo, principalmente:

  • A Application (pensati per far girare un sistema operativo)
  • M Microcontroller (pensati per uso bare-metal)

Cortex invece è l’ implementazione fisica dell’ architettura, intesa proprio come disposizione di transistor e cose così. Esistono diversi modelli e ad ognuno è associata una determinata architettura.

Nel nostro caso:

  • Cortex-A35 –> Armv8-A a 64 bit (AArch64)
  • Cortex-M33 –> Armv8-M a 32 bit (AArch32)
  • Cortex-M0+ –> Armv6-M a 32 bit (AArch32)

Ognuno di questi poi può presentare features specifiche associate a delle istruzioni speciali dell’instruction set, come la presenza di floating-point unit, istruzioni per crittografia e altro. Il sistema openembedded utilizza la presenza o meno di queste istruzioni per modificare il comportamento del compilatore usato e anche di altri applicativi.

Detto questo, per configurare un machine.conf è necessario assegnare le variabili:

  • TARGET_ARCH
  • TUNE_FEATURES

Esistono già dei preset a seconda dell’ architettura e dell’ implementazione del core su cui vogliamo fare girare il nostro codice e si trovano in:

layer layout
openembedded-core/meta/conf/machine/include
├── arm 
│    ├── armv4
│    ├── ...
│    ├── armv7a
│    ├── armv7m
│    ├── armv8-m
│    ├── armv8a
│    │    ├── tune-cortexa32.inc
│    │    ├── tune-cortexa34.inc
│    │    ├── tune-cortexa35.inc
│    │    └── ...
│    └── ...
├── riscv
├── x86
└── ...

i file tune-*.inc si occupano di definire appunto le TUNE_FEATURES e ci basta includere quello giusto nel nostro machine.conf.

La variabile TARGET_ARCH invece è più semplice da definire e può essere:

  • aarch64
  • arm
  • i586
  • x86_64
  • powerpc

e molte altre. Quindi il nostro stm32mp257f-dk.conf per il momento sarà:

stm32mp257f-dk.conf
1TARGET_ARCH = "aarch64"
2include conf/machine/include/arm/armv8a/tune-cortexa35.inc

E facendo così abbiamo dato a bitbake le informazioni necessarie per far generare a gcc dei binari adatti alla nostra CPU. Abbiamo scelto il cortexA35 perchè per il momento abbiamo deciso di fare il boot da questo.