[STM32]

我理解的DMA模块功能

[复制链接]
4873|29
手机看帖
扫描二维码
随时随地手机跟帖
eydj2008|  楼主 | 2018-8-6 08:55 | 显示全部楼层 |阅读模式
DMA的英文拼写是“Direct Memory Access”,汉语的意思就是直接内存访问,是一种不经过CPU而直接从内存存取数据的数据交换模式。在DMA模式下,CPU只须向DMA控制器下达指令,让DMA控制器来处理数据的传送,数据传送完毕再把信息反馈给CPU,这样就很大程度上减轻了CPU资源占有率,可以大大节省系统资源。

可是实际情况:

1.DMA 传一小块数据的时候  基本上没什么用  CPU还是得等他处理完,才能处理别的
  比如我用DMA 在ADC采集上,我要采集64次然后平均 滤波来使用,因为我是连续采集64次, 所以还是得等采集完了,得到处理结果,才能执行下一步,而不能CPU去处理其它事,再回来找这个结果. 也就是 DMA任务时间小于我的任务切换时间的,  用处真不大.
2.如果传一大块数据,CPU可以去干别的 然后用DMA中断来处理传据结果
  比如 用DMA 传输SDIO SD文件数据 一次传几KB的数据 可能时间大于任务切换的时间,就不可能一直在那里等它,等到DMA传完,中断后,再来处理.  很多时间 我宁愿一小块一小块的传,便于处理. 这样下来 感觉DMA用处真不大了.

欢迎大家来讨论一下.



相关帖子

ayb_ice| | 2018-8-6 09:45 | 显示全部楼层
DMA又不是万能的,任何东西都是这样的,当然有它的不足之处

使用特权

评论回复
吾要单片机| | 2018-8-6 09:59 | 显示全部楼层
DMA的作用是不用CPU中断处理就可以快速进行数据传送,CPU中断响应是需要做保护现场的工作,这需要花不少时间,恢复现场也是要花相同的时间,有DMA就可以省去CPU保护/恢复现场的时间了,可以提供效率的。

使用特权

评论回复
ayb_ice| | 2018-8-6 10:19 | 显示全部楼层
吾要单片机 发表于 2018-8-6 09:59
DMA的作用是不用CPU中断处理就可以快速进行数据传送,CPU中断响应是需要做保护现场的工作,这需要花不少时 ...

什么DMA中断是为了保护现场

别瞎说了,中断是为了通知你完成了,或出错了,

使用特权

评论回复
雪山飞狐D| | 2018-8-6 16:34 | 显示全部楼层
本帖最后由 雪山飞狐D 于 2018-8-6 16:35 编辑

   DMA 貌似就是纯硬件搬砖工,CPU不用搭理他,比如开个ADC采集1024个数据,CPU只要打开开关,然后就可以做其他事情了,等DMA搬运完了,叮咚一下通知CPU我搬砖搬完了,CPU再理它不迟,可以节省CPU切换的响应消耗。。。。

使用特权

评论回复
eydj2008|  楼主 | 2018-8-6 16:39 | 显示全部楼层
ayb_ice 发表于 2018-8-6 10:19
什么DMA中断是为了保护现场

别瞎说了,中断是为了通知你完成了,或出错了, ...

DMA的好处 我在前言部份 就已经讲了
但很多实际用的时候  我是感觉不到省了CPU资源, 你理解到了

吾要单片机  他是没理解到我的意思
我在用ADC DMA的时候 ADC中断一样要打开才行, 然后采集到多少次DMA中断了 报告说集完了.
但是我要等到它 采集完 得到结果 我才能下一步,不然下一步就是下一个任务轮回了

其实我是想 为什么 我利用不起来DMA   

使用特权

评论回复
eydj2008|  楼主 | 2018-8-6 16:41 | 显示全部楼层
雪山飞狐D 发表于 2018-8-6 16:34
DMA 貌似就是纯硬件搬砖工,CPU不用搭理他,比如开个ADC采集1024个数据,CPU只要打开开关,然后就可以做 ...

