Problema crítico
Este problema afeta o código destinado a ser executado em flash
usando para alt_load()
copiar seções retorcáveis para RAM.
Se uma seção ELF (por exemplo .bss
) for copiada de
flash para RAM usando alt_load()
, as ferramentas de compilação de software
verificar se a seção se encaixa na RAM, mas não que ela se encaixa no
memória flash em que ela será programada. As ferramentas geram um
arquivo de programação sem qualquer indicação de um erro de tamanho do código.
Este problema é mais provável que afete você se sua memória de destino
é o flash MAX 10 onchip, que é relativamente pequeno. Este problema
só afeta você se você estiver usando alt_load()
.
Você pode determinar manualmente se seu código se encaixa olhando no início do arquivo .objdump , criado quando você constrói sua aplicação. Este arquivo contém informações que você pode usar para determinar se cada seção se encaixa em seu flash memória, conforme demonstrado no exemplo a seguir.
O arquivo .objdump é criado no aplicativo
diretório de nível superior do aplicativo. Você pode gere-lo a partir de
a linha de comando digitando make app
no aplicativo
Diretório.
Perto da parte superior do arquivo .objdump está uma lista de seções semelhantes às seguintes:
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 |
Cada seção tem valores para tamanho, VMA e LMA. VMA é o endereço de tempo de execução e LMA é o endereço de carga. Se uma seção não estiver copiado, VMA = LMA. Se uma seção for copiada, ela será copiada do LMA para VMA.
Neste caso, que usa alt_load()
e .entry
são .text
não copiado (VMA = LMA). .rodata
, .rwdata
,
e .bss
são copiados de um endereço flash (LMA) para uma RAM
endereço (VMA).
O flash neste exemplo tem uma variedade de 0x28000 para 0x30000.
A .rwdata
seção está programada para piscar a partir
no VMA = 0x2e7a0, e se estende até o tamanho VMA = 0x2e7a0 0x1b78 =
0x30518. Portanto, ele não cabe em flash.