关于CPU与DMA的工作方式

文章目录

  • 背景
  • 网上的讨论
  • 我得到的结果

背景

主要考虑了一下,在DMA工作的时候,CPU到底在干嘛,是否可以继续进行工作。

网上的讨论

https://bbs.csdn.net/topics/392159760?page=2

我得到的结果

DMA控制器和Cortex™-M3核心共享系统数据总线,执行直接存储器数据传输。当CPU和DMA
同时访问相同的目标(RAM或外设)时, DMA请求会暂停CPU访问系统总线达若干个周期,总线
仲裁器执行循环调度,以保证CPU至少可以得到一半的系统总线(存储器或外设)带宽。

DMA技术的出现,使得外围设备可以通过DMA控制器直接访问内存,与此同时,CPU可以继续执行程序.那么DMA控制器与CPU怎样分时使用内存呢?通常采用以下三种方法:(1)停止CPU访内存;(2)周期挪用;(3)DMA与CPU交替访问内存.

下面这个时来自于同学的做spi通讯的时候的结论
3、DMA也会影响CPU访问内存的速度(DMA与CPU分时复用数据总线),可能会影响其他功能的执行速度。因此,对传输速率要求低的场合,没有必要使用DMA。(尽管它对于多字节收发更好操作)

cpu交出总线后,会停止工作,但是我想不涉及总线的操作应该时可以进行的。

我认为这个说的就很不错
你听说过一种东西叫做多队列网卡嘛?在一般的网卡中,都有且仅有一个队列——从网络来的数据包存在这个队列当中,一旦队列符合一定条件,将触发软中断,调用CPU去处理数据包。DMA什么的是用来将数据放到内存里面的,但是中断仍然是必须的。在某些情况下,网卡队列满了,为了防止出错,就必须调用CPU尽快来处理网卡队列……在多CPU的情况下,你以为会多个CPU分担对队列的处理么?少年不要too young啊~事实上,在linux中是绑定一个CPU到网卡队列的。这样,就导致了:明明其他CPU还20%-30%,但是整机处理速度就是上不去,仔细一看:我擦,某个CPU100%,而网卡队列已满。由于锁机制的蛋疼,你重新写个驱动让多个CPU去处理队列得不偿失。以上。发布于 2015-01-2

作者:王政
链接:https://www.zhihu.com/question/27734728/answer/38147727
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

你可能感兴趣的:(stm32)