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:
AApplication (pensati per far girare un sistema operativo)MMicrocontroller (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_ARCHTUNE_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:
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:
aarch64armi586x86_64powerpc
e molte altre. Quindi il nostro
stm32mp257f-dk.conf per il momento sarà:
1TARGET_ARCH = "aarch64"
2include conf/machine/include/arm/armv8a/tune-cortexa35.incE 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.