此问题会影响要在闪存中执行的代码,方法是使用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。因此它不适合闪光灯。
没有回复内容