2.4 CMSIS 函数 前面说了那么多,我自己都有点晕了。。。对于用户来说,如何正确使用 Cache 才是关键!
下面这张图是在文档 PM0253 中截取的,Cache 相关操作的函数在 cmsis/include/core_cm7.h 头文件中声明。从函数名中可以知道,包括四种 cache 操作:enable、disable、clean 和 invalidate。
查看源代码发现,除了表中的8个函数,还有以下3个函数(都是以 _by_Addr 结尾): void SCB_InvalidateDCache_by_Addr(uint32_t *addr, int32_t dsize);void SCB_CleanDCache_by_Addr(uint32_t *addr, int32_t dsize);void SCB_CleanInvalidateDCache_by_Addr(uint32_t *addr, int32_t dsize); 好,那下面我们一一来了解这些函数吧。 SCB_EnableICache() 和 SCB_EnableDCache() 使能 I-cache 或 D-cache。 SCB_DisableICache() 和 SCB_DisableDCache() 禁用 I-cache 或 D-cache。 SCB_InvalidateICache() 使 I-cache 无效,I-cache 被 invalidate 之后,当读取指令时,会忽略相应的 cache-line 中的内容(因为被 validate 了),而从真实的物理地址中去获取相应的指令。 SCB_InvalidateDCache() 使 D-cache 无效,D-cache 被 invalidate 之后,当有 Host(如 core,DMA 等)读取数据时,会忽略相应的 cache-line 中的内容( 因为被 validate 了),从真实的物理地址中去获取相应的数据。 SCB_InvalidateDCache_by_Addr() 根据地址信息无效其对应的 cache-line。 SCB_CleanDCache() Clean 所有的 cache-line,即将 dirty 的 cache-line 全部写到 cache line 对应的真实的物理地址中所谓的 drity 属性,即写操作时, 更新了相应的 cache-line,但是没有更新到真实的物理地址,而这个 clean 的动作, 就是将 cache 中的内容更新到真实的物理地址中。 SCB_CleanDCache_by_Addr() 根据地址信息 clean 其对应的 cache-line。 SCB_CleanInvalidateDCache_by_Addr() 根据地址信息 clean 并 invalidate 其对应的 cache-line。
|