Problema critico
Questo problema riguarda il codice destinato ad essere eseguito in flash
utilizzando alt_load()
per copiare le sezioni scrivibili nella RAM.
Se una sezione ELF (ad esempio .bss
) deve essere copiata da
flash alla RAM utilizzando alt_load()
, gli strumenti di compilazione del software
verificare che la sezione si adatti alla RAM, ma non che si adatti alla
memoria flash in cui verrà programmata. Gli strumenti generano un
file di programmazione senza alcuna indicazione di un errore di dimensioni del codice.
Questo problema ha maggiori probabilità di influire sulla memoria di destinazione
è il flash MAX 10 onchip, che è relativamente piccolo. Questo problema
influisce solo su di te se si sta utilizzando alt_load()
.
È possibile determinare manualmente se il codice si adatta guardando all'inizio del file objdump, creato quando si costruisce l'applicazione. Questo file contiene informazioni che è possibile utilizzare per determinare se ciascuna sezione si adatta al flash memoria, come dimostrato nell'esempio seguente.
Il file objdump viene creato nell'applicazione
directory di primo livello dell'applicazione. È possibile generarlo da
la riga di comando digitando make app
nell'applicazione
Directory.
Vicino alla parte superiore del file objdump è un elenco di sezioni simili alle seguenti:
Sections: | ||||||
Idx | Name | Size | VMA | LMA | File off | Algn |
0 | .entry | 00000020 | 00028000 | 00028000 | 00001000 | 2**5 |
| | CONTENTS, ALLOC, LOAD, READONLY, CODE | ||||
1 | .exceptions | 00000220 | 00028020 | 00028020 | 00001020 | 2**2 |
| | CONTENTS, ALLOC, LOAD, READONLY, CODE | ||||
2 | .text | 00006504 | 00028240 | 00028240 | 00001240 | 2**2 |
| | CONTENTS, ALLOC, LOAD, READONLY, CODE | ||||
3 | .rodata | 0000005c | 00040000 | 0002e744 | 00008000 | 2**2 |
| | CONTENTS, ALLOC, LOAD, READONLY, DATA | ||||
4 | .rwdata | 00001b78 | 0004005c | 0002e7a0 | 0000805c | 2**2 |
| | CONTENTS, ALLOC, LOAD, DATA, SMALL_DATA | ||||
5 | .bss | 00000154 | 00041bd4 | 00030318 | 00009bd4 | 2**2 |
| | ALLOC, SMALL_DATA |
Ogni sezione ha valori per dimensioni, VMA e LMA. VMA è il l'indirizzo di runtime e LMA è l'indirizzo di caricamento. Se una sezione non è copiato, VMA = LMA. Se una sezione viene copiata, viene copiata da LMA alla VMA.
In questo caso, che utilizza alt_load()
.entry
e .text
sono
non copiato (VMA = LMA). .rodata
, .rwdata
,
e .bss
vengono copiati da un indirizzo flash (LMA) a una RAM
indirizzo (VMA).
Il flash in questo esempio ha una gamma di 0x28000 da 0x30000.
La .rwdata
sezione è programmata per l'avvio flash
at VMA = 0x2e7a0 e si estende a VMA Size = 0x2e7a0 0x1b78 =
0x30518. Pertanto non si adatta al flash.