Problème critique
Ce problème affecte le code conçu pour l’exécution en mémoire flash
en utilisant alt_load()
pour copier les sections writable sur la RAM.
Si une section ELF (par .bss
exemple) doit être copiée à partir de
flash à la RAM à alt_load()
l’aide , les outils de construction du logiciel
vérifier que la section correspond à la RAM, mais pas qu’elle correspond
mémoire flash dans lesquelles il sera programmé. Les outils génèrent une
fichier de programmation sans aucune indication d’erreur de taille de code.
Ce problème est plus susceptible de vous affecter si votre mémoire cible
est le flash MAX 10 onchip, qui est relativement petit. Ce problème
affecte uniquement si vous utilisez alt_load()
.
Vous pouvez déterminer manuellement si votre code s’adapte en regardant au début du fichier .objdump, créé lorsque vous créez votre application. Ce fichier contient des informations qui vous pouvez utiliser pour déterminer si chaque section correspond à votre flash mémoire, comme illustré dans l’exemple suivant.
Le fichier .objdump est créé dans le fichier de l’application
répertoire de haut niveau de l’application. Vous pouvez le générer à partir de
la ligne de commande en tapant make app
dans l’application
Répertoire.
Près du haut du fichier .objdump se trouve une liste de sections semblables à celles suivantes :
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 |
Chaque section a des valeurs en matière de taille, de VMA et de LMA. Le VMA est le l’adresse d’exécution, et LMA est l’adresse de chargement. Si une section ne l’est pas copié, VMA = LMA. Si une section est copiée, elle est copiée à partir de LMA à VMA.
Dans ce cas, qui utilise alt_load()
.entry
et qui .text
sont
pas copié (VMA = LMA). .rodata
, .rwdata
,
et .bss
sont copiés d’une adresse flash (LMA) à une RAM
adresse (VMA).
La mémoire Flash de cet exemple possède une gamme de 0x28000 à 0x30000.
La .rwdata
section est programmée pour démarrer en mémoire flash
à VMA = 0x2e7a0 et s’étend jusqu’à la taille d’un VMA = 0x2e7a0 0x1b78 =
0x30518. Elle ne s’adapte donc pas en mémoire flash.