我一直在重新配置 MPU 设置以测试堆栈溢出机制、并发现重新配置许多 MPU 区域(即使它们是使用与其当前配置完全相同的设置进行"重新配置"的) 将我们尝试擦除的第一个扇区的擦除时间最多延长100%。
虽然这不是一个示例抑制器(至少此时)、但我们需要了解导致扇区擦除时间增加的原因、以防我们在将来无意中更改具有类似效果的内容。
我们的 MPU 最初是在引导加载程序中配置的、这一切正常、对闪存扇区擦除时间没有影响。
为了测试堆栈溢出保护、我重新配置了许多 与堆栈相关的 MPU 区域(精确地说、4个区域-区域4、5、6和7)。 我在我们的应用程序代码中这样做是为了强制发生权限错误、 但是、我们发现通过 CAN 连接对应用程序进行重新编程的任何后续尝试都失败了-这最终是由于我们的闪存等待函数发生了(可能限制不必要)超时、该超时会等待 FMSTAT 寄存器忙标志。 应该注意的是、在重新配置 MPU 和擦除应用程序闪存之间、处理器会通过中止处理程序或通过正常编程机制进行复位(使用 ESM nERROR 引脚)。
如果我仅重新配置上述4个区域中的3个、则闪存等待超时不会跳闸、并且闪存扇区擦除时间仅略有增加-大约为10%。
如果我简单地使用这些区域已包含的值重新编程这些区域(或者、实际上是区域8和9、它们是我们的中止和 UNDEF 堆栈陷阱)、我会看到完全相同的行为。
我们的基本 MPU 设置如下:
区域 | 基地址 | 尺寸和使能 | 访问控制 | 说明 |
0 | 0x00000000 | 0x0000002B | 0x00000308 | 编程闪存 |
1 | 0xF0000000 | 0x0000002D | 0x00001308 | 组7 EEPROM |
2. | 0x80000000 | 0x0000002D | 0x00000308 | RAM |
3. | 0xFC000000 | 0x00000033 | 0x00001301 | 外设寄存器 |
4. | 0x08000020 | 0x00000009 | 0x00001008 | 用户堆栈保护 |
5. | 0x08000820 | 0x00000009 | 0x00001008 | SVC 堆栈防护 |
6. | 0x08001020 | 0x00000009 | 0x00001008 | FIQ 堆叠防护装置 |
7. | 0x08001820 | 0x00000009 | 0x00001008 | IRQ 堆栈保护 |
8. | 0x08002820 | 0x00000009 | 0x00001008 | 中止堆栈保护 |
9. | 0x08002C20 | 0x00000009 | 0x00001008 | UNDEF 堆栈保护 |
10. | 未使用 | 不适用 | 不适用 | 不适用 |
11. | 0xFFF80000 | 0x00000025 | 0x00001100 | 系统模块 |
如果有任何帮助,我们将不胜感激。
此致、
Steve