科技

您的位置:主页 > 科技 >

ARM嵌入式系统开发之发送过程的实现【lpl下注平台】

发布日期:2021-09-01 00:09浏览次数:
本文摘要:要根据网口传送数据时,顶层协议书实体线启用函数hard_start_xmit(),在大家的驱动软件中这一函数被同组成DM9000_wait_to_send_packet()函数,如同它姓名中wait所答复的那般,这一函数只已完成了等待发送至的工作中,具体的发送至是启用DM9000_hardware_send_packet()函数已完成的,这也是前边谈及的buffer分配体制的一种体现。 在确立解读这两个函数以前,有适度比较简单说一说DM9000芯片传送数据的原理。

lpl下注平台

要根据网口传送数据时,顶层协议书实体线启用函数hard_start_xmit(),在大家的驱动软件中这一函数被同组成DM9000_wait_to_send_packet()函数,如同它姓名中wait所答复的那般,这一函数只已完成了等待发送至的工作中,具体的发送至是启用DM9000_hardware_send_packet()函数已完成的,这也是前边谈及的buffer分配体制的一种体现。  在确立解读这两个函数以前,有适度比较简单说一说DM9000芯片传送数据的原理。

前边早就谈过,为了更好地降低互联网货运量DM9000芯片內部搭建了8K的buffer,芯片对这种buffer应用了运行内存页面管理方法,每张256B,內部存储器抵制比较简单的运行内存分配命令。针对核心而言,传送数据仅仅把数据信息从核心送到芯片的buffer中去,具体向物理学媒体上的发送至和涉及到的操控(CSMA/CD)是由芯片自我约束已完成的。已完成状况根据中断的方法通告核心。  在数据信息发送至中用2个函数。

lpl下注平台

函数DM9000_wait_to_send_packet()一方面搭建和顶层协议书控制模块,另一方面查验buffer分配否成功,假如成功就启用,DM9000_hardware_send_packet()将传输数据到buffer中去,如果不成功,则合上涉及到中断,在分配成功时由中断管理程序启用DM9000_hardware_send_packet()已完成传输数据。这两个函数都选用Linux网络tcp协议中很最重要的一个算法设计sk_buff,有关它在谈对接程序流程时再作详细解读。

下边结合编码精彩片段剖析这两个函数的作用搭建。  staticintDM9000_wait_to_send_packet(structsk_buff*skb,structnet_device*dev)  {  structDM9000_local*lp=(structDM9000_local*)dev-》priv;  wordlength;  unsignedshortnumPages;  wordtime_out;  wordstatus;  lp-》saved_skb=skb;  length=ETH_ZLEN《skb-》len?skb-》len:ETH_ZLEN;  numPages=((length0xfffe) 6);  numPages》》=8;  DM9000_SELECT_BANK(2);  outw(MC_ALLOC|numPages,MMU_CMD_REG);  }  之上编码从skb中诵读数据信息长短保证一些应急处置后,换算出所需要的网页页面数。随后向芯片接到分配buffer的督促,MC_ALLOC和MMU_CMD_REG全是在头文件中界定的宏,MC_ALLOC是分配buffer室内空间的存储器命令,而MMU_CMD_REG是MMU指令存储器的详细地址。  time_out=MEMORY_WAIT_TIME;  do{  status=inb(INT_REG);  if(statusIM_ALLOC_INT){  break;  }  }while(--time_out);  这一段编码是查验buffer分配否成功,查验的方式很特别是在。

lpl下注平台

需解释一下,在系统软件复位时buffer分配中断是被屏蔽的,因此 即便 分配成功也会造成物理学中断数据信号,可是中断情况存储器仍然不容易有适度标示。这一段编码更是运用这一特点,在一个时间段内查验中断情况存储器,查验分配否成功,这个是一种一天到晚等待,但由于time_out设得较小因此 在一些情况下它比中断方法高效率。  if(!time_out){  DM9000_ENABLE_INT(IM_ALLOC_INT);  return0;  }  假如请求超时,证实buffer一天到晚,合上buffer分配中断,待分配成功时由中断程序流程已完成相关作业者。

  DM9000_hardware_send_packet(dev);  netif_wake_queue(dev);  return0;  }  如果不请求超时,必需启用DM9000_hardware_send_packet()已完成发送至。下边看来DM9000_hardware_send_packet()函数,它的关键作用一是把数据信息从sk_buff构造中传送到芯片buffer区,二是进行传送后处理工艺。

传输数据一部分涉及一些相近难题应急处置,比如按字(16b)传送时怎样应急处置合数字节数的难题,及其构造以太网接口帧头构造难题等,这种难题各种各样网口处理方法基本相同,较为比较繁琐,因此 在编码精彩片段中仅有未作答复。  staticvoidDM9000_hardware_send_packet(structnet_device*dev)  {  outsw(DATA_REG,buf,(length)》》1);  /*对涉及到存储器进行作业者,将传输数据到芯片buffer*/  DM9000_ENABLE_INT((IM_TX_INT|IM_TX_EMPTY_INT));  lp-》saved_skb=NULL;  dev_kfree_skb_any(skb);  dev-》trans_start=jiffies;  netif_wake_queue(dev);  return;  }  传送后处理工艺,确立为合上传送涉及到的异常现象中断,出狱skb室内空间,设定发送至時间、清醒计算机设备等待序列。


本文关键词:lpl下注平台,ARM,嵌入式,系统,开,发之,发送,过程,的,实现

本文来源:lpl下注平台-www.rinat-baibekov.com

微信扫码 关注我们

  • 24小时咨询热线

    24小时咨询热线0310-915630899

  • 移动电话14870527030

Copyright © 2005-2021 www.rinat-baibekov.com. lpl下注平台科技 版权所有 地址:北京市北京市北京区时赛大楼3237号 备案号:ICP备18609647号-5 网站地图 xml地图