[S3C2440]

求教关于2440 DMA的使用问题

[复制链接]
831|4
手机看帖
扫描二维码
随时随地手机跟帖
被解救的戈登|  楼主 | 2016-3-4 13:39 | 显示全部楼层 |阅读模式
DMA的优势是它在传输数据的时候不需要CPU的干预。而我在使用DMA时发现测试代码里有“while(done==0);”这样一句循环代码,在done=1之前cpu一直在此循环,实际中的dma传输计时不可能是这样,dma传输期间,cpu可以可以去执行其他任务。可是这样用DMA时,CPU会在while(done)循环,这不就占用CPU了吗,怎么就实现不需要CPU的干预?具体用发是怎样的呢?求指点!

相关帖子

阿南| | 2016-3-4 15:45 | 显示全部楼层
这是一个测试代码,你可以在while里做其它的事情

使用特权

评论回复
被解救的戈登|  楼主 | 2016-3-4 16:45 | 显示全部楼层
阿南 发表于 2016-3-4 15:45
这是一个测试代码,你可以在while里做其它的事情

while(1)  
    {  
      
          if( (key == '+') && (volume <= MAX_VOLUME) )  
        {  
            volume += 4;  
            AdjVolume(volume);  
        }
        DMA2_play_init( (U32)WindowsXP_Wav, (U32)IISFIFO, sizeof(WindowsXP_Wav)/2);  
  
        while( done==0 )  
        {  
        }  
  
        done =0;  
        DMA2_play_close();  
  
    //  delay(1);   
    }  

这是主函数里的代码,CPU一只工作在while(done==0)里面,外面的音量控制不起作用,去掉里面的while(done==0),则导致DMA不工作,按你的说法应该是在while(done==0)里面进行按键操作,可while(1)里的操作就没办法了

使用特权

评论回复
阿南| | 2016-3-5 09:12 | 显示全部楼层
把DMA相关的操作要移出while,不然执行DMA2_play_close(); 后,DMA就不工作了

使用特权

评论回复
被解救的戈登|  楼主 | 2016-3-7 11:31 | 显示全部楼层
阿南 发表于 2016-3-5 09:12
把DMA相关的操作要移出while,不然执行DMA2_play_close(); 后,DMA就不工作了

恩,了解了,谢谢!

使用特权

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

本版积分规则

5

主题

17

帖子

0

粉丝