- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第7章 嵌入式网络程序设计 7.1 嵌入式以太网基础知识 以太网技术及其嵌入式应用 嵌入式系统中主要处理的网络协议 7.2 以太网接口设计 网络设备驱动程序基本结构 基于CS8900A的以太网接口设计 网络驱动程序实例 7.3 Linux网络编程实现 socket基本函数 TCP编程实例 综合训练之UDP编程实现 5.中断处理和接收函数 网络设备接收数据通过中断实现,当数据收到后,产生中断,在中断处理程序中驱动程序申请一块sk_buff(skb),从硬件读出数据放置到申请好的缓冲区里。接下来,填充sk_buff中的一些信息。处理完后,如果是获得数据包,则执行数据接收子程序,该函数被中断服务程序调用。函数定义: static void net_rx(struct net_device *dev) { struct net_local *lp = (struct net_local *)dev-priv; struct sk_buff *skb; int status, length; int ioaddr = dev-base_addr; status = inw(ioaddr + RX_FRAME_PORT); if ((status RX_OK) == 0) { count_rx_errors(status, lp); return; } length = inw(ioaddr + RX_FRAME_PORT); /* Malloc up new buffer. */ skb = dev_alloc_skb(length + 2); if (skb == NULL) { lp-stats.rx_dropped++; return; } skb_reserve(skb, 2); /* longword align L3 header */ skb-len = length; skb-dev = dev; readblock(dev, skb-data, skb-len); DPRINTK(3, %s: received %d byte packet of type %x\n, dev-name, length, (skb-data[ETH_ALEN+ETH_ALEN] 8) | skb-data[ETH_ALEN+ETH_ALEN+1]); skb-protocol=eth_type_trans(skb,dev); netif_rx(skb); dev-last_rx = jiffies; lp-stats.rx_packets++; lp-stats.rx_bytes += length; } 在net_rx()函数中调用netif_rx()把数据传送到协议层。netif_rx()函数把数据放入处理队列,然后返回,真正的处理是在中断返回以后,这样可以减少中断时间。调用netif_rx()后,驱动程序不能再存取数据缓冲区if_rx()函数在net/core/dev.c中定义为: int netif_rx(struct sk_buff *skb){ int this_cpu = smp_processor_id(); struct softnet_data *queue; unsigned long flags; if (skb-stamp.tv_sec == 0) do_gettimeofday(skb-stamp); queue = softnet_data[this_cpu]; local_irq_save(flags); netdev_rx_stat[this_cpu].total++; if (queue-input_pkt_queue.qlen = netdev_max_backlog) { if (queue-input_pkt_queue.qlen) { if (queue-throttle) goto drop; enqueue: dev_hold(skb-dev); __skb_queue_tail(queue-input_pkt_queue,skb); cpu_raise_softirq(this_cpu, NET_RX_SOFTIRQ); local_irq_restore(flags); #ifndef OFFLINE_SAMPLE get_sample_stats(th
您可能关注的文档
最近下载
- CJJT258-2017 住宅专项维修资金管理信息系统技术规范.docx VIP
- 电缆管施工方案.docx
- 凿岩台车、潜孔钻司机岗位安全生产责任制.doc VIP
- 地理丨广东省广州市2022届高三上学期12月调研测试地理试卷及答案.doc VIP
- JMP入门与提高学习资料.pptx VIP
- CJJT257-2017 住宅专项维修资金管理基础信息数据标准.docx VIP
- 概率论与数理统计教程(华东师范大学).docx VIP
- 分离工程绪论培训课件.ppt VIP
- 阅读理解之七选五五种考法(讲案)解析版-2024年高考英语一轮复习知识清单(全国通用).pdf VIP
- 大厦写字楼招商部流程管理手册.doc VIP
文档评论(0)