在ARM Cortex-M4上用类似断言(false)的内容填充已擦除的内存

在ARM Cortex-M4上用类似断言(false)的内容填充已擦除的内存,arm,microcontroller,cortex-m,Arm,Microcontroller,Cortex M,我正在从事一个项目,其中一部分固件将在产品出厂前被擦除。我们有一个命令来删除此工厂功能。在未首先检查工厂区域的状态以确保其完好无损的情况下,不得呼叫此工厂区域。但是如果我们犯了一个错误,没有先检查就调用了这些工厂函数中的一个,我希望固件以一种非常明显的方式复位 我做了一个小测试,如果我调用了一个函数,该函数在被擦除后存在于这个受限空间中(因此,分支到0xFFFF FFFF FFFF),它会导致我的微控制器上的锁定重置,这很好。但如果可能的话,我想更进一步 我的处理器是一个使用Thumb-2扩展指

我正在从事一个项目,其中一部分固件将在产品出厂前被擦除。我们有一个命令来删除此工厂功能。在未首先检查工厂区域的状态以确保其完好无损的情况下,不得呼叫此工厂区域。但是如果我们犯了一个错误,没有先检查就调用了这些工厂函数中的一个,我希望固件以一种非常明显的方式复位

我做了一个小测试,如果我调用了一个函数,该函数在被擦除后存在于这个受限空间中(因此,分支到0xFFFF FFFF FFFF),它会导致我的微控制器上的锁定重置,这很好。但如果可能的话,我想更进一步


我的处理器是一个使用Thumb-2扩展指令集的处理器。所以我想我应该能够用四条16位指令的重复模式来填充内存。对吗?如果是这样的话,我可以用这四条指令做些什么呢?

您要查找的指令是
UDF
,通常未定义。有关详细信息,请参阅ARM v7-M架构参考手册。这是SVC编码的一个子集

T1编码:b1101_1110_xxxx_xxxx

T2编码:b1111\U 0111\U 1111\U xxxx\U 1010\U xxxx\U xxxx\U xxxx

上面的“x”被忽略了,您可以在这里使用任何东西,并且可以非常确信,如果将这些编码作为指令获取以执行,它们将始终导致undef异常。如果使用T1编码,则不会混淆半字对齐


将您需要的实际代码放入undef处理程序,它将能够在重新启动之前对堆叠的PC值进行操作(例如,将其存储在某处,或转储以进行调试)。

我相信Wonder Gecko有一个内存保护单元。您是否考虑过使用它来阻止工厂功能所在地址的执行?内存保护故障会给你比处理器锁定强制重置更好的控制。只是一个想法:用NOP指令的操作码填充内存。在末尾放一个无休止的循环,如
jmp$
或任何你喜欢的循环。@andymango这是一个很好的建议。该部件具有可选的ARM核心MPU,可保护多达8个区域。看起来我可以使用CMSIS中的mpu armv7.h来配置它。谢谢,我正在查看armv7-m架构参考手册第471页的A7.7.191节。我试图用
静态const uint16_udf_指令[]={0xDEAD,0xDEAD}填充整个工厂范围,将保留位设为AD。我在该范围内的绝对地址设置断点,并尝试对该地址进行函数调用。我看到它触发了一个硬故障(IPSR ISR编号3),而不是一个使用故障(IPSR ISR编号6)。我可以看到CFSR中的UFSR字段,看起来好像设置了UNDEFINSTR。看来这一切正常。我还可以看到HFSR已强制设置。