Linker 如何使用重置向量填充STM32上未使用的内存?

Linker 如何使用重置向量填充STM32上未使用的内存?,linker,embedded,cortex-m3,stm32,iar,Linker,Embedded,Cortex M3,Stm32,Iar,我正在使用带IAR的STM32F100值线处理器。我想用跳转到Reset_处理程序(或HardFault_处理程序)来填充未使用的代码内存。如何使用IAR实现这一点?假设您使用的是嵌入式工作台,在“项目选项->链接器”类别下,有一个“校验和”选项卡,该选项卡具有填充未使用内存以及计算内存校验和等选项。当然,这就引出了为什么要用处理程序地址填充内存的问题。如果您想捕获杂散执行,那么内存保护单元就是很好的选择。如果需要,大多数十六进制文件生成器都会填充内存,您可能可以在IDE中完成,如果没有,当然可

我正在使用带IAR的STM32F100值线处理器。我想用跳转到Reset_处理程序(或HardFault_处理程序)来填充未使用的代码内存。如何使用IAR实现这一点?

假设您使用的是嵌入式工作台,在“项目选项->链接器”类别下,有一个“校验和”选项卡,该选项卡具有填充未使用内存以及计算内存校验和等选项。当然,这就引出了为什么要用处理程序地址填充内存的问题。如果您想捕获杂散执行,那么内存保护单元就是很好的选择。

如果需要,大多数十六进制文件生成器都会填充内存,您可能可以在IDE中完成,如果没有,当然可以为您完成

但是,简单地将未使用的闪存留空(0xffff)将生成无效指令异常,并最小化图像大小


请注意,跳转到重置处理程序与执行重置不同-硬件状态将是不确定的。更好的方法可能是启用看门狗并用
B.
(分支到自身)0xE7FE填充内存。看门狗将超时并创建真正的重置。

STM32F1系列不包括内存保护单元。我在选项中看到了内存填充选项。我的问题是,每次编译时,Reset_处理程序在内存中的位置都会发生变化。我希望有人知道自动实现的诀窍。STM32F1系列没有内存保护单元。悲哀的对关键系统非常有用。您可以用无效指令填充它,捕获故障并触发重置。不幸的是,实际上触发CM3重置的是多条指令,所以不能真正用一条指令重置。如果您没有使用
SVCall
,您可以使用它来处理重置,并使用指令
SVC 0
@amo填充代码内存:如果您实际上可以强制执行异常而不是编写跳转代码,则异常处理程序的位置应该无关紧要。在这种情况下,生成异常不是我们想要的。在一个必须在没有干预的情况下继续运行的系统中,它需要在发生异常时安全地重置自身。在开发过程中,我们将允许它崩溃,以便发现并修复此类错误,但在部署过程中,它需要自行恢复。你的看门狗想法很有趣,我会试试。但是如果你可以生成一个异常,那么异常处理程序可以通过系统控制块请求系统重置,最终应该在重置处理程序处完成(我想)。你确定
0xFFFF
是无效指令吗?IAR似乎总是很乐意为我拆解它,而且在我看来,当我的程序最终陷入困境时,内核将一直执行它,直到它到达未实现的地址。@RJP:不,我不是,但根据我的经验,将PC设置为空白区域会导致处理器重置-可能是通过无效指令以外的方式。