Dato che il supporto sembra essere abbastanza ufficiale, proporrei uno scambio di esperienze, "trucchi" e altre "inezie".
Intanto avrei una curiosità, la differenza di "occupazione" in flash e ram, da cosa è data? So che la risposta è "ovvia", ma ho fatto una prova con lo scketch bare minimum e riscontro curiosi "fenomeni"...
Notate il file txt per quanto riguarda le schede Nucleo.
La maggiore occupazione di flash e ram sugli STM32 dipende dal fatto che sono processori a 32 bit, pertanto ogni word di memoria, sia ram che flash, sono 4 byte e ogni riga di codice assembly occupa come minimo una word, inoltre l'IDE di Arduino aggiunge sempre molto codice "nascosto" al tuo codice che va ad "ingrassare" il codice compilato.
Non ultimo il fatto che quando compili per gli STM32 usando il core di Arduino ti porti dietro le CMSIS (Cortex Microcontroller Software Interface Standard), sono un mix tra HAL e API, molto utili ma hanno un discreto peso quando compili.
La maggiore occupazione rispetto agli avr a 8 bit mi è ovvia, quello che mi incuriosiva era la diversa occupazione a parità di sketch su micro diversi.
Detto in "soldoni", perché:
"Nucleo F091 bare
Lo sketch usa 5164 byte (1%) dello spazio disponibile per i programmi. Il massimo è 262144 byte.
Le variabili globali usano 2332 byte (7%) di memoria dinamica, lasciando altri 30436 byte liberi per le variabili locali. Il massimo è 32768 byte."
"Nucleo F030 bare
Lo sketch usa 4888 byte (7%) dello spazio disponibile per i programmi. Il massimo è 65536 byte.
Le variabili globali usano 3968 byte (48%) di memoria dinamica, lasciando altri 4224 byte liberi per le variabili locali. Il massimo è 8192 byte."
Ovviamente le percentuali sono dovute alle diverse dimensioni di flash e ram, ma le occupazioni in byte? Sono in realtà anche loro legate alle dimensioni "in percentuale"?
La diversa occupazione dipende dal diverso tipo di processore, di quanta "roba" serve per inizializzarlo come desiderato e di quali routine della CMSIS, in particolare quelle per la gestione delle varie periferiche, vengono incluse nel compilato.
... in generale aggiungerei che, sempre in funzione dalla MCU, anche all'interno della setssa famiglia, il compilatore può ottimizzare o meno alcune cose in funzione dell'esistenza o meno di particolari risorse HW.
Esempio, all'interno della famiglia PIC32 (... che è quella che conosco meglio), puoi avere MCU che hanno più o meno registri dedicati al "contex switch" in caso di interrupt, possono avere più o meno cache, addirittura possono avere o non avere DMA, DSP, FPU, ecc. ecc. e tutto questo si riflette, ovviamnete, nelle dimensioni del codice eseguibile generato che viene ottimizzato per sfruttare al meglio quello che c'è.
speedyant:
Intanto grazie. Un chiarimento "off topic", la stessa cosa capita ovviamente se uso le stesse schede con i compilatori "tradizionali"?
Vale per tutti i compilatori, se usi l'IDE di Arduino per scrivere codice sugli STM32 sicuramente l'eseguibile risulta di dimensioni maggiori rispetto ad un codice che fa la stessa cosa scritto in C/C++ puro, senza appoggiarsi a wiring, perché non ti porti dietro tutto l'ambiente operativo di Arduino.
Quanto sopra non cambia il fatto che a seconda del micro, a parità di codice e compilatore, cambia l'utilizzo di flash/ram per via delle diverse routine delle CMSIS, ed altre eventuali librerie, che vengono compilate assieme al tuo codice.