我对DMA的理解是: 它用于把CPU从忙等待的数据传输中解脱出来,使得CPU可以利用数据传输的时间来执行其他操作。
使用DMA以前,代码也许是这样:
for(i = 0; i < 512; ++i){ while(数据没有准备好); // 等待 *buff++ = 数据源; } 处理buff中的数据;
在把数据传输到buff这个过程中,cpu在忙等待,或者即便没有等待也要由cpu来完成把数据源拷贝到buff这个任务。 但是,如果使用DMA来传输数据就可以节约下这些CPU时间。
使用DMA的代码也许是这样:
设置DMA传输的数据源地址; 设置DMA传输的数据目标地址; 设置传输数据的数目; 启动DMA传输; 等待DMA传输完毕; // ??我的疑问在这里 处理数据;
如果用while循环来等待DMA传输完毕,那么CPU时间仍然浪费了。正确的做法应该是DMA传输的过程中,CPU去做其他的事情。如果有操作系统,可能这里就是一个阻塞自己的系统调用,操作系统进行任务的切换做其他的事情去了,等到DMA完成再由操作系统把自己给唤醒。另外一方面,如果没有其他事情需要做,用不用DMA都是没有关系的。对吗?
这样来看,是不是说要发挥DMA的价值,就得给单片机移植一个操作系统,进行任务的管理?
谢谢了。 |