Файл конфигурации компоновщика IAR - место размещения ".intve c" отсутствует - PullRequest
1 голос
/ 31 января 2020

Я работаю с проектом IAR, в котором есть файлы конфигурации ILINK (.icf) как для загрузчика, так и для основного приложения. Каждый файл определяет символ __ICFEDIT_intvec_start__, а затем размещает его, ссылаясь на свои соответствующие разделы .intvec (есть 2 cstartup.s файла, каждый со своим собственным разделом .intvec):


Bootloader .icf:

    define symbol __ICFEDIT_intvec_start__ = 0x18000000;
    ...
    place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };

Приложение .icf:

    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
    ...

Приложение .map:

    *******************************************************************************
    *** 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]

Что здесь происходит? Я только начинаю понимать роль компоновщика, поэтому я довольно новичок во всем этом.

Кроме того, для дальнейшего уточнения, две секции .intvec составляют одну и ту же таблицу векторов прерываний:

            SECTION .intvec:CODE:NOROOT(2)
            ...

    __vector:                       ; Make this a DATA label, so that stack usage
                                    ; analysis doesn't consider it an uncalled fun

            ARM

            ; All default exception handlers (except reset) are
            ; defined as weak symbol definitions.
            ; If a handler is defined by the application it will take precedence.
            LDR     PC,Reset_Addr           ; Reset
            LDR     PC,Undefined_Addr       ; Undefined instructions
            LDR     PC,SWI_Addr             ; Software interrupt (SWI/SVC)
            LDR     PC,Prefetch_Addr        ; Prefetch abort
            LDR     PC,Abort_Addr           ; Data abort
            DCD     0                       ; RESERVED
            LDR     PC,IRQ_Addr             ; IRQ
            LDR     PC,FIQ_Addr             ; FIQ

1 Ответ

1 голос
/ 06 февраля 2020

Кажется, что ответ намного очевиднее, чем я думал. В соответствии с разделом «Связывание - обзор» в « IAR C / C ++ Руководство по разработке », программное обеспечение компоновщика IAR ILINK игнорирует дубликаты разделов. Таким образом, если на раздел уже ссылаются в одном двоичном объекте или в файле конфигурации ILINK (ICF), все остальные ссылки на него игнорируются.

В этом проекте, поскольку загрузчик имеет приоритет (загружается и мигает до application [определено в .board файлах проекта; более подробная информация здесь] ), код приложения .intvec рассматривается как дубликат и поэтому игнорируется / отбрасывается.

...