这可能是一个愚蠢的问题,但我对ARM CMSIS缓存操作函数的措辞有点困惑。
ARM CMSIS公开了可以“清理”缓存的功能,可以“使缓存”无效的功能,以及同时执行这两项功能的一组功能。
这些实际做的事情并不清楚,arm documentation坦率地让我感到困惑:
- 您可以在一次操作中使整个数据缓存(刷新数据缓存)无效,而无需回写脏数据。
- 您可以在不回写任何脏数据的情况下使各个行无效(刷新数据缓存单个条目)。
- 您可以逐行进行清洁。只有脏线时才会通过写缓冲区写回数据 遇到了,清理后的行仍然在缓存中(干净的数据 缓存单项)。您可以使用它们来清理缓存行 数据高速缓存中的索引,或者它们在内存中的地址。
- 您可以使用数据缓存中的索引或其中的地址,在一次操作中清理和刷新单个行 存储器中。
我的理解是,缓存中的“刷新”数据将导致其被写回主存储器,并且缓存中的“无效”数据将导致处理器在下次尝试访问数据时重新读取主存储器有问题。
但是,ARM文档似乎暗示刷新操作实际上是一个失效操作,而我一直在想的是刷新操作实际上是一个“干净”的操作。 / p>
我认为我只是错误地解释了文档。有人能指出我正确的方向吗?
我是专门为皮质M7开发的,如果它是相关的。
答案 0 :(得分:1)
来自armv7-m ARM ARM,他们有这个文本。
这些操作的定义是:
清洁
缓存清理操作可确保观察者所做的更新 控件高速缓存对其他可以访问的观察者可见 存储器在执行操作的位置。一旦 Clean已经完成,新的内存值保证 例如,对于执行操作的点是可见的 到了统一的地步。从a清理缓存条目 缓存可以覆盖另一个观察者写入的内存 仅当条目包含由a写入的位置时 观察者在该内存位置的可共享域中。
无效
缓存无效操作可确保更新可见 观察者在无效的位置访问内存 已定义的对于控制缓存的观察者可见。这个 可能会导致失去对受影响的位置的更新 使访问的观察者写入的操作无效 缓存。如果无效操作的条目的地址 没有Normal Cacheable属性,或者缓存是否 禁用,然后无效操作也确保此地址 缓存中不存在。
我读到这样说干净将把缓存中的项目保存到下一级别的内存并将其写出来(像我这样的人称为刷新)。如果存在未写入的值,则无效关注doest,它会准备缓存,就好像没有要保存的值,准备好接受新的地址和数据。
这就是我读它的方式......