在 ARM Cortex-M4 上用 assert(false) 之类的东西填充已擦除的内存
Fill erased memory with something like assert(false) on ARM Cortex-M4
我正在进行一个项目,其中一部分固件将在产品出厂前被擦除。我们有一个命令来擦除这个工厂功能。在未首先检查工厂区域的状态以确保其完好无损之前,不得致电该工厂 space。但是,如果我们犯了一个错误,并且在没有首先检查的情况下以某种方式调用了这些工厂函数之一,我希望固件以一种非常明显的方式重置。
我做了一个小测试,如果我在这个受限制的 space 被擦除后调用一个存在的函数(所以,分支到 0xFFFF FFFF FFFF FFFF)它会导致我的锁定重置微控制器,这很好。但如果可能的话,我想更进一步。
我的处理器是 EFM32 Wonder Gecko,它使用 Thumb-2 扩展指令集。所以我想我应该能够用四个 16 位指令的重复模式填充内存。那是对的吗?如果是这样,我可以使用这四个指令执行哪些操作?
您要查找的指令是UDF
,永久未定义。有关详细信息,请参阅 ARM v7-M 体系结构参考手册。这是 SVC 编码的子集。
T1 编码:b1101_1110_xxxx_xxxx
T2 编码:b1111_0111_1111_xxxx_1010_xxxx_xxxx_xxxx
上面的 'x' 被忽略,你可以在这里使用任何东西,并且相当有信心,如果作为指令获取执行,这些编码将始终导致 undef 异常。如果使用T1编码,就不会出现半字对齐的混淆。
将您需要的实际代码放在 undef 处理程序中,它将能够在重新启动之前对堆叠的 PC 值进行操作(例如,将其存储在某处,或转储以进行调试)。
我正在进行一个项目,其中一部分固件将在产品出厂前被擦除。我们有一个命令来擦除这个工厂功能。在未首先检查工厂区域的状态以确保其完好无损之前,不得致电该工厂 space。但是,如果我们犯了一个错误,并且在没有首先检查的情况下以某种方式调用了这些工厂函数之一,我希望固件以一种非常明显的方式重置。
我做了一个小测试,如果我在这个受限制的 space 被擦除后调用一个存在的函数(所以,分支到 0xFFFF FFFF FFFF FFFF)它会导致我的锁定重置微控制器,这很好。但如果可能的话,我想更进一步。
我的处理器是 EFM32 Wonder Gecko,它使用 Thumb-2 扩展指令集。所以我想我应该能够用四个 16 位指令的重复模式填充内存。那是对的吗?如果是这样,我可以使用这四个指令执行哪些操作?
您要查找的指令是UDF
,永久未定义。有关详细信息,请参阅 ARM v7-M 体系结构参考手册。这是 SVC 编码的子集。
T1 编码:b1101_1110_xxxx_xxxx
T2 编码:b1111_0111_1111_xxxx_1010_xxxx_xxxx_xxxx
上面的 'x' 被忽略,你可以在这里使用任何东西,并且相当有信心,如果作为指令获取执行,这些编码将始终导致 undef 异常。如果使用T1编码,就不会出现半字对齐的混淆。
将您需要的实际代码放在 undef 处理程序中,它将能够在重新启动之前对堆叠的 PC 值进行操作(例如,将其存储在某处,或转储以进行调试)。