将Nios II系统编程为闪存时出错-Altera-Intel社区-FPGA CPLD-ChipDebug

将Nios II系统编程为闪存时出错

此问题会影响要在闪存中执行的代码,方法是使用alt_load()将可写部分复制到RAM。如果要使用alt_load()将ELF部分(例如.bss )从闪存复制到RAM,则软件构建工具会验证该部分是否适合RAM但不适合它将在其编程的闪存中。这些工具生成一个编程文件,没有任何代码大小错误的指示。

如果您的目标内存是MAX 10片上闪存,则此问题更有可能影响您,这一点相对较小。如果您使用alt_load()此问题仅对您alt_load()

解决/修复方法

您可以通过查看构建应用程序时创建的.objdump文件的开头来手动确定代码是否适合。此文件包含可用于确定每个部分是否适合闪存的信息,如以下示例所示。

.objdump文件是在应用程序的应用程序的顶级目录中创建的。您可以通过在应用程序目录中键入make app从命令行生成它。

.objdump文件的顶部附近是一个类似于以下部分的列表:

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

每个部分都有大小,VMA和LMA的值。 VMA是运行时地址,LMA是加载地址。如果未复制某个部分,则VMA = LMA。如果复制了某个部分,则会将其从LMA复制到VMA。

在这种情况下,它使用alt_load() .entry.text不复制(VMA = LMA)。 .rodata.rwdata.bss从闪存地址(LMA)复制到RAM地址(VMA)。

此示例中的闪存范围为0x28000到0x30000。 .rwdata部分被编程为从VMA = 0x2e7a0开始闪存,并扩展到VMA + Size = 0x2e7a0 + 0x1b78 = 0x30518。因此它不适合闪光灯。

请登录后发表评论

    没有回复内容