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.

[FAQ] [参考译文] [常见问题解答]使用 TI-RTOS 时、能否使用 IntRegister 更新矢量表?

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/849627/faq-can-i-update-the-vector-table-with-intregister-when-using-ti-rtos

我要将应用从非 RTOS 平台迁移到 TI-RTOS。 我的应用程序崩溃或获得"E_unpluginedInterrupt: unplugged interrupt flagged:INTR#19"。 我有以下代码可将矢量表插入 TI-RTOS 应用程序中。 这是错误的吗?

I2CIntRegister (I2C0_BASE、i2cCB); 

这用于 CortexM 器件。

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

    简短的回答:是的、这是错误的。  TI-RTOS Hwi 模块应用于插入中断、而不是使用 IntRegister。

    答案很长...

    TI-RTOS 内核(SYS/BIOS)管理矢量表。 作为启动的一部分、它将矢量表复制到 RAM 中(以便可以修改)并将 Hwi_NVIC.VTOR (0xE000ED08矢量表偏移寄存器)设置到这个 RAM 位置。

    请注意、RAM 矢量表的位置由以下设置决定(器件的默认值为0x20000000)。 这是您在映射文件中看到的 ti_sysbios_family_arm_m3/Hwi_ramVectors 符号。

    因此寿命很长、然后是 IntRegister (I2CIntRegisters 调用的) 、它会进行以下检查( 添加了绿色注释)。

      //NVIC_vtable = 0xE000ED08、该值现在为0x20000000
      // g_pfnRAMVectors 由.vtable_ram 的位置确定。 注意:在基于 TI-RTOS 的应用中
      //应用程序我们没有此部分
      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);
        }

        //
        // RAM 矢量表中的 Point NVIC。
        //
        HWREG (NVIC_vtable)=(uint32_t) g_pfnRAMVectors;
      }

    注意:您的器件的确切 driverlib 函数可能略有不同。

    因此、首次调用 IntRegister 时、它会从闪存复制矢量表、更改矢量表偏移寄存器、然后插入新的中断。 这完全打乱了 SYS/BIOS Hwi 模块,因为你基本上从它中窃取了矢量表,添加了一个矢量,其签名和要求(例如要保存的寄存器)与 Hwi 模块不匹配,最重要的是,插入了运行时擦除的 Hwi 矢量中的任何矢量。

    Todd