首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ARM Cortex M7:高速缓存能清除由DMA设备所做的更改吗?

ARM Cortex M7:高速缓存能清除由DMA设备所做的更改吗?
EN

Stack Overflow用户
提问于 2021-07-20 17:36:54
回答 1查看 241关注 0票数 0

我正在为STM32H743 SoC中的DMA总线主设备开发一个驱动程序,该驱动程序由Cortex M7 CPU驱动。假设我有两个内存位置,xy,它们映射到相同的缓存行,这是在普通的可写可缓存内存中,并假设以下事件序列:

y

  • DMA

  • x = x1, y = y1开始,缓存行无效。

  • CPU读取设备集x = x2,在内存中
  1. CPU设置
  2. 清除缓存行。

G 219

完成后,从DMA设备x = ?的角度出发

我认为DMA会看到x = x1,这是我的推理:

  • 当CPU在2.中读取y时,缓存线将被拉入缓存中。它读取x = x1, y = y1,并被标记为有效。DMA然后更新内存中的x,但是变化没有反映在缓存行中。当CPU设置y = y2时,缓存线被标记为脏。当CPU清除缓存行时,
  • 会将其写回内存。<

>H 236H 137当它被写回内存时,它会读取x = x1, y = y2,从而将DMA所做的更改覆盖到内存中。

这听起来像是一个很好的推理吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-21 05:11:06

很快,如果我把你的问题说对了,你的描述是正确的。

从“两个内存位置,x和y”的问题上看,还不太清楚。

根据你在描述中使用它们的方式,我认为它大概是两个指针。

代码语言:javascript
运行
复制
int* x, y;

“从x = x1, y = y1开始”意味着为该指针分配地址,例如

代码语言:javascript
运行
复制
x = (int*)(0x2000); // x = x1
y = (int*)(0x8000); // y = y1

现在来问你的问题:“从DMA设备的角度来看,在5.完成之后,x= ?”

因此,在第3步之后,x = x2, y = y1在内存中,x = x1, y == y1在缓存中。

步骤4之后,内存中的x = x2, y = y1,缓存中的x = x1, y = y2

x/y指针在内存中的访问值,缓存x/y指针的访问值。因为缓存和内存在那个阶段不同步(缓存是脏的),CPU和DMA将得到不同的值。

最后在第五步之后..。

那得看情况。Cache控制器由缓存线操作,这是一个内存大小的区域,比如32 64Bytes、64 64Bytes等(可能更大或更小)。因此,当CPU清除/刷新包含某些地址的缓存行时,它会将整个缓存行的内容刷新到内存中。记忆中的任何东西都会被覆盖。

基本上有两种情况:

  • xy指针都位于相同的缓存行中。这意味着缓存中的值将覆盖内存,而且,正确的是,在that.
  • xy指针位于不同的缓存行后,x = x1, y == y2将在内存和缓存中完成。这很简单,只有一个变量会受到影响,另一个缓存行仍然是脏的。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68459164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档