DMA和CPU竞争总线的问题
#include "includes.h"#defineSEND_DATA (*(volatile unsigned char *) 0x31200000)
#defineSEND_ADDR ((volatile unsigned char *) 0x31200000)
/*下面程序是通过DMA方式实现内存块到串口0的输出*/
voidAPP_vMain(void){
volatile unsigned char *p = SEND_ADDR;
int i;
SEND_DATA = 0x41;
for (i = 0; i < 128; i++){
*p++ = 0x41 + i;
}
/*Uart设置成DMA形式*/
rUCON0 = rUCON0 & 0xff3 | 0x8;
/****** DMA0 Initialize *****/
rDISRC0 = (U32)(SEND_ADDR);
rDISRCC0 = (0<<1)|(0<<0); //Src=AHB,Increment
rDIDST0 = (U32)UTXH0;// Tx FIFO address
rDIDSTC0 = (1<<1)|(1<<0); //Dst=APB,Fixed;
rDCON0 = (0<<31)|(0<<30)|(1<<29)|(0<<28)|(0 << 27) | (1 << 24) | (1 << 23) | (1 << 22) | (0 << 20) | (50);
//handshake,Sync=APB,IntEn, unit, single, dst=UART0,HwReqMode,NoAutoReload,Halfword,
rDMASKTRIG0 = (1<<1); //DMA0En
while(1) {CONSOL_Printf("*");DelayLoop(10000);};
}
此程序的功能是通过DMA给串口发送数据同时主程序中也在一个死循环里给串口发送数据.最后的DelayLoop(10000)延时长了无任何问题.若是延时时间比较短,DMA未传送完数据,势必会出现总线竞争 同时 串口也设置为了DMA传输方式.想请教各位大侠延时时间比较短时,程序应该是如何执行的?多谢赐教 这跟DMA与CPU的竞争一点关系都没有。
关键在于你的串口收发。
延时时间短,并不是DMA没发完数据,而你的串口没发完数据。 回复【1楼】wuzhujian 吴助建
-----------------------------------------------------------------------
这位大哥 能不能给详细分析下执行流程?一开始DMA获得总线控制权 执行DMA传送 传完一次就释放总线 若下次请求来之前 就执行串口发送程序 发一*号因发送缓冲区非空 则等待上一字符发送完后又会产生DMA请求此时程序要对串口缓冲区写*号是响应请求还是怎么着或是压根就不是我所说的这样执行? 回复【2楼】xueqi_147
-----------------------------------------------------------------------
没理解DMA,就不要用DMA。 回复【3楼】wuzhujian 吴助建
-----------------------------------------------------------------------
上午老师讲了个DMA实验 做实验时发现结果跟预期不一样 想了好久想不通 才发帖请教 总不能说不会就不学吧
页:
[1]