最近工作中出现一个问题,一个下位机的RPC接口在被调用的过程中很容易出现中断溢出的问题,在排查所有代码效率和逻辑的问题无果后,怀疑是这条RPC执行过程中操作了Flash导致的。

在翻阅手册的过程中发现在《STM32F4xxReferenceManual》的Flash章节中有如下内容:

3.5 擦除和编程操作

执行任何 Flash 编程操作(擦除或编程)时, CPU 时钟频率 (HCLK) 不能低于 1 MHz。如果
在 Flash 操作期间发生器件复位,无法保证 Flash 中的内容。
在对 STM32F4xx 的 Flash 执行写入或擦除操作期间,任何读取 Flash 的尝试都会导致总线
阻塞。只有在完成编程操作后,才能正确处理读操作。这意味着,写/擦除操作进行期间不能
从 Flash 中执行代码或数据获取操作。

所以原因其实很简单,就是内核在擦写Flash过程中无法同时访问Flash中的代码,如果不将代码搬运到RAM运行,则无法避免的出现内核等待Flash操作执行完后再响应中断的问题。