ARM M3重新定位代码->;缺点

ARM M3重新定位代码->;缺点,arm,cortex-m3,relocation,Arm,Cortex M3,Relocation,手臂皮质M3(LPC1519) 我已经编写了一个引导加载程序(到目前为止似乎可以工作),它在flash中运行,并将程序写入flash(在引导加载程序后面)。 程序被写入并开始正常运行(至少在调试时) 当我使用SEGGER Ozone调试器时,我能够在“main”处设置断点并逐步完成固件。 但是,当我在代码中运行一个更大的区域(到另一个断点)时,总会遇到一些意外的中断: UsageFault\u处理器 总线处理器 等等 当我一步一步地遍历代码命令时,这种情况不会发生。 很明显,中断不能正常工作

手臂皮质M3(LPC1519)

我已经编写了一个引导加载程序(到目前为止似乎可以工作),它在flash中运行,并将程序写入flash(在引导加载程序后面)。 程序被写入并开始正常运行(至少在调试时)

当我使用SEGGER Ozone调试器时,我能够在“main”处设置断点并逐步完成固件。 但是,当我在代码中运行一个更大的区域(到另一个断点)时,总会遇到一些意外的中断:

  • UsageFault\u处理器
  • 总线处理器
  • 等等
当我一步一步地遍历代码命令时,这种情况不会发生。 很明显,中断不能正常工作

当我将其闪存到地址0x00000000时,程序运行正常。 我更改了链接器脚本,以便原点位于后面的偏移量(引导加载程序放置固件的位置)

有人经历过类似的问题吗

谢谢, 约翰

PS:对不起,我不能提供最低限度的样品,因为我不知道从哪里开始

编辑-其他信息: 我现在下载了一个较小的项目,可以在调试器中找到错误。 结构中有一个uint32_t变量似乎触发了错误。 它说:

错误对齐的内存读取:地址:0x00001596,字节数:8,对齐方式:4(字对齐)

事实上,0x1596不能被4偏离,因此错误是合理的,但这怎么可能呢?编译器不应该注意在结构中对齐变量吗

编辑-其他信息: 当触发USART0 IRQ(txReady)时,似乎总是会发生此错误。 我可能对中断有问题吗? 手臂皮质SysTick(SysTick_Handler)运行良好

[[noreturn]]
inline void startFirmware(std::uint32_t address) noexcept
{
    //<removed checks for correct address>

    //pointer to the address
    const auto ptr = reinterpret_cast<std::uint32_t*>(address);

    // Set vector table offset
    SCB->VTOR = address & SCB_VTOR_TBLOFF_Msk;

    // Set top stack handler
    __set_MSP(*ptr);

    // Get address of reset handler
    const auto resetHandler = *(ptr + 1);

    // Jump to reset handler
    reinterpret_cast<internal::ResetHandlerFunction>(resetHandler)();
    while(true);
}
[[noreturn]]
内联无效启动固件(std::uint32_t地址)无例外
{
//
//指向地址的指针
const auto ptr=重新解释(地址);
//设置向量表偏移量
SCB->VTOR=地址&SCB\u VTOR\u TBLOFF\u Msk;
//机顶盒堆栈处理程序
__设置MSP(*ptr);
//获取重置处理程序的地址
const auto resetHandler=*(ptr+1);
//跳转到重置处理程序
重新解释(重置处理程序)();
虽然(正确);
}
编辑-其他信息:
似乎所有由USART、CCTimer等触发的中断都以异常结束,但我无法找到原因。

我找到了中断不起作用的原因

我在书中发现了这句话:

设置TBLOFF时,必须将偏移量与 向量表中的异常项。最小对齐长度为32 字数,最多可中断16次。如需更多中断,请调整 通过四舍五入到二的下一次幂进行对齐。例如,如果你 需要21次中断,对齐必须在64字边界上 因为所需的表大小是37个字,下一次幂是2 她是64岁。有关详细信息,请参阅供应商文档 你的设备


这意味着,当您有超过16个中断时,您不能将SCB->VTOR放置到32字对齐的地址(以0x80结尾),而只能放置到64字对齐的地址(以0x00结尾)。在我的例子中,是0x1100而不是0x1080(我使用第一个128字节来获取有关程序的信息,引导加载程序可以验证这些信息)。

您是否已将向量表重新定位到主应用程序的开头?事实上,0x1594可以被4整除(但不能被8整除)!是的,但不是0x1596。我在错误消息中说的没错,但在下面的句子中把它搞糟了-(修复-thanksI已经设置了向量表的地址:SCB->VTOR=address;我还设置了主堆栈指针:uu set_MSP(*ptr);其中ptr是指向“address”的指针