Linker IAR链接器配置文件-缺少";。intvec“;安置
我正在处理一个IAR项目,其中有用于引导加载程序和主应用程序的ILINK配置文件(Linker IAR链接器配置文件-缺少";。intvec“;安置,linker,iar,Linker,Iar,我正在处理一个IAR项目,其中有用于引导加载程序和主应用程序的ILINK配置文件(.icf)。每个文件都定义了\uu ICFEDIT\u intvec\u start\uu符号,然后将其放置在各自的.intvec部分(有2个cstartup.s文件,每个文件都有自己的.intvec部分): 引导加载程序.icf: define symbol __ICFEDIT_intvec_start__ = 0x18000000; ... place at address mem:_
.icf
)。每个文件都定义了\uu ICFEDIT\u intvec\u start\uu
符号,然后将其放置在各自的.intvec
部分(有2个cstartup.s
文件,每个文件都有自己的.intvec
部分):
引导加载程序
.icf
:
define symbol __ICFEDIT_intvec_start__ = 0x18000000;
...
place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
define symbol __ICFEDIT_intvec_start__ = 0x18080000;
...
place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
应用程序.icf
:
define symbol __ICFEDIT_intvec_start__ = 0x18000000;
...
place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
define symbol __ICFEDIT_intvec_start__ = 0x18080000;
...
place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
据我所知,每个
.icf
文件都用于生成自己的.map
文件。看到这两个部分如何引用两个不同的部分(共享相同的名称),我很困惑,为什么引导加载程序只有.map
文件引用.intvec
部分:
引导加载程序
.map
:
*******************************************************************************
*** PLACEMENT SUMMARY
***
"A1": place at 0x18000000 { ro section .intvec };
"P1": place in [from 0x18000040 to 0x1807ffff] { ro };
"P2": place in [from 0x20020000 to 0x209fffff] {
rw, block CSTACK, block SVC_STACK, block IRQ_STACK, block FIQ_STACK,
block UND_STACK, block ABT_STACK, block HEAP };
Section Kind Address Size Object
------- ---- ------- ---- ------
"A1": 0x3c
.intvec ro code 0x18000000 0x3c cstartup.o [1]
- 0x1800003c 0x3c
...
*******************************************************************************
*** PLACEMENT SUMMARY
***
"INT_VEC_RAM":
place at 0x20020000 { section .intvec_RAM };
"ROM": place in [from 0x18080040 to 0x1bffffff] {
ro section .cstartup, block ROM_CONTENT };
"RAM": place in [from 0x20020040 to 0x209fffff] { block RAM_CONTENT };
Section Kind Address Size Object
------- ---- ------- ---- ------
"ROM": 0x2405e0
ROM_CONTENT 0x18080040 0x2405e0 <Block>
.text ro code 0x18080040 0x104 access.o [8]
.text ro code 0x18080144 0x18c cstartup.o [1]
应用程序.map
:
*******************************************************************************
*** PLACEMENT SUMMARY
***
"A1": place at 0x18000000 { ro section .intvec };
"P1": place in [from 0x18000040 to 0x1807ffff] { ro };
"P2": place in [from 0x20020000 to 0x209fffff] {
rw, block CSTACK, block SVC_STACK, block IRQ_STACK, block FIQ_STACK,
block UND_STACK, block ABT_STACK, block HEAP };
Section Kind Address Size Object
------- ---- ------- ---- ------
"A1": 0x3c
.intvec ro code 0x18000000 0x3c cstartup.o [1]
- 0x1800003c 0x3c
...
*******************************************************************************
*** PLACEMENT SUMMARY
***
"INT_VEC_RAM":
place at 0x20020000 { section .intvec_RAM };
"ROM": place in [from 0x18080040 to 0x1bffffff] {
ro section .cstartup, block ROM_CONTENT };
"RAM": place in [from 0x20020040 to 0x209fffff] { block RAM_CONTENT };
Section Kind Address Size Object
------- ---- ------- ---- ------
"ROM": 0x2405e0
ROM_CONTENT 0x18080040 0x2405e0 <Block>
.text ro code 0x18080040 0x104 access.o [8]
.text ro code 0x18080144 0x18c cstartup.o [1]
答案似乎比我想象的要明显得多。根据“”中的“链接概述”部分,IAR的链接器软件ILINK忽略重复部分。因此,如果一个节已经在一个二进制对象或ILINK配置文件(ICF)中被引用,那么对它的所有其他引用都将被忽略 在本项目中,由于引导加载程序具有优先权(在应用程序[在项目的
.board
文件中定义;详细信息]之前加载并刷新),因此应用程序代码的.intvec
被视为重复,因此被忽略/丢弃