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: shift Interrupt vector table and jump to application

Part Number: TMS320F280049C


Tool/software:

Hi there, I am working on bootloader project and currently I have to shift the interrupt vector table and jump to application. I am using driverlib library function only and not device support. Could you please give me the steps so that i can shift the interrupt vector table and jump to my application. Currently my jump to App function is given below.

void JumpToApp(void) {
DINT;
Interrupt_disablePIE();

// Clear all interrupts
IER = 0x0000;
IFR = 0x0000;
// Copy application PIE vectors from flash to RAM
EALLOW;
memcpy((void *)&PieVectTable, (void *)0x86000, 256);
EDIS;

asm(" MOVW SP, #0x800");

// Jump to application entry point
asm(" LB #0x88000");
}


it shows post cinit() error after executing the jump function and the IVT is also not shifted. For further clarifications I can give my application code and its linker file as well. Thank you.

  • Hi Harihara,

    I am looping in the Bootloader expert. Please allow them 1-2 days to get back to you with a response.

    Best Regards,

    Delaney

  • Hello Harihara,

    Please share the linker command file for the application and bootloader, that will help a lot with debugging.

    // Copy application PIE vectors from flash to RAM
    EALLOW;
    memcpy((void *)&PieVectTable, (void *)0x86000, 256);
    EDIS;

    0x86000 is mapped to the flash. Do you mean 0x8600 in LS0 RAM?

    it shows post cinit() error after executing the jump function

    Does the application successfully branch to 0x88000? Is the application's codestart at that location? Can you also show a screenshot of the error in CCS?

    Best,

    Matt

  • i have modified my code now. My Jump to App function is 


    volatile struct PIE_VECT_TABLE PieVectTable __attribute__((location(0x000D00)));
    typedef void (*AppEntryPoint)(void);
    #define APP_ENTRY_ADDRESS 0x85000

    void JumpToApp(void)
    {
    // Disable interrupts
    DINT;
    Interrupt_disablePIE();
    IER = 0x0000;
    IFR = 0x0000;

    // Set SP to top of application stack (match what your app uses in linker)
    asm(" MOV SP, #0x400"); // Match this with your .stack size and location

    EALLOW;

    // Optional: If your application uses a different PIE vector table, copy it
    // Example: Assume the vector table is stored at 0x84000 in flash
    memcpy((void *)&PieVectTable, (void *)0x84000, 256);

    EDIS;

    // Jump to C runtime entry point of application
    AppEntryPoint app = (AppEntryPoint)(APP_ENTRY_ADDRESS);
    app(); // Jump to _c_int00 (typically the app entry)
    }

    bootloader linker file is:

    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 is:

    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

    /* PIE vectors in flash - matches JumpToApp() copy address (0x86000) */
    PIE_VECTORS_FLASH : origin = 0x00084000, length = 0x00000100

    #ifdef __TI_COMPILER_VERSION__
    #if __TI_COMPILER_VERSION__ >= 20012000
    GROUP {
    #endif
    #endif

    /* Application entry at 0x88000 (matches JumpToApp LB address) */
    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 : > 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
    }

    also give me the steps to shift the interrupt Vector table.

  • Hi Harihara,

    Can you explain why exactly you are trying to copy the PIE vector table in your bootloader application? Also, would you be able to attach your bootloader and linker cmd files as files instead of text, so it is easier for us to take a look through.

    Best Regards,

    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();
    }
    
    

    I just tried shifting the IVT by copying the PIE vector table but I don't know how to shift or relocate the IVT. Could you please help me by providing the steps ASAP. I have attached my bootloader and application's linker command file along with the jump to app function where the IVT has to be relocated and this function resides in my  bootloader's main.c file. Thank you.

  • Hi Harihara,

    From the CPU core's PIE peripheral standpoint, I believe having two separate memory regions both mapped to the PIE CPU registers is not possible. Now, what is possible is to re-write out all the PIE vector addresses upon entering/exiting the bootloader, just like you would in the application code. But I don't believe they can be two separate register regions.

    Please see these threads for more details:

    Best,

    Matt