鏈接腳本(Linker Script)應用實例(一)使用copy table將函數載入到RAM中運行


將函數載入到RAM中運行需要以下三個步驟:

(1)用編譯器命令#pragma section "<section name>" <user functions> #pragma section 將想要載入RAM運行的函數存儲為自定義段名的程序段,其中ax是#pragma section命令中的可選設置——<flags>,a表示allocatable,x表示executable,具體

#pragma section ".flash_driver" ax

void PFlashProgram( uint32 flash, uint32 addr, uint32 word_l, uint32 word_u )
{
    uint32 load_cnt;
    uint16 endinitSfty_pw = IfxScuWdt_getSafetyWatchdogPasswordInline();

    IfxFlash_enterPageMode(addr);

    /* wait until unbusy */
    IfxFlash_waitUnbusy(flash, IfxFlash_FlashType_P0);

    /* write 32 bytes (8 doublewords) into assembly buffer */
    for (load_cnt = 0; load_cnt < 4; load_cnt++)
    {
        IfxFlash_loadPage2X32(addr, word_l, word_u);
    }

    /* write page */
    IfxScuWdt_clearSafetyEndinitInline(endinitSfty_pw);
    IfxFlash_writePage(addr);
    IfxScuWdt_setSafetyEndinitInline(endinitSfty_pw);

    /* wait until unbusy */
    IfxFlash_waitUnbusy(flash, IfxFlash_FlashType_P0);
} #pragma section

(2)在鏈接腳本中,以自定義的程序段為輸入,定義輸出段output section:

   /* user defined output section, used to allocate ram space(VMA) for code running in ram, */
    /* and also allocate rom space(LMA) to store it */
    .code2ram : 
    {
        *(.flash_driver)
        *(.flash_driver.*)
        . = ALIGN(8);
    } > psram_local AT> pfls0 =0

(3)將該輸出段.code2ram的LMA、VMA和SIZE等信息加入到copy table中,以使CPU啟動時將該段(函數)從ROM拷貝到RAM中(從而正常運行)。這里貼出相關的上下文以便於讀者的整體理解

  (注:這里有一個VMA和LMA概念的問題,會在之前的博文——鏈接腳本(linker script)用法解析(一)中講解)

/* user defined output section, used to allocate ram space(VMA) for code running in ram, */
    /* and also allocate rom space(LMA) to store it */
    .code2ram : 
    {
        *(.flash_driver)
        *(.flash_driver.*)
        . = ALIGN(8);
    } > psram_local AT> pfls0 =0
          
       .rodata : FLAGS(arl)
    {
        *(.rodata)
        *(.rodata.*)
        *(.gnu.linkonce.r.*)    
        /*
          * Create the clear and copy tables that tell the startup code
          * which memory areas to clear and to copy, respectively.
          */
        . = ALIGN(16) ;
        PROVIDE(__clear_table = .) ;
        LONG(0 + ADDR(.CPU2.zbss));     LONG(SIZEOF(.CPU2.zbss));
        LONG(0 + ADDR(.CPU2.bss));    LONG(SIZEOF(.CPU2.bss));
        LONG(0 + ADDR(.CPU1.zbss));     LONG(SIZEOF(.CPU1.zbss));
        LONG(0 + ADDR(.CPU1.bss));    LONG(SIZEOF(.CPU1.bss));
        LONG(0 + ADDR(.CPU0.zbss));     LONG(SIZEOF(.CPU0.zbss));
        LONG(0 + ADDR(.CPU0.bss));    LONG(SIZEOF(.CPU0.bss));
        LONG(0 + ADDR(.zbss));     LONG(SIZEOF(.zbss));
        LONG(0 + ADDR(.sbss));     LONG(SIZEOF(.sbss));
        LONG(0 + ADDR(.bss));    LONG(SIZEOF(.bss));
        LONG(0 + ADDR(.sbss4));    LONG(SIZEOF(.sbss4));
        LONG(-1);                 LONG(-1);
        PROVIDE(__copy_table = .) ;
        LONG(LOADADDR(.CPU2.zdata));    LONG(0 + ADDR(.CPU2.zdata));    LONG(SIZEOF(.CPU2.zdata));
        LONG(LOADADDR(.CPU2.data));    LONG(0 + ADDR(.CPU2.data));    LONG(SIZEOF(.CPU2.data));
        LONG(LOADADDR(.CPU1.zdata));    LONG(0 + ADDR(.CPU1.zdata));    LONG(SIZEOF(.CPU1.zdata));
        LONG(LOADADDR(.CPU1.data));    LONG(0 + ADDR(.CPU1.data));    LONG(SIZEOF(.CPU1.data));
        LONG(LOADADDR(.CPU0.zdata));    LONG(0 + ADDR(.CPU0.zdata));    LONG(SIZEOF(.CPU0.zdata));
        LONG(LOADADDR(.CPU0.data));    LONG(0 + ADDR(.CPU0.data));    LONG(SIZEOF(.CPU0.data));
        LONG(LOADADDR(.zdata));    LONG(0 + ADDR(.zdata));    LONG(SIZEOF(.zdata));
        LONG(LOADADDR(.sdata));    LONG(0 + ADDR(.sdata));    LONG(SIZEOF(.sdata));
        LONG(LOADADDR(.data));    LONG(0 + ADDR(.data));    LONG(SIZEOF(.data));
        LONG(LOADADDR(.sdata4));    LONG(0 + ADDR(.sdata4));    LONG(SIZEOF(.sdata4));
        LONG(LOADADDR(.code2ram)); LONG(0 + ADDR(.code2ram)); LONG(SIZEOF(.code2ram));
        LONG(-1);                 LONG(-1);                 LONG(-1);
        . = ALIGN(16);
      } > pfls0
      
      .text  : FLAGS(axl)
    {
        *(.text)
        *(.text.*)
        *(.gnu.linkonce.t.*)
        *(.gnu.warning)        /* .gnu.warning sections are handled specially by elf32.em. */
        . = ALIGN(16);
    } > pfls0

以上的示例來源於TC297的Flash驅動測試程序。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM