工具/软件:
我正在 CC1311P3上实现引导加载程序。 我使用 Timer0作为计时器来触发 LED 闪烁、以便知道引导加载程序(或应用程序)何时运行。 我注意到、当我使用计时器并跳转到应用程序时、系统转至故障处理程序。 即使在跳转到应用程序之前在引导加载程序中调用 Timer_STOP()和 Timer_Close()、也会发生这种情况。 如果我删除引导加载程序中的 Timer_*调用、则应用程序似乎可以正常运行。
可以修复此问题、以便使用引导加载程序中的计时器吗?
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.
工具/软件:
我正在 CC1311P3上实现引导加载程序。 我使用 Timer0作为计时器来触发 LED 闪烁、以便知道引导加载程序(或应用程序)何时运行。 我注意到、当我使用计时器并跳转到应用程序时、系统转至故障处理程序。 即使在跳转到应用程序之前在引导加载程序中调用 Timer_STOP()和 Timer_Close()、也会发生这种情况。 如果我删除引导加载程序中的 Timer_*调用、则应用程序似乎可以正常运行。
可以修复此问题、以便使用引导加载程序中的计时器吗?
引导加载程序和应用程序基本上都完成了。 我从示例开始、但它们现在比它们更复杂一些。
simplelink_cc13xx_cc26xx_sdk_7_41_00_17
TI-CGT-armllvm_4.0.2.LTS (在 ccs2011下)
我使用引导加载程序工程生成了 CCFG。 引导加载程序存储在 0x00050000、CCFG 已将闪存矢量表的地址设置为 0x00050000。
我使用我在论坛上找到的此函数跳转到应用程序(加载到0x2000中、有一个图像标头存储在0x0中):
void jumpToPrgEntry(uint32_t *vectorTable) { /* Reset the SP with the value stored at vector_table[0] */ __asm volatile ("MSR msp, %0" : : "r" (vectorTable[0]) : ); /* Jump to the Reset Handler address at vector_table[1] */ ( (void (*)(void)) (*(vectorTable + 1)) )(); } ... // Jump to app jumpToPrgEntry((uint32_t*)0x2000);
我认为有趣的是、我们不需要像在其他 CPU 上那样在 NVIC 中设置 VTOR。 可能是因为 ROM 处理了许多 IRQ?
David、
您能共享核心寄存器的转储吗? 我想看看 你们看到了什么样的例外情况。
此外、您是否在引导加载程序中使用 TI-RTOS 或根本没有 RTOS?
在我们的 mcuboot 示例中、请注意、我们还会重置栈指针:
此致、
Arthur
我使用 No RTOS。 调用 Timer_STOP()后 FaultISR 内的寄存器的屏幕截图。
调用 Timer_STOP()时出现故障。 如果我注释掉 Timer_STOP()和 Timer_Close()、引导加载程序会继续跳转函数、但在应用程序中会出现故障。 计时器 API 中似乎出现问题。
关于跳转代码、您引用的汇编代码和我的 C 代码看起来是等效的。
关于 VTOR、每个映像(引导加载程序和应用程序)都应有自己的矢量表。 通常、您将 VTOR 指向要运行的映像的表、或在映像的初始化代码期间对其进行设置。 仅设置 MSP/PC 与设置 VTOR 不同。 在这种情况下、我必须假设(a) SimpleLink / ROM 驱动程序初始化代码正在处理 VTOR、或(B)向量在 ROM 代码中设置为地址(因此、应用程序与引导加载程序的地址不会发生变化)。 这两个中的任何一个都正确吗?
显然、IRQ 适用于引导加载程序和 APP 中的计时器和 UART、因此我必须假设矢量指向 ROM 或其他通用处理程序。 我想这会让问题回到计时器 API 问题上来。