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.

[参考译文] CCS/TM4C123GH6PM:链接器脚本部分.vtable

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/910136/ccs-tm4c123gh6pm-linker-script-section-vtable

器件型号:TM4C123GH6PM

工具/软件:Code Composer Studio

 链接器脚本中的这个部分--.vtable --包含什么内容?这部分包含向量表的副本? 如果是这样、为什么它已经驻留在闪存中、所以被复制到 SRAM 中

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

    您好!

     如果您没有使用任何运行时中断处理程序注册、则甚至不需要链接器命令文件中的.vtable。 但是、如果您确实希望使用运行时中断处理程序注册、则需要定义.vtable。 请参阅以下摘录。 您可以在外设驱动程序库用户指南中找到详细信息。  

    此帖子也可能有用。

    https://e2e.ti.com/support/microcontrollers/other/f/908/p/617201/2273558?tisearch=e2e-sitesearch&keymatch=.vtable#2273558

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

    您好、Charles、

    感谢您的回复、

    因此、我知道这仅用于运行时中断处理程序、但我是否还必须更改矢量寄存器以指向 SRAM 中的相同位置或由 API 自动完成?

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

    您好!

     如果这是您所指的向量寄存器、则无需更改 NVIC_vtable。 请参阅以下代码。 将在 API 中更新 NVIC_vtable。

    void
    IntRegister (uint32_t ui32中断、void (* pfnHandler)(void)
    ){
    uint32_t ui32Idx、ui32Value;
    
    //
    //检查参数。
    //
    assert (ui32中断< NUM_INTERRUPTS);
    
    //
    //确保 RAM 矢量表正确对齐。
    //
    assert ((((uint32_t) g_pfnRAMVectors & 0x000003ff)== 0);
    
    //
    //查看 RAM 矢量表是否已初始化。
    //
    if (HWREG (NVIC_vtable)!=(uint32_t) g_pfnRAMVectors)
    {
    //
    //将矢量表从闪存的开头复制到 RAM 矢量
    //表。
    //
    ui32Value = HWREG (NVIC_vtable);
    for (ui32Idx = 0;ui32Idx < NUM_INTERRUPTS;ui32Idx++)
    {
    G_pfnRAMVectors [ui32Idx]=(void (*)(void)) HWREG (((ui32Idx * 4)+
    ui32Value);
    }
    
    //
    //将 NVIC 指向 RAM 矢量表。
    //
    HWREG (NVIC_vtable)=(uint32_t) g_pfnRAMVectors;
    }
    
    //
    //保存中断处理程序。
    //
    G_pfnRAMVectors [ui32Interrupt]= pfnHandler;
    }