Kritisches Problem
Dieses Problem betrifft Code, der in Flash ausgeführt werden soll
durch Kopieren alt_load()
von beschreibbaren Abschnitten in den RAM.
Wenn ein ELF-Abschnitt (z. B. .bss
) kopiert werden soll
Flash-to-RAM verwenden alt_load()
, die Software-Build-Tools
Stellen Sie sicher, dass der Abschnitt in den RAM-Speicher passt, aber nicht, dass er in den
Flash-Speicher, in dem er programmiert wird. Die Tools generieren eine
Programmierdatei ohne Angabe eines Fehlers in der Codegröße.
Dieses Problem wirkt sich eher auf Sie aus, wenn Ihr Zielspeicher
ist der MAX 10 Onchip-Flash, der relativ klein ist. Dieses Problem
Wirkt sich nur auf Sie aus, wenn Sie .alt_load()
Sie können manuell feststellen, ob Ihr Code passt, indem Sie nachschauen am Anfang der .objdump-Datei , die erstellt wurde, wenn Sie Ihre Anwendung erstellen. Diese Datei enthält Informationen, die Sie können es verwenden, um festzustellen, ob jeder Abschnitt in Ihren Flash-Speicher passt Speicher, wie im folgenden Beispiel gezeigt.
Die .objdump-Datei wird in den Anwendungen erstellt
Top-Level-Verzeichnis der Anwendung. Sie können sie aus
die Befehlszeile durch Eingabe make app
in der Anwendung
Verzeichnis.
Oben in der .objdump-Datei befindet sich eine Liste von Ähnliche Abschnitte wie die folgenden:
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 |
Jeder Abschnitt hat Werte für Größe, VMA und LMA. VMA ist die Runtime-Adresse und LMA ist die Ladeadresse. Wenn ein Abschnitt nicht kopiert, VMA = LMA. Wenn ein Abschnitt kopiert wird, wird er von der LMA kopiert zu VMA.
In diesem Fall verwendet alt_load()
und .entry
.text
sind
nicht kopiert (VMA = LMA). .rodata
, .rwdata
,
und .bss
von einer Flash-Adresse (LMA) in einen RAM kopiert werden
Adresse (VMA).
Der Flash-Speicher in diesem Beispiel hat eine Reihe von 0x28000 bis 0x30000.
Der .rwdata
Abschnitt ist so programmiert, dass der Flash-Start startet
bei VMA = 0x2e7a0, und erweitert sich auf VMA-Größe = 0x2e7a0 0x1b78 =
0x30518. Daher passt es nicht in Flash-Speicher.