DMA的作用以及DMA与CPU干扰问题
DMA(Direct memory access):直接存储器存储。
目前网上对于DMA有两种说法,一种是在DMA传输时,CPU可以正常工作,一种说法是不可以,这两种说法其实有对也有错,经过我的大量查询后,终于得出了一个靠谱的答案。那么想弄清楚这点,需要先了解总线与时钟的关系(先凑合看,回头写个总线架构专讲)
时钟:计算机的最小时间单位,用于同步控制电路,计算机中每个动作所用时都是以时钟周期为单位的,多个时钟周期或一个时钟周期等于一个机械周期,多个机械周期等于一个指令周期(写多个是因为不同芯片上他的不同周期的比值不同),指令周期执行指令集中的一条指令所需要的时间。
总线:计算机中各个单元中的数据传输。STM中分为多种总线,有与外设沟通的也有与各种存储器沟通的,也有DMA的总线,但是DMA的总线用于连接AHB总线的。此外,总线本身是连接到总线矩阵的,这是为了使得总线之间的读取更加灵活,使得主设备与从设备之间可以相互访问,如果没有总线矩阵的话,主控主线与被控主线之间就无法进行访问。总线矩阵中,当两组主从总线之间进行访问时,如果XY两线其中任意一条发生冲突,则采取总线调度进行分配,且两组传输无法进行
总线与时钟的关系:SYSCLK是时钟,但是AHB是总线,虽然频率相同,APB是总线,但是HCLK是时钟。
那么这里要注意了,当总线矩阵冲突时,也就是CPU执行代码中的总线传输和DMA冲突时,则无法进行DMA和CPU的同时传输!!!
在这里,DMA总线连接到了AHB总线上,而AHB只负责CPU与外设之间的通信。而不影响CPU与代码的通信。也就是说,当DMA传输时,CPU无法与外设之间进行通信,但是可以正常执行代码,只不过当代码中需要操控外设时,需要等待DMA传输完成或是使用交替的方式与DMA决定谁使用总线。
打个比方的话,就是一总线可以看作是一条条城市之间的高速公路,成本足够的话,我们自然希望这些道路是专门的,是互不干扰的。但是由于现实中的成本等等问题,导致我们不得不将一些道路重复利用,设置红绿灯等东西来调节重复利用以避免道路冲突造成的堵车问题。
另外,DMA在传输过程中虽然不使用总线,但是DMA向CPU申请总线使用权的时候,会通过AHB总线向CPU发送总线申请,以及在DMA传输总线时,归还总线也会和发送与总线申请类似的请求数据,当CPU收到DMA发来的这些数据后,会执行一些操作,如回应DMA的信息或是将总线释放(将总线设为高阻状态)。这些动作都会使用CPU资源。
另外多一句,DMA的总线申请等与CPU交流的信息,高于一切异常的优先级!
那么可能有些同学可能会有疑问,当DMA传输时CPU无法工作的总线架构下,是不是就不需要总线了呢?其实不然。DMA的传输速度是比CPU要快很多的,要不也对不起DMA高速传输的称号了。CPU执行一条代码的速度是多个指令周期的,一个指令周期又等于多个机械周期,一个机械周期又等于多个时钟周期,这是为了使得CPU有处理更加复杂事情的能力,如运算等等。而DMA是专门为了传输而生的,不需要多余的动作。所以当遇到对速度有高要求的传输时,还是使用DMA吧。
|
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/weixin_44091010/article/details/118882195 ———————————————— 版权声明:本文为CSDN博主「佛系代码_BUG随缘」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/weixin_44091010/article/details/118882195