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.

[参考译文] TMS320F28384S:CM -生成的输出文件中的.vtable RAM 段

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1314856/tms320f28384s-cm---vtable-ram-section-in-generated-output-file

器件型号:TMS320F28384S
主题中讨论的其他器件:C2000WARE

您好!
我将在 CM 内核上开发引导加载程序。

引导加载程序必须在 RAM 中运行、因此我已经在 RAM 中复制了所有必要目标模块的.text 和.const 段。

我还省略了项目中的预处理器符号_FLASH、以便使用 vectorTableRAM[]而不是 vectorTableFlash[]。

.vftable:> CMBANK0_SECTOR0、align (16)/*应用程序放置在闪存中的向量表*/
.vtable:> S0RAM /*应用程序放置于 RAM 中的矢量表*/

我已经启用了.hex 输出文件生成、并且我已经看到.VTABLE 段被添加到.hex 文件、即使它驻留在 RAM 中。

:020000042000DA
:2008000000C1FF1F01002000290D0120270D0120250D0120250D0120250D01200000000033
:2008200000000000000000000000250D0120250D012000000000250D0120250D0120250D0120250D01206C
:20084000250D0120250D0120250D0120250D0120250D0120250D0120250D0120250D012000
:20086000250D0120250D0120250D0120250D0120250D0120250D0120250D0120250D0120E0
:20088000250D0120250D0120250D0120250D0120250D0120250D0120250D0120250D0120C0
:2008A000250D0120250D0120250D0120250D0120250D0120250D0120250D0120250D0120250D0120A0
:2008C000250D0120250D0120250D0120250D0120250D0120250D0120250D0120250D012080
:2008E000250D0120250D0120250D0120250D0120250D0120250D0120250D0120250D0120250D012060
:20090000250D0120250D0120250D0120250D0120250D0120250D0120250D0120250D01203F
:20092000250D0120250D0120250D0120250D0120250D0120250D0120250D0120250D0120250D01201F

我使用.hex 文件进行固件更新、因此我希望它仅包含闪存地址。

为什么将.vtable RAM 段添加到输出文件?
是否有办法避免这种情况?
我是否应该保留_flash 预处理器符号、然后像处理其他.text 和.const 段一样、在 RAM 中复制.vftable?


谢谢!
卡洛

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

    您根本不使用 VTABLE 吗? 或者您正在使用 VTABLE、但想知道为什么它出现在十六进制文件中? 请注意、RAM 矢量表也在 CM 中断驱动程序中定义。 这启用了运行时寄存中断。 如果不使用 registerHandler 函数、则编译时根本不应包含 VTABLE

    此致、

    维纳

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

    您好 Veena:
    我使用 VTABLE 并注册几个 ISR:

    INTERRUPT_registerHandler (FAULT_NMI、NMIHandler)
    Interrupt_registerHandler (FAULT_SysTick、TickHandler)

    当引导加载程序在 RAM 中运行时、A 已通过消除_FLASH 预处理器符号来启用 vectorTableRAM[]定义、并且我已相应地设置矢量表地址:

    #ifdef _flash
    #pragma retain (vectorTableFlash)
    #pragma DATA_ALIGN (vectorTableFlash、1024U)
    #pragma DATA_SECTION (vectorTableFlash、".vftable")
    void (* const vectorTableFlash[])(void)=
    #else
    #pragma retain (vectorTableRAM)
    #pragma DATA_ALIGN (vectorTableRAM、1024U)
    #pragma DATA_SECTION (vectorTableRAM、".vtable")
    void (* const vectorTableRAM[])(void)=
    #endif
    {
    ...

    INTERRUPT_setVectorTableOffset ((uint32_t) VectorTableRAM)

    我想知道为什么.vtable 出现在十六进制文件中、因为它存储在 RAM 中。
     它没有在闪存中进行编程、所以不是没有用的吗?

    更进一步、是如何初始化矢量表 RAM?
    对于其他.text 和.const 段、我会执行从闪存显式复制到 RAM 的操作。

    .TI.ramfunc:{
      aa.obj (.text)
      BBB.obj (.text)
      BBB.obj (.const)
      ...
    }LOAD = CMBANK0_SECTOR0、
     RUN = E0RAM、
     Load_start (RamfuncsLoadStart)、
     Load_Size (RamfuncsLoadSize)、
     Load_End (RamfuncsLoadEnd)、
     RUN_START (RamfuncsRunStart)、
     RUN_SIZE (RamfuncsRunSize)、
     RUN_END (RamfuncsRunEnd)、
     对齐(16)

    memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、(size_t)&RamfuncsLoadSize);

    此致、
    卡洛

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

    即使 VTABLE 部分位于 RAM 部分、初始值也应存储在闪存中。 这由_c_int00函数复制到 RAM 中。

    例如、以下是 C2000ware 中 CM 示例的.map 文件输出-

    .vtable:load addr=00201690、load size=00000008字节、run addr=20000800、run size=00000140字节、compression=zero_init

    您可以看到、  在 RAM 中分配的矢量表 RAM 阵列位于  20000800。但加载地址(存储初始值的位置)是闪存的一部分。

    此致、

    维纳

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

    您好 Veena:
    在我的映射文件中、我找不到.vtable 段条目、其中加载表单 FLASH /运行表单 RAM 地址、就像您的一样。

    问题似乎是因为从项目中删除了_FLASH 预处理器符号。
    若要恢复此符号、映射文件实际上包含:
    -同时使用.vftable 和.vtable 段、而不仅仅是.vtable。
    -一个.vtable 条目,从闪存加载/从 RAM 地址运行,作为您的一个。

    在.vftable 段中分配 vectorTableFlash[]、而在.vtable 中分配 vectorTableRAM[]。
    我已经看到 vectorTableFlash[]是在 startup_cm.c 文件中定义的、而 vectorTableRAM[]是在 driverlib_cm 库的 interrupt.c 文件中定义的。

    哪个是 vectorTableFlash[]和 vectorTableRAM[]之间的关系?
    何时使用第一个、何时使用第二个?
    我需要在运行时、在初始化阶段之后、引导加载程序完全在 RAM 中运行、以便使用 vectorTableRAM[]。

    此外、在恢复_FLASH 预处理器符号后、我是否应该在初始化阶段继续使用以下指令设置 RAM 中的矢量表地址?

    INTERRUPT_setVectorTableOffset ((uint32_t) VectorTableRAM)

    这似乎是无用的,因为它是在 Interrupt_registerHandler ()函数中实现的,我用它来注册几个 ISR :


    interrupt_registerHandler (uint32_t interruptNum、void (* intHandler)(void))
    {
    uint32_t index、value;

    ...

    //
    //查看 RAM 矢量表是否已初始化。
    //
    if (HWREG (NVIC_BASE + NVIC_O_VTOR)!=(uint32_t) vectorTableRAM)
    {
    //
    //将矢量表从闪存的开头复制到 RAM 矢量
    //表。
    //
    值= HWREG (NVIC_BASE + NVIC_O_VTOR);
    for (index = 0U;index < NUM_INTERRUTS;index++)
    {
    vectorTableRAM[index]=(void (*)(void)) HWREG ((index * 4U)+ value);

    //
    //将 NVIC 指向 RAM 矢量表。
    //
    HWREG (NVIC_BASE + NVIC_O_VTOR)=(uint32_t) vectorTableRAM;

    //
    //保存中断处理程序。
    //
    VectorTableRAM[interruptNum]= intHandler;

    此致、
    卡洛