ARM M3重定位代码 - >故障

时间:2017-05-17 08:51:09

标签: arm cortex-m3 relocation

ARM Cortex M3(LPC1519)

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

当我使用SEGGER Ozone调试器时,我可以在主要的'处设置断点。并逐步完成固件。 但是,当我在代码中运行更大的reagion(到另一个断点)时,我总会得到一些意想不到的中断:

  • UsageFault_Handler
  • BusFault_Handler

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

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

有人遇到类似的问题吗?

谢谢, 约翰

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

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

  

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

实际上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等触发的所有中断似乎都以异常结束,但我找不到原因。

1 个答案:

答案 0 :(得分:2)

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

ARM Doku我找到了这句话:

  

设置TBLOFF时,必须将偏移量与数字对齐   向量表中的异常条目。最小对齐为32   单词,足以容纳16个中断。如需更多中断,请调整   通过四舍五入到下一个2的幂来对齐。例如,如果你   要求21个中断,对齐必须在64字边界上   因为所需的表格大小是37个单词,而下一个单词的大小是2   是64.有关对齐详细信息,请参阅供应商文档   你的设备。

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