单片机使用DMA的话,可以减少开发.但是在实际开发过程中,启动一次DMA传输,需要等待DMA返回的状态,其实也就是while死等.这岂不是和普通单片机串口发送开销一样?
离线
DMA有中断事件,一般要异步的。
比如播放声音,用全写入或半写入一段后中断,然后再写下一段,在RTT下。
 rt_hw_interrupt_install(DMA_INTERRUPT, os_dma_irq_handle, RT_NULL, "DMA");   //开启DMA中断
        rt_hw_interrupt_umask(DMA_INTERRUPT);
发送数据时
 //开启全传输中断
    S_BIT(DMA_Base_Address, (n*2)+1);
    //开启半传输中断
    //S_BIT(DMA_Base_Address, (n*2)+0);
发完后会进中断
  if (read32(DMA_Base_Address + 0x4) & 0x2)                    //全传输
    {
         S_BIT(DMA_Base_Address + 0x4, 1);
          dmd_disable(0);
         if (read32(DMA_Base_Address + 0x4) & 0x2)                    //全传输
    {
         S_BIT(DMA_Base_Address + 0x4, 1);
          dmd_disable(0);
         rt_audio_tx_complete(&(snd_dev.audio));      //这个是RTT的声音框架,去取队列中的下一段播放
    }
    }
离线
DMA异步的,CPU只要获取状态就行,填入数据是DMA去干的,CPU不用管的。
离线
DMA启动以后,cpu就可以干别的了,等待dma中断产生后再继续处理。这里不需要死等查询
离线
rtos可以用信号量,不用死等,裸跑就不太清楚怎么玩了
离线