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.
我要将应用从非 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