ARM M3重定位代码 – >故障

ARM Cortex M3(LPC1519)

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

当我使用SEGGER Ozone调试器时,我能够在’main’设置断点并逐步执行固件.
但是,当我在代码中运行更大的reagion(到另一个断点)时,我总会得到一些意外的中断:

> UsageFault_Handler
> BusFault_Handler
>等

当我通过命令执行代码命令时,这不会发生.
它接缝中断将无法正常工作.

当我将其闪存到地址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不起作用.

在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(我使用第一个128byte获取有关程序的信息,引导程序可以验证).

点赞