导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→老古,看看我的程序[tuoniao35]

 *第1807篇: 老古,看看我的程序

  
楼 主:tuoniao35 2002年1月4日09:36
 老古,看看我的程序
老古,看看我的程序,哪个地方不对指点一下,好么?

#define uint  unsigned int
#define uchar unsigned char
typedef union{
              struct
              {
                uchar b0:1;
                uchar b1:1;
                uchar b2:1;
                uchar b3:1;
                uchar b4:1;
                uchar b5:1;
                uchar b6:1;
                uchar b7:1;
        }bit;
        uchar all;
        }reg_8019;
#define reg   *(char *)(0x30000H)        //因为片选是cs0,与本人所用单片机有关
   /************************************************************
             remote dma write
             &transmit packet
             数据包传送方向:单片机M16c-网卡8019-以太网
 ************************************************************/            
void driver send() 
{    
      uchar cr;
      page(0);                             
      cr=*reg                       //commmand register
      
      if(cr==0x26h)                //判断网上是否有数据包发送
                                                       
      queueit();                  //若有,则先排队等待
      else                       //若没有,则远程写
      write_dma(0x4000,COUNT);              //remote dma write
      
      *(reg+5)=count&0xff;               
      *(reg+6)=count>>8;               //local dma-transmit byte count
      *(reg+4)=0x40;                  //tpsr,每次发送数据包都需重新设置此寄存器
      
      *reg=0x26;                       //program NIC to transmit packet
}


void queueit()
{      
        reg_8019 cr;
        page(0);
        cr.all=*reg;                       //command register
        while(cr.bit.b2==1);              //wait until the txp bit equal 0
}


void write_dma(uint address,uint count)   //address为要写入到网卡里的ram的起始地

                                          //count为要连续写入的字节数
{       
    uint i;
    reg_8019 isr;
    isr.all=*(reg+7)              //interrupt status register
    uint buffer[768];            //最大数据包1514字节+4字节的校验码
          page(0);
         *(reg+9)=address>>8;          //remote address high
         *(reg+8)=address&0xff;        //remote address low 
         *(reg+11)=count>>8;          //remote  write count high 
        *(reg+10)=count&0xff;        //remote  write count low 
        *reg=0x12 ;                  //remote  dma write and start
        
        i=0;
        while(isr.bit.b6==1)   //wait for the completion of the remote dma write

      {
        *(reg+16)=buffer[i];       //(reg+16)是DMA端口地址(data transfer i/o 
port)

      }
        isr.bit.b6=1;
        *(reg+11)=0;            // count high   中止DMA操作 
        *(reg+10)=0;            // count low
        *reg=0x22;             //abort/complete dma   page 0 

}

  
2楼:老古 2002年1月4日11:02
 等待到数据包发完,才处理下一包,这种做法效率不高。51大概能处理200包/秒,而发送一个1500字节的数据包要1.5毫秒左右,发100包就要等150毫秒。
不要等到发完,就去处理下一包。
  
3楼:tuoniao35 2002年1月4日13:39
 这么说,8090流程图中谈到单片机的等待是多余的?
  
4楼:tuoniao35 2002年1月5日10:22
 一般是否每次把包放到发送缓冲区的时候,就开始指定tpsr的值,然后开始令网卡发包?
  
5楼:老古 2002年1月5日12:34
 要等前一个包发完了,才发。
  
6楼:tuoniao35 2002年1月4日14:13
 另外,若不等到数据包发完,就去处理下一包,是否就是象你著作里谈到的把下一包放到发送缓冲区2呢?
  
7楼:老古 2002年1月4日17:50
 是的。否则电脑也无法达到10M bps的传输速度。

>>>>>>对该主题发表你的看法

本主题贴数7,分页: [第1页]


[上一篇主题]:请问老古网络组建技术

[下一篇主题]:硬件:若单片机给网卡8019发数据包的时候,都需查看本网卡是否正在给网上发包,请问,等到什么时候,单