ARM M3 重定位代码 -> 故障

ARM M3 relocate code -> faults

ARM 皮质 M3 (LPC1519)

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

当我使用 SEGGER Ozone 调试器时,我可以在 'main' 处设置断点并单步调试固件。 但是,当我 运行 代码中的较大区域(到另一个断点)时,我总是会遇到一些意外中断:

当我一个命令一个命令地执行代码时,这不会发生。 它接缝中断将无法正常工作。

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

有人遇到过类似的问题吗?

谢谢, 约翰

PS:抱歉,我无法提供最小样本,因为我不知道从哪里开始

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

Mis-alligned memory read: Address: 0x00001596, NumBytes: 8, Alignment: 4 (Word-aligned)

事实上0x1596不能被4除所以错误是有道理的,但这怎么可能呢?编译器不应该负责对齐结构中的变量吗?

编辑 - 附加信息: 似乎这个错误总是在触发 USART0 IRQ(txReady)时发生。 我有可能遇到中断问题吗? ARM Cortex 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);
}

编辑 - 附加信息: 好像USART、CCTimer等触发的Interrupts都是exception,但是我找不到原因。

我发现了为什么中断不起作用。

ARM Doku中我找到了这句话:

When setting TBLOFF, you must align the offset to the number of exception entries in the vector table. The minimum alignment is 32 words, enough for up to 16 interrupts. For more interrupts, adjust the alignment by rounding up to the next power of two. For example, if you require 21 interrupts, the alignment must be on a 64-word boundary because the required table size is 37 words, and the next power of two is 64. See your vendor documentation for the alignment details for your device.

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