ADC 分 间隔采样 或是连续采样  , 对于连续来说, DMA意义不大

使用特权

评论回复
雪山飞狐D| | 2018-8-6 16:47 | 显示全部楼层
eydj2008 发表于 2018-8-6 16:41
ADC 分 间隔采样 或是连续采样  , 对于连续来说, DMA意义不大

   ADC开中断采样速率过高的话比如1M,没有DMA搬砖的话明显会影响CPU响应速度,你为什么要等这个DMA中断,这是阻塞式的写法,任务分配机制不行,你起码要一个任务标志缓冲,CPU定时检测里面的任务标志,然后再依次执行即可

使用特权

评论回复
eydj2008|  楼主 | 2018-8-6 16:53 | 显示全部楼层
雪山飞狐D 发表于 2018-8-6 16:47
ADC开中断采样速率过高的话比如1M,没有DMA搬砖的话明显会影响CPU响应速度,你为什么要等这个DMA中断, ...

因为每多路AD等我扫描呢 不可能查询 或是下一个轮回任务 说才读出来 ,那就慢了   至少是MS级了

使用特权

评论回复
雪山飞狐D| | 2018-8-6 16:58 | 显示全部楼层
eydj2008 发表于 2018-8-6 16:53
因为每多路AD等我扫描呢 不可能查询 或是下一个轮回任务 说才读出来 ,那就慢了   至少是MS级了 ...

   ADC 一般不需要那么密集的监控吧?一般做法通常采集到1024个数据,CPU按数组块处理一次,轮询定时器设置为10ms 比较合适,这样就也可以把这个定时器作为按键扫描的标志,显示刷新率一般也用这个定时器控制,只要单个任务没有超过100ms 的,CPU响应都不错

使用特权

评论回复
eydj2008|  楼主 | 2018-8-6 17:05 | 显示全部楼层
再比如 我用SDIO读SD卡 文件 读512B 用时3ms
DRESULT SD_read(BYTE lun, BYTE *buff, DWORD sector, UINT count)
{
  DRESULT res = RES_ERROR;
  uint32_t timeout = 100000;

  if(BSP_SD_ReadBlocks((uint32_t*)buff,
                       (uint32_t) (sector),
                       count, SD_DATATIMEOUT) == MSD_OK)
  {
    while(BSP_SD_GetCardState()!= MSD_OK)
    {
      if (timeout-- == 0)
      {
        return RES_ERROR;
      }
    }
    res = RES_OK;
  }
  
  return res;
}
举个例子吧 如果这里换成DMA 还是要等到DMA将这么多数据读出来后, 才执行下一步,而不是如果没读出来,我执行其它程序去了.
这样程序就很难写了

使用特权

