我正在为STM32H743 SoC中的DMA总线主设备开发一个驱动程序,该驱动程序由Cortex M7 CPU驱动。假设我有两个内存位置,x
和y
,它们映射到相同的缓存行,这是在普通的可写可缓存内存中,并假设以下事件序列:
y
x = x1, y = y1
开始,缓存行无效。
x = x2
,在内存中G 219
完成后,从DMA设备,x = ?
的角度出发
我认为DMA会看到x = x1
,这是我的推理:
y
时,缓存线将被拉入缓存中。它读取x = x1, y = y1
,并被标记为有效。DMA然后更新内存中的x
,但是变化没有反映在缓存行中。当CPU设置y = y2
时,缓存线被标记为脏。当CPU清除缓存行时,>H 236H 137
当它被写回内存时,它会读取x = x1, y = y2
,从而将DMA所做的更改覆盖到内存中。
这听起来像是一个很好的推理吗?
发布于 2021-07-21 05:11:06
很快,如果我把你的问题说对了,你的描述是正确的。
从“两个内存位置,x和y”的问题上看,还不太清楚。
根据你在描述中使用它们的方式,我认为它大概是两个指针。
int* x, y;
“从x = x1, y = y1
开始”意味着为该指针分配地址,例如
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清除/刷新包含某些地址的缓存行时,它会将整个缓存行的内容刷新到内存中。记忆中的任何东西都会被覆盖。
基本上有两种情况:
x
和y
指针都位于相同的缓存行中。这意味着缓存中的值将覆盖内存,而且,正确的是,在that.x
和y
指针位于不同的缓存行后,x = x1, y == y2
将在内存和缓存中完成。这很简单,只有一个变量会受到影响,另一个缓存行仍然是脏的。https://stackoverflow.com/questions/68459164
复制相似问题