xueqi_147 发表于 2010-11-12 11:01:36

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传输方式.想请教各位大侠延时时间比较短时,程序应该是如何执行的?多谢赐教

wuzhujian 发表于 2010-11-12 11:15:09

这跟DMA与CPU的竞争一点关系都没有。
    关键在于你的串口收发。
    延时时间短,并不是DMA没发完数据,而你的串口没发完数据。

xueqi_147 发表于 2010-11-12 14:16:15

回复【1楼】wuzhujian 吴助建
-----------------------------------------------------------------------

这位大哥 能不能给详细分析下执行流程?一开始DMA获得总线控制权 执行DMA传送 传完一次就释放总线 若下次请求来之前 就执行串口发送程序 发一*号因发送缓冲区非空 则等待上一字符发送完后又会产生DMA请求此时程序要对串口缓冲区写*号是响应请求还是怎么着或是压根就不是我所说的这样执行?

wuzhujian 发表于 2010-11-12 14:27:24

回复【2楼】xueqi_147
-----------------------------------------------------------------------

   没理解DMA,就不要用DMA。

xueqi_147 发表于 2010-11-12 14:30:49

回复【3楼】wuzhujian 吴助建
-----------------------------------------------------------------------

上午老师讲了个DMA实验 做实验时发现结果跟预期不一样 想了好久想不通 才发帖请教 总不能说不会就不学吧
页: [1]
查看完整版本: DMA和CPU竞争总线的问题