基于ARM嵌入式系统开发之发送过程的实现

发布者:晴天7777最新更新时间:2012-11-22 来源: 21IC 关键字:ARM  嵌入式系统  发送过程 手机看文章 扫描二维码
随时随地手机看文章
  要通过网卡发送数据时,上层协议实体调用函数hard_start_xmit(),在我们的驱动程序中这个函数被映射成DM9000_wait_to_send_packet()函数,正如它名字中wait所表示的那样,这个函数只完成了等待发送的工作,实际的发送是调用DM9000_hardware_send_packet()函数完成的,这也是前面提到的buffer分配机制的一种体现。

  在具体介绍这两个函数之前,有必要简单说一说DM9000芯片发送数据的工作原理。前面已经讲过,为了增加网络吞吐量DM9000芯片内部集成了8K的buffer,芯片对这些buffer采用了内存页面管理方式,每页256B,内部寄存器支持简单的内存分配指令。对于内核来说,发送数据只是把数据从内核送到芯片的buffer中去,实际向物理媒介上的发送和相关的控制(CSMA/CD)是由芯片自主完成的。完成情况通过中断的方式通知内核。

  在数据发送中用到两个函数。函数DM9000_wait_to_send_packet()一方面实现和上层协议接口,另一方面检查buffer分配是否成功,如果成功就调用,DM9000_hardware_send_packet()将数据传送到buffer中去,如果不成功,则打开相关中断,在分配成功时由中断控制程序调用DM9000_hardware_send_packet()完成数据传送。这两个函数都用到Linux网络协议栈中很重要的一个数据结构sk_buff,关于它在讲接收程序时再详细介绍。下面结合代码片段分析这两个函数的功能实现。

  static int DM9000_wait_to_send_packet( struct sk_buff* skb, struct net_device * dev )

  {

  struct DM9000_local *lp = (struct DM9000_local *)dev->priv;

  word length;

  unsigned short numPages;

  word time_out;

  word status;

  lp->saved_skb = skb;

  length = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN;

  numPages = ((length & 0xfffe) + 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命令寄存器的地址。[page]

  time_out = MEMORY_WAIT_TIME;

  do {

  status = inb( INT_REG );

  if ( status & IM_ALLOC_INT ) {

  break;

  }

  } while ( -- time_out );

  这段代码是检查buffer分配是否成功,检查的方法很特别。须说明一下,在系统初始化时buffer分配中断是被屏蔽的,所以即使分配成功也不会产生物理中断信号,但是中断状态寄存器仍然会有相应标志。这段代码正是利用这个特性,在一个时间范围内检查中断状态寄存器,检查分配是否成功,这个是一种忙等待,但因为time_out设得很小所以在有些时候它比中断方式效率高。

  if ( !time_out ) {

  DM9000_ENABLE_INT( IM_ALLOC_INT );

  return 0;

  }

  如果超时,证明buffer忙,打开buffer分配中断,待分配成功时由中断程序完成有关操作。

  DM9000_hardware_send_packet(dev);

  netif_wake_queue(dev);

  return 0;

  }

  如果不超时,直接调用DM9000_hardware_send_packet()完成发送。下面来看DM9000_hardware_send_packet()函数,它的主要功能一是把数据从sk_buff结构中传输到芯片buffer区,二是进行传输后处理。数据传输部分涉及一些特殊问题处理,例如按字(16b)传输时如何处理奇数字节的问题,以及构造以太网帧头结构问题等,这些问题各种网卡处理方式基本一致,相对比较烦琐,所以在代码片段中仅作表示。

  static void DM9000_hardware_send_packet( struct net_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空间,设置发送时间、唤醒网络设备等待队列。

参考文献:

[1]. DM9000 datasheet http://www.dzsc.com/datasheet/DM9000_979498.html.
[2]. 16b datasheet http://www.dzsc.com/datasheet/16b_2177774.html.

关键字:ARM  嵌入式系统  发送过程 引用地址:基于ARM嵌入式系统开发之发送过程的实现

上一篇:ARM linux系统调用的实现原理
下一篇:基于嵌入式状态监测与故障诊断装置的研究与设计

推荐阅读最新更新时间:2024-03-16 13:13

移植嵌入式Linux到ARM处理器S3C2410:应用实例
应用实例的编写实际上已经不属于Linux操作系统移植的范畴,但是为了保证本系列文章的完整性,这里提供一系列针对嵌入式Linux开发应用程序的实例。   编写Linux应用程序要用到如下工具:   (1)编译器:GCC   GCC是Linux平台下最重要的开发工具,它是GNU的C和C++编译器,其基本用法为:gcc 。   我们应该使用arm-linux-gcc。   (2)调试器:GDB   gdb是一个用来调试C和C++程序的强力调试器,我们能通过它进行一系列调试工作,包括设置断点、观查变量、单步等。   我们应该使用arm-linux-gdb。   (3)Make   GNU Make的主要工作是读进一个文本文件,称为mak
[单片机]
IAR全面支持兆易创新基于Arm® Cortex®-M7内核的超高性能MCU
IAR嵌入式开发解决方案现已全面支持兆易创新GD32H7系列,与合作伙伴一同为高端创新应用提供开发利器 中国上海—2023年7月13日,嵌入式开发软件和服务的全球领导者IAR与业界领先的半导体器件供应商兆易创新(GigaDevice)联合宣布, 最新发布的IAR Embedded Workbench for Arm 9.40版本已全面支持兆易创新基于Arm® Cortex®-M7内核的超高性能MCU微控制器——GD32H737/757/759系列,为开发人员提供高效的工具链。 GD32H737/757/759系列超高性能MCU基于600MHz Arm® Cortex®-M7内核,凭借双发射6级流水线架构,以及支持高带
[嵌入式]
IAR全面支持兆易创新基于<font color='red'>Arm</font>® Cortex®-M7内核的超高性能MCU
第三届“华清远见-ARM嵌入式系统全国巡回技术研讨会”
华清远见教育集团携手全球领先的半导体知识产权 (IP) 提供商ARM公司及国际知名的半导体公司恩智浦半导体NXP Semiconductors N.V.,共同推出第三届“华清远见-ARM嵌入式系统全国巡回技术研讨会”,今年主题确定为“智能化电子产品开发新趋势及基于ARM的嵌入式Linux开发核心技术”,届时来自ARM、恩智浦及华清远见的业内专家和资深讲师将分别针对三个ARM技术领域内的热点专题进行精彩演讲。讲座将于2012年4月在成都、南京、武汉、北京、上海、深圳等城市陆续举办,诚邀您的加入,与我们一起分享嵌入式设计及最新ARM技术的饕餮盛宴。 活动安排详情及报名请登录: http://www.farsight.com.cn/
[嵌入式]
瑞萨电子推出基于ARM Cortex-A处理器的mbed微处理器开发板
瑞萨电子推出全球首个支持ARM® Cortex®-A处理器的ARM mbed™开发平台 — 采用了达1000 DMIPS的RZ/A1。 采用RZ/A1系列微处理器的瑞萨电子mbed板 2014年11月11日,日本东京讯—全球领先的半导体解决方案供应商瑞萨电子株式会社(TSE: 6723)将通过最新发布的ARM mbed IoT平台帮助工程师和开发人员简化嵌入式开发工作,助力产品制造和新兴应用开发。瑞萨利用RZ/A1微处理器产品开发出全球首个基于ARM Cortex-A9处理器的mbed微处理器开发板,该产品将方便互联设备设计人员更快地开发出高性能、高功能型嵌入式系统产品。 ARM mbed IoT设备平台提
[单片机]
瑞萨电子推出基于<font color='red'>ARM</font> Cortex-A处理器的mbed微处理器开发板
嵌入式系统中小功率开关电源的设计
0 引言 随着计算机技术、半导体技术以及电子应用技术的发展,嵌入式系统以其体积小、可靠性高、功耗低、软硬件集成度高等特点广泛应用于工业控制、过程控制、仪器仪表、航天航空、汽车船舶、网络通信、军事装备、消费产品等众多领域。在这些系统中电源的结构和性能起着关键性的作用,特别是需要使用220V交流电供电的多路电源的系统,其电源设计的合理性和可靠性尤为重要。过去常用的变压器降压、整流滤波后稳压的线性电源,在嵌入式系统要求体积小,利用率高的情况下,显得不足。寻求体积小、效率高、成本低、可靠性好的开关电源成为一种迫切的需要。本文根据实际应用中的体会,以小功率单片开关电源集成电路FSD200为核心,设计并实现了一款适合嵌入式系统需求的小功
[工业控制]
<font color='red'>嵌入式系统</font>中小功率开关电源的设计
揭开arm处理器架构内部的神秘面纱
ARM架构是当今世界上最受欢迎的处理器架构之一,每年出货数十亿个基于ARM的设备。共有三个体系结构配置:A、R和M。 通常,一个终端设备使用多个ARM处理器,并且这些处理器实现不同的体系结构配置文件。例如,下图显示了在现代智能手机中可能会找到的内容: ARM推出新款ARMv8架构的Cortex-A50处理器系列产品,以此来扩大ARM在高性能与低功耗领域的领先地位,进一步抢占移动终端市场份额。Cortex-A50是继Cortex-A15之后的又一重量级产品,将会直接影响到主流PC市场的占有率。围绕该话题,我们今天不妨总结一下近几年来手机端较为主流的ARM处理器。 Armv8-A是Arm的一个重要里程碑。
[嵌入式]
揭开<font color='red'>arm</font>处理器架构内部的神秘面纱
高性能低功耗:ARM发布Cortex-A15四核新旗舰
    ARM今天正式发了自家Cortex-A15 MPCore架构的四核Hard Macro处理器,除了高性能之外,这款处理器还着重对功耗进行了优化,将成为Cortex-A15 MPCore架构新的旗舰。这款Cortex-A15 MP4 Hard Macro处理器采用台积电28nm HPM工艺制程,运行频率2GHz,计算20000 DMIPS性能达到。     虽然性能大幅提升,但依然保持了Cortex-A9 Hard Macro的功耗水平。此外,Cortex-A15 MP4 Hard Macro整合了ARM Cortex processor、Artisan physical、CoreLink systems等指令技术。 Co
[手机便携]
基于ARM Linux的图像采集与蓝牙传输
嵌入式Linux系统具有可移植性好、网络功能强、优秀的GNU编译工具、免费的开放源代码等优点。S3C2410处理器是一款采用ARM920T结构,内部资源非常丰富的32位嵌入式处理器。USB摄像头具有低廉的价格,良好的性能,加上Linux下有V4L支持对其编程,很容易集成到嵌入式系统中。蓝牙技术是目前被认可的短距离无线通信技术,广泛应用于手机、电脑以及汽车免提系统。 本文介绍基于嵌入式Linux的USB图像采集系统,并通过构建好的嵌入式Linux下的蓝牙环境将采集到的图片传送到蓝牙手机上,实现监控功能。 1 软硬件平台概述 系统硬件平台如图1所示。该平台软件上采用嵌入式Linux操作系统;硬件上采用Samsung公司的S3C2
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多精选电路图
换一换 更多 相关热搜器件
更多每日新闻
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved