这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » 使用ICache不要忽略这个例外

共2条 1/1 1 跳转至

使用ICache不要忽略这个例外

院士
2026-02-18 15:44:10   被打赏 50 分(兑奖)     打赏

icache,Instruction Cache,高性能MCU的指令缓存优化。其是STM32H5系列MCU的核心组件,采用哈佛架构的分离式指令/数据总线设计。其核心功能是通过预取和缓存高频访问的指令与常量数据,减少CPU访问Flash的延迟。当处理器需要执行指令时,ICache会优先从高速缓存中读取,避免直接访问较慢的Flash存储器,从而显著提升程序执行效率。

这好的性能组件,它也有适用的例外情况,是什么呢?

icache01.jpg

从上面这张截图可以看到,cache不能到达的地方有OTP区,RO区和data area区。所以,在读取上述flash区域的数据内容时,需要关闭掉icache功能。

直接关闭icache功能,貌似有点简单粗暴了。我们还可以使用MPU的功能来做相关配置,从而使得当读取上述区域时,不再需要手动关闭了。办法也在上面图片中的标注上有所说明了——借助 MPU 来改变局部区域的缓存策略。

我们以读取芯片的UID为例。芯片的UID数据保存在Flash的RO区域,地址为0x08FFF800。如果我们不关闭icache,直接读取的话,系统将触发一次Bus Fault,程序也将跳转到Hardfault_handler里面。所以,我们要配置MPU,将此区域划为例外情况。

/**
* @brief Configures the main MPU regions.
* @param None
* @retval None
*/
void MPU_Config(void)
{
MPU_Region_InitTypeDef MPU_InitStruct;
MPU_Attributes_InitTypeDef MPU_AttributesInit;
/* Disable MPU */
HAL_MPU_Disable();
LAT1622
LAT1622 - Rev 1.0 page 4/6
/* Define cacheable memory via MPU */
MPU_AttributesInit.Number = 0;
MPU_AttributesInit.Attributes = MPU_NOT_CACHEABLE;
HAL_MPU_ConfigMemoryAttributes(&MPU_AttributesInit);
/* Configure UID region as Region Number 0 */
MPU_InitStruct.Enable = MPU_REGION_ENABLE;
MPU_InitStruct.BaseAddress = 0x08FFF800;
MPU_InitStruct.LimitAddress = 0x08FFFFFF;
MPU_InitStruct.AccessPermission = MPU_REGION_ALL_RO;
MPU_InitStruct.AttributesIndex = MPU_ATTRIBUTES_NUMBER0;
MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
MPU_InitStruct.Number = MPU_REGION_NUMBER0;
MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_DISABLE;
HAL_MPU_ConfigRegion(&MPU_InitStruct);
/* Enable MPU (any access not covered by any enabled region will cause a fault) */
HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
}

在进行上述配置之后,程序在代码访问 UID 之前,系统将先用 MPU将UID所在地址区域的缓存属性关闭,这样也就不会导致进入到hardfault_handler里面了。




关键词: ICache     例外    

助工
2026-02-20 09:29:38     打赏
2楼

ICache这里还有一个坑呢呀!

楼主的经验好丰富啊


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]