评论回复
雪山飞狐D| | 2018-8-6 17:18 | 显示全部楼层
本帖最后由 雪山飞狐D 于 2018-8-6 17:24 编辑
eydj2008 发表于 2018-8-6 17:05
再比如 我用SDIO读SD卡 文件 读512B 用时3ms
DRESULT SD_read(BYTE lun, BYTE *buff, DWORD sector, UINT  ...

  你还是没明白我说的什么意思,SD卡上面的数据,用DMA就是存到内存里面的,DMA搬完砖以后,CPU什么时候处理都行,CPU只需要打开DMA开关就可以走人了,每隔10ms检查一下相关中断标志位,只要不是用于安全的紧急任务,时间查询间隔可以很宽松,当然3ms死等也可以,影响不大,如果你的数据需要100ms才出来呢?CPU也死等吗?

使用特权

评论回复
雪山飞狐D| | 2018-8-6 17:31 | 显示全部楼层
本帖最后由 雪山飞狐D 于 2018-8-6 17:46 编辑
eydj2008 发表于 2018-8-6 17:05
再比如 我用SDIO读SD卡 文件 读512B 用时3ms
DRESULT SD_read(BYTE lun, BYTE *buff, DWORD sector, UINT  ...

     

使用特权

评论回复
雪山飞狐D| | 2018-8-6 17:31 | 显示全部楼层
本帖最后由 雪山飞狐D 于 2018-8-6 17:36 编辑
eydj2008 发表于 2018-8-6 17:05
再比如 我用SDIO读SD卡 文件 读512B 用时3ms
DRESULT SD_read(BYTE lun, BYTE *buff, DWORD sector, UINT  ...

     而且SDIO口貌似也是硬件接口吧?CPU只要初始化完成,打开开关就完事,把DMA打开,也完事了,管它数据读完要多少时间,你只需要每隔一定时间(几十mS一次都行)一般SD卡的数据不会很紧急,查询一下DAM中断的完成标志位,然后你要再读下个地址的SD卡,那就再开一次开关即可,单片所有的任务如果没有RTOS确实需要精心分配一下时间间隔,有些直接开中断也可以比如串口,就留它在那中断也无所谓,跟你的CPU定时轮询没有多大关系。。。。
     再比如DS18B20这种,一次的读数据需要比较长时间,那就只能配分CPU的轮询时间,倍率到1S读一次就够了,这样基本就不会影响其他程序响应了

使用特权

评论回复
雪山飞狐D| | 2018-8-6 17:51 | 显示全部楼层
eydj2008 发表于 2018-8-6 17:05
再比如 我用SDIO读SD卡 文件 读512B 用时3ms
DRESULT SD_read(BYTE lun, BYTE *buff, DWORD sector, UINT  ...

      当然CPU这个定时查询里面,可以用到函数指针,在这个定时中断里面,分配一下任务的函数指针,定时中断跳出去以后,就可以直接执行分配好的任务了,这里面也有需要一些技巧。。。好像就是所谓的消息机制和回调函数把,你可以查查网上的资料

使用特权

评论回复
caijie001| | 2018-8-6 22:39 | 显示全部楼层
你这是裸机的思想,,,,什么叫用dma还是得等他完成。。。。

使用特权

评论回复
eydj2008|  楼主 | 2018-8-7 08:21 | 显示全部楼层
caijie001 发表于 2018-8-6 22:39
你这是裸机的思想,,,,什么叫用dma还是得等他完成。。。。

我们在讨论DMA 的使用场景
我总结 实时性要求高的地方 DMA用处就不大了. 也就是要在5ms内 必须出结果的.
实时性要求低的地方,DMA 可以省下CPU资源. 也就是能接受5-10ms以上 得到传输结果的.

使用特权

评论回复
eydj2008|  楼主 | 2018-8-7 08:25 | 显示全部楼层
雪山飞狐D 发表于 2018-8-6 17:18
  你还是没明白我说的什么意思,SD卡上面的数据,用DMA就是存到内存里面的,DMA搬完砖以后,CPU什么时候 ...

要控制所有的任务  必须 要20ms内 或是10ms内完成 ,才不会感觉到卡.  100ms不可能的事.
要做到这样,很多程序都是需要控制好时间的,分片来运行.
安卓卡,就是因为他们的任务超过了20ms, 多层函数嵌套 带虚拟机.

使用特权

评论回复
ayb_ice| | 2018-8-7 08:38 | 显示全部楼层
eydj2008 发表于 2018-8-6 16:39
DMA的好处 我在前言部份 就已经讲了
但很多实际用的时候  我是感觉不到省了CPU资源, 你理解到了

那是你任务管理的事情,与DMA本身无关,你可以先执行其它任务,中断后再发个消息切回那个任务处理。。。
如果速率很高,你不用DMA是做不到的,不停的中断开销很大的,

使用特权

评论回复
评论
eydj2008 2018-8-7 17:13 回复TA
有道理 可是实际情况 往往不是想像那样,比如SDIO 你不开中断, DMA中断 是不工作的. 而且SDIO中断还得优先, 才会存入DMA 
icecut| | 2018-8-7 16:55 | 显示全部楼层
dma是给高级代码用的. 入门级的代码,的确用不起来...

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

103

主题

3187

帖子

17

粉丝