ARM Cortex M3(LPC1519)
我编写了一个bootloader(到目前为止似乎工作),它在flash中运行并将程序写入Flash(引导加载程序后面)。 程序编写并开始正常运行(至少在调试时)。
当我使用SEGGER Ozone调试器时,我可以在主要的'处设置断点。并逐步完成固件。 但是,当我在代码中运行更大的reagion(到另一个断点)时,我总会得到一些意想不到的中断:
当我通过命令执行代码命令时,这不会发生。 它接缝中断将无法正常工作。
当我将其闪存到地址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等触发的所有中断似乎都以异常结束,但我找不到原因。
答案 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获取有关程序的信息,引导程序可以验证)。