This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F280049C:移位中断向量表和跳转到应用程序

Guru**** 2331900 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1507967/tms320f280049c-shift-interrupt-vector-table-and-jump-to-application

器件型号:TMS320F280049C

工具/软件:

大家好、我正在处理引导加载程序项目、目前必须移动中断矢量表并跳转到应用程序。 我仅使用 driverlib 库函数、不使用器件支持。 您能告诉我一些步骤、以便我可以移动中断向量表并跳转到我的应用程序吗? 目前、我的 Jump to App 函数如下所示。

作废 JumpToApp (作废){
DINT;
Interrupt_disablePIE();

//清除所有中断
IER = 0x0000;
IFR = 0x0000;
//将应用程序 PIE 矢量从闪存复制到 RAM
EALLOW;
memcpy ((void *)&PieVectTable、(void *) 0x86,000,256);
EDIS;

ASM (" MOVW SP、#0x800");

//跳转到应用程序入口点
asm (" lb #0x88000");
}


它显示执行跳转函数后 cinit()错误、并且 IVT 也没有移位。 如需进一步说明、我也可以提供应用程序代码及其链接器文件。 谢谢你。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨、Harihara、

    我们邀请引导加载程序专家。 请给他们1-2天时间回复您。

    此致、

    Delaney

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢你。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Harihara、

    请共享应用程序和引导加载程序的链接器命令文件、这对调试有很大帮助。

    Unknown 说:
    //将应用程序 PIE 矢量从闪存复制到 RAM
    EALLOW;
    memcpy ((void *)&PieVectTable、(void *) 0x86,000,256);
    EDIS;

    0x86000映射到闪存。 LS0 RAM 中的意思是0x8600吗?

    Unknown 说:
    执行跳转函数后显示 POST cinit ()错误

    应用程序是否成功分支到0x88000? 应用程序的 codestart 是否位于该位置? 您是否还可以在 CCS 中显示错误的屏幕截图?

    此致、

    马特

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我现在修改了我的代码。 跳转到应用程序函数  


    易失性结构 PIE_VECT_TABLE PieVectTable ___attribute__((location (0x000D00)));
    typedef void (* AppEntryPoint)(void);
    #define APP_ENTRY_ADDRESS 0x85000

    作废 JumpToApp (作废)

    //禁用中断
    DINT;
    Interrupt_disablePIE();
    IER = 0x0000;
    IFR = 0x0000;

    //将 SP 设置为应用程序栈的顶部(与应用程序在链接器中使用的内容相匹配)
    asm (" MOV SP、#0x400");//将其与.stack 大小和位置相匹配

    EALLOW;

    //可选:如果您的应用程序使用不同的 PIE 矢量表、请复制它
    //示例:假设向量表存储在闪存中的0x84000处
    Memcpy ((void *)&PieVectTable、(void *) 0x84,000,256);

    EDIS;

    //跳转到应用程序的 C 运行时入口点
    AppEntryPoint 应用=(AppEntryPoint)(APP_ENTRY_ADDRESS);
    app ();//跳转到_c_int00 (通常为 app 条目)
    }

    引导加载程序链接器文件为:

    移动数据

    第0页:

    RAMM0:origin = 0x0000F5、长度= 0x00030B
    RAMLS0:origin = 0x008000、length = 0x000800
    RAMLS1:原点= 0x008800、长度= 0x000800
    RAMLS2:原点= 0x009000、长度= 0x000800
    RAMLS3:原点= 0x009800、长度= 0x000800
    RAMLS4:原点= 0x00A000、长度= 0x000800
    Reset:origin = 0x3FFFC0、length = 0x000002

    #ifdef _TI_COMPILER_VERSION__
    #if __TI_COMPILER_VERSION_>= 20012000
    组{
    #endif
    #endif

    BEGIN:origin = 0x080000、length = 0x000002
    FLASH_BANK0_SEC0:origin = 0x080002、length = 0x000FFE
    FLASH_BANK0_SEC1:origin = 0x081000、length = 0x001000
    FLASH_BANK0_sec2:origin = 0x082000、length = 0x001000
    FLASH_BANK0_SEC3:origin = 0x083000、length = 0x001000
    FLASH_BANK0_SEC4:origin = 0x084000、length = 0x001000


    #ifdef _TI_COMPILER_VERSION__
    #if __TI_COMPILER_VERSION_>= 20012000
    }crc (_ccs_flash_checksum、算法=C28_CHECKSUM_16)
    #endif
    #endif

    第1页:

    BOOT_RSVD:origin = 0x000002、length = 0x0000F3
    RAMM1:原点= 0x000400、长度= 0x000400
    RAMLS5:原点= 0x00A800、长度= 0x000800
    RAMLS6:原点= 0x00B000、长度= 0x000800
    RAMLS7:原点= 0x00B800、长度= 0x000800
    RAMGS0:原点= 0x00C000、长度= 0x002000
    RAMGS1:origin = 0x00E000、length = 0x002000
    RAMGS2:origin = 0x010000、length = 0x002000
    RAMGS3:原点= 0x012000、长度= 0x002000
    PIE_VECT_TABLE:origin = 0x000D00、length = 0x000100
    }

    很重要

    codestart :> begin, page = 0, align(4)
    .text:>> FLASH_BANK0_SEC1 | FLASH_BANK0_sec2、PAGE = 0、ALIGN (4)
    .cinit:> FLASH_BANK0_SEC1、PAGE = 0、ALIGN (4)
    .pinit:> FLASH_BANK0_SEC1、PAGE = 0、ALIGN (4)
    .switch:> FLASH_BANK0_SEC1、page = 0、align (4)
    .reset:> reset、page = 0、type = DSECT
    PieVectTableFile :> PIE_VECT_TABLE, PAGE = 1
    .stack :> RAMM1, page = 1.
    .ebss :> RAMLS5, page = 1.
    .esysmem :> RAMLS5, page = 1.
    .econst:> FLASH_BANK0_SEC4、PAGE = 0、ALIGN (4)

    ramgs0:> RAMGS0、page = 1
    ramgs1 :> RAMGS1, page = 1.

    .TI.ramfunc:{}load = FLASH_BANK0_SEC1、
    RUN = RAMLS0 | RAMLS1 | RAMLS2 | RAMLS3
    LOAD_START (_RamfuncsLoadStart)、
    load_size (_RamfuncsLoadSize)、
    LOAD_END (_RamfuncsLoadEnd)、
    RUN_START (_RamfuncsRunStart)、
    RUN_SIZE (_RamfuncsRunSize)、
    RUN_END (_RamfuncsRunEnd)、
    PAGE = 0、ALIGN (4)

    .TI.memcrc:type = copy
    }

    /*
    //==============================================================================
    //文件结尾。
    //==============================================================================
    */

    应用链接器文件为:

    移动数据

    第0页:

    RAMM0:origin = 0x0000F5、长度= 0x00030B
    RAMLS0:origin = 0x008000、length = 0x000800
    RAMLS1:原点= 0x008800、长度= 0x000800
    RAMLS2:原点= 0x009000、长度= 0x000800
    RAMLS3:原点= 0x009800、长度= 0x000800
    RAMLS4:原点= 0x00A000、长度= 0x000800
    Reset:origin = 0x3FFFC0、length = 0x000002

    /*闪存中的 PIE 矢量-与 JumpToApp()复制地址(0x86000)相匹配*/
    pie_vectors_flash:origin = 0x00084000、length = 0x00000100

    #ifdef _TI_COMPILER_VERSION__
    #if __TI_COMPILER_VERSION_>= 20012000
    组{
    #endif
    #endif

    /* 0x88000处的应用程序条目(与 JumpToApp LB 地址匹配)*/
    begin:origin = 0x085000、length = 0x000002
    FLASH_BANK0_SEC5:origin = 0x085002、length = 0x000FFE
    FLASH_BANK0_SEC6:origin = 0x086000、length = 0x001000
    FLASH_BANK0_sec7:origin = 0x087000、length = 0x001000
    FLASH_BANK0_SEC8:origin = 0x088000、length = 0x001000
    FLASH_BANK0_SEC9:origin = 0x089000、length = 0x001000
    FLASH_BANK0_SEC10:origin = 0x08A000、length = 0x001000
    FLASH_BANK0_SEC11:origin = 0x08B000、length = 0x001000
    FLASH_BANK0_SEC12:origin = 0x08C000、length = 0x001000
    FLASH_BANK0_SEC13:origin = 0x08D000、length = 0x001000
    FLASH_BANK0_SEC14:origin = 0x08E000、length = 0x001000
    FLASH_BANK0_SEC15:origin = 0x08F000、length = 0x001000

    /*组1段保持不变*/
    FLASH_BANK1_SEC0:origin = 0x090000、length = 0x001000
    FLASH_BANK1_SEC1:origin = 0x091000、length = 0x001000
    FLASH_BANK1_sec2:origin = 0x092000、length = 0x001000
    FLASH_BANK1_SEC3:origin = 0x093000、length = 0x001000
    FLASH_BANK1_SEC4:origin = 0x094000、length = 0x001000
    FLASH_BANK1_SEC5:origin = 0x095000、length = 0x001000
    FLASH_BANK1_SEC6:origin = 0x096000、length = 0x001000
    FLASH_BANK1_sec7:origin = 0x097000、length = 0x001000
    FLASH_BANK1_SEC8:origin = 0x098000、length = 0x001000
    FLASH_BANK1_SEC9:origin = 0x099000、length = 0x001000
    FLASH_BANK1_SEC10:原点= 0x09A000、长度= 0x001000
    FLASH_BANK1_SEC11:原点= 0x09B000、长度= 0x001000
    FLASH_BANK1_SEC12:原点= 0x09C000、长度= 0x001000
    FLASH_BANK1_SEC13:原点= 0x09D000、长度= 0x001000
    FLASH_BANK1_SEC14:原点= 0x09E000、长度= 0x001000
    FLASH_BANK1_SEC15:origin = 0x09F000、length = 0x000FF0
    FLASH_BANK1_SEC15_DO_NOT_USE:origin = 0x09FFF0、长度= 0x000010

    #ifdef _TI_COMPILER_VERSION__
    #if __TI_COMPILER_VERSION_>= 20012000
    }crc (_ccs_flash_checksum、算法=C28_CHECKSUM_16)
    #endif
    #endif

    第1页:

    BOOT_RSVD:origin = 0x000002、length = 0x0000F3
    RAMM1:原点= 0x000400、长度= 0x000400
    RAMLS5:原点= 0x00A800、长度= 0x000800
    RAMLS6:原点= 0x00B000、长度= 0x000800
    RAMLS7:原点= 0x00B800、长度= 0x000800
    RAMGS0:原点= 0x00C000、长度= 0x002000
    RAMGS1:origin = 0x00E000、length = 0x002000
    RAMGS2:origin = 0x010000、length = 0x002000
    RAMGS3:原点= 0x012000、长度= 0x002000
    }

    很重要

    codestart :> begin, page = 0, align(4)

    /* FLASH 中的 PIE 矢量-将由 JumpToApp()复制到 RAM */
    .pie_vectors_flash:> pie_vectors_flash、page = 0, align (256)

    .text:>> FLASH_BANK0_SEC5 | FLASH_BANK0_SEC6 | FLASH_BANK0_sec7、PAGE = 0、ALIGN (4)
    .cinit:> FLASH_BANK0_SEC5、PAGE = 0、ALIGN (4)
    .pinit:> FLASH_BANK0_SEC5、PAGE = 0、ALIGN (4)
    .switch:> FLASH_BANK0_SEC5、PAGE = 0、ALIGN (4)
    .reset:> reset、page = 0、type = DSECT


    .stack :> RAMM1, page = 1.

    .ebss :> RAMLS5, page = 1.
    .esysmem :> RAMLS5, page = 1.
    .econst:> FLASH_BANK0_sec7、page = 0、align (4)

    ramgs0:> RAMGS0、page = 1
    ramgs1 :> RAMGS1, page = 1.

    .TI.ramfunc:load = FLASH_BANK0_SEC5、
    RUN = RAMLS0 | RAMLS1 | RAMLS2 | RAMLS3
    LOAD_START (_RamfuncsLoadStart)、
    load_size (_RamfuncsLoadSize)、
    LOAD_END (_RamfuncsLoadEnd)、
    RUN_START (_RamfuncsRunStart)、
    RUN_SIZE (_RamfuncsRunSize)、
    RUN_END (_RamfuncsRunEnd)、
    PAGE = 0、ALIGN (4)

    .TI.memcrc:type = copy
    }

    还将提供移动中断矢量表的步骤。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨、 Harihara、

    您能解释一下为什么要在引导加载程序应用中严格复制 PIE 矢量表吗? 此外、您是否能够将引导加载程序和链接器 cmd 文件附加为文件而不是文本文件、以便我们更容易查看这些文件。

    此致、

    Delaney

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    // BOOTLOADER LINKER FILE
    MEMORY
    {
    PAGE 0 :
    
       RAMM0           : origin = 0x0000F5, length = 0x00030B
       RAMLS0          : origin = 0x008000, length = 0x000800
       RAMLS1          : origin = 0x008800, length = 0x000800
       RAMLS2          : origin = 0x009000, length = 0x000800
       RAMLS3          : origin = 0x009800, length = 0x000800
       RAMLS4          : origin = 0x00A000, length = 0x000800
       RESET           : origin = 0x3FFFC0, length = 0x000002
    
    #ifdef __TI_COMPILER_VERSION__
       #if __TI_COMPILER_VERSION__ >= 20012000
    GROUP {
       #endif
    #endif
    
       BEGIN           : origin = 0x080000, length = 0x000002
       FLASH_BANK0_SEC0: origin = 0x080002, length = 0x000FFE
       FLASH_BANK0_SEC1: origin = 0x081000, length = 0x001000
       FLASH_BANK0_SEC2: origin = 0x082000, length = 0x001000
       FLASH_BANK0_SEC3: origin = 0x083000, length = 0x001000
       FLASH_BANK0_SEC4: origin = 0x084000, length = 0x001000
    
    
    
    #ifdef __TI_COMPILER_VERSION__
      #if __TI_COMPILER_VERSION__ >= 20012000
    }  crc(_ccs_flash_checksum, algorithm=C28_CHECKSUM_16)
      #endif
    #endif
    
    PAGE 1 :
    
       BOOT_RSVD      : origin = 0x000002, length = 0x0000F3
       RAMM1          : origin = 0x000400, length = 0x000400
       RAMLS5         : origin = 0x00A800, length = 0x000800
       RAMLS6         : origin = 0x00B000, length = 0x000800
       RAMLS7         : origin = 0x00B800, length = 0x000800
       RAMGS0         : origin = 0x00C000, length = 0x002000
       RAMGS1         : origin = 0x00E000, length = 0x002000
       RAMGS2         : origin = 0x010000, length = 0x002000
       RAMGS3         : origin = 0x012000, length = 0x002000
       PIE_VECT_TABLE : origin = 0x000D00, length = 0x000100
    }
    
    SECTIONS
    {
       codestart     : > BEGIN,        PAGE = 0, ALIGN(4)
       .text         : >> FLASH_BANK0_SEC1 | FLASH_BANK0_SEC2, PAGE = 0, ALIGN(4)
       .cinit        : > FLASH_BANK0_SEC1, PAGE = 0, ALIGN(4)
       .pinit        : > FLASH_BANK0_SEC1, PAGE = 0, ALIGN(4)
       .switch       : > FLASH_BANK0_SEC1, PAGE = 0, ALIGN(4)
       .reset        : > RESET,        PAGE = 0, TYPE = DSECT
       PieVectTableFile : > PIE_VECT_TABLE, PAGE = 1
       .stack        : > RAMM1,        PAGE = 1
       .ebss         : > RAMLS5,       PAGE = 1
       .esysmem      : > RAMLS5,       PAGE = 1
       .econst       : > FLASH_BANK0_SEC4, PAGE = 0, ALIGN(4)
    
       ramgs0        : > RAMGS0,       PAGE = 1
       ramgs1        : > RAMGS1,       PAGE = 1
    
       .TI.ramfunc : {} LOAD = FLASH_BANK0_SEC1,
                          RUN = RAMLS0 | RAMLS1 | RAMLS2 | RAMLS3,
                          LOAD_START(_RamfuncsLoadStart),
                          LOAD_SIZE(_RamfuncsLoadSize),
                          LOAD_END(_RamfuncsLoadEnd),
                          RUN_START(_RamfuncsRunStart),
                          RUN_SIZE(_RamfuncsRunSize),
                          RUN_END(_RamfuncsRunEnd),
                          PAGE = 0, ALIGN(4)
    
       .TI.memcrc   : type = COPY
    }
    
    /*
    //===========================================================================
    // End of file.
    //===========================================================================
    */
    
    // APPLICATION LINKER FILE
    
    MEMORY
    {
    PAGE 0 :
    
       RAMM0            : origin = 0x0000F5, length = 0x00030B
       RAMLS0           : origin = 0x008000, length = 0x000800
       RAMLS1           : origin = 0x008800, length = 0x000800
       RAMLS2           : origin = 0x009000, length = 0x000800
       RAMLS3           : origin = 0x009800, length = 0x000800
       RAMLS4           : origin = 0x00A000, length = 0x000800
       RESET            : origin = 0x3FFFC0, length = 0x000002
    
    
    #ifdef __TI_COMPILER_VERSION__
       #if __TI_COMPILER_VERSION__ >= 20012000
    GROUP {
       #endif
    #endif
    
       /* Application entry at 0x88000 (matches JumpToApp LB address) */
       FLASH_BANK0_SEC3  : origin = 0x083000, length = 0x001000
       PIE_VECTORS_FLASH : origin = 0x00084000, length = 0x00001000
       BEGIN            : origin = 0x085000, length = 0x000002
       FLASH_BANK0_SEC5: origin = 0x085002, length = 0x000FFE
       FLASH_BANK0_SEC6: origin = 0x086000, length = 0x001000
       FLASH_BANK0_SEC7: origin = 0x087000, length = 0x001000
       FLASH_BANK0_SEC8: origin = 0x088000, length = 0x001000
       FLASH_BANK0_SEC9: origin = 0x089000, length = 0x001000
       FLASH_BANK0_SEC10: origin = 0x08A000, length = 0x001000
       FLASH_BANK0_SEC11: origin = 0x08B000, length = 0x001000
       FLASH_BANK0_SEC12: origin = 0x08C000, length = 0x001000
       FLASH_BANK0_SEC13: origin = 0x08D000, length = 0x001000
       FLASH_BANK0_SEC14: origin = 0x08E000, length = 0x001000
       FLASH_BANK0_SEC15: origin = 0x08F000, length = 0x001000
    
       /* BANK 1 sections remain unchanged */
       FLASH_BANK1_SEC0 : origin = 0x090000, length = 0x001000
       FLASH_BANK1_SEC1 : origin = 0x091000, length = 0x001000
       FLASH_BANK1_SEC2 : origin = 0x092000, length = 0x001000
       FLASH_BANK1_SEC3 : origin = 0x093000, length = 0x001000
       FLASH_BANK1_SEC4 : origin = 0x094000, length = 0x001000
       FLASH_BANK1_SEC5 : origin = 0x095000, length = 0x001000
       FLASH_BANK1_SEC6 : origin = 0x096000, length = 0x001000
       FLASH_BANK1_SEC7 : origin = 0x097000, length = 0x001000
       FLASH_BANK1_SEC8 : origin = 0x098000, length = 0x001000
       FLASH_BANK1_SEC9 : origin = 0x099000, length = 0x001000
       FLASH_BANK1_SEC10: origin = 0x09A000, length = 0x001000
       FLASH_BANK1_SEC11: origin = 0x09B000, length = 0x001000
       FLASH_BANK1_SEC12: origin = 0x09C000, length = 0x001000
       FLASH_BANK1_SEC13: origin = 0x09D000, length = 0x001000
       FLASH_BANK1_SEC14: origin = 0x09E000, length = 0x001000
       FLASH_BANK1_SEC15: origin = 0x09F000, length = 0x000FF0
       FLASH_BANK1_SEC15_DO_NOT_USE : origin = 0x09FFF0, length = 0x000010
    
    #ifdef __TI_COMPILER_VERSION__
      #if __TI_COMPILER_VERSION__ >= 20012000
    }  crc(_ccs_flash_checksum, algorithm=C28_CHECKSUM_16)
      #endif
    #endif
    
    PAGE 1 :
    
       BOOT_RSVD        : origin = 0x000002, length = 0x0000F3
       RAMM1            : origin = 0x000400, length = 0x000400
       RAMLS5           : origin = 0x00A800, length = 0x000800
       RAMLS6           : origin = 0x00B000, length = 0x000800
       RAMLS7           : origin = 0x00B800, length = 0x000800
       RAMGS0           : origin = 0x00C000, length = 0x002000
       RAMGS1           : origin = 0x00E000, length = 0x002000
       RAMGS2           : origin = 0x010000, length = 0x002000
       RAMGS3           : origin = 0x012000, length = 0x002000
    }
    
    SECTIONS
    {
       codestart        : > BEGIN,     PAGE = 0, ALIGN(4)
    
       /* PIE vectors in flash - will be copied to RAM by JumpToApp() */
       .pie_vectors_flash : > PIE_VECTORS_FLASH, PAGE = 0, ALIGN(256)
    
       .text            : >> FLASH_BANK0_SEC5 | FLASH_BANK0_SEC6 | FLASH_BANK0_SEC7, PAGE = 0, ALIGN(4)
       .cinit           : > FLASH_BANK0_SEC5, PAGE = 0, ALIGN(4)
       .pinit           : > FLASH_BANK0_SEC5, PAGE = 0, ALIGN(4)
       .switch          : > FLASH_BANK0_SEC5, PAGE = 0, ALIGN(4)
       .reset           : > RESET,     PAGE = 0, TYPE = DSECT
    
       /* Stack at 0x800 (matches JumpToApp SP setting) */
       .stack           : > RAMM1,     PAGE = 1
    
       .ebss            : > RAMLS5,    PAGE = 1
       .esysmem         : > RAMLS5,    PAGE = 1
       .econst          : > FLASH_BANK0_SEC7, PAGE = 0, ALIGN(4)
    
       ramgs0           : > RAMGS0,    PAGE = 1
       ramgs1           : > RAMGS1,    PAGE = 1
    
       .TI.ramfunc      : LOAD = FLASH_BANK0_SEC5,
                          RUN = RAMLS0 | RAMLS1 | RAMLS2 | RAMLS3,
                          LOAD_START(_RamfuncsLoadStart),
                          LOAD_SIZE(_RamfuncsLoadSize),
                          LOAD_END(_RamfuncsLoadEnd),
                          RUN_START(_RamfuncsRunStart),
                          RUN_SIZE(_RamfuncsRunSize),
                          RUN_END(_RamfuncsRunEnd),
                          PAGE = 0, ALIGN(4)
    
       .TI.memcrc       : type = COPY
    }
    // jump to app function in my booltoader file
    typedef void (*AppEntryPoint)(void);
    #define APP_ENTRY_ADDRESS  0x85000
    void JumpToApp(void)
    {
        DINT;
        Interrupt_disablePIE();
        IER = 0x0000;
        IFR = 0x0000;
        asm(" MOV SP, #0x400");
        AppEntryPoint app = (AppEntryPoint)(APP_ENTRY_ADDRESS);
        app();
    }
    
    

    我刚刚尝试通过复制 PIE 矢量表来移动 IVT、但我不知道如何移动或重新定位 IVT。 请尽快提供这些步骤来帮助我。 我附加了引导加载程序和应用程序的链接器命令文件以及跳转到 APP 函数(必须将 IVT 重定位到该函数 )、此函数位于我的引导加载程序的 main.c 文件中。 谢谢你。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨、Harihara

    从 CPU 内核的 PIE 外设的角度来看、我认为不可能将两个单独的内存区域都映射到 PIE CPU 寄存器。 现在、可以在进入/退出引导加载程序时重新写入所有 PIE 向量地址、就像在应用程序代码中一样。 但我不认为它们可以是两个单独的寄存器区域。

    有关更多详细信息、请参阅以下主题:

    此致、

    马特