单片机使用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可以用信号量,不用死等,裸跑就不太清楚怎么玩了
离线