根据 上一篇 文章 , ETH  DMA 数据中断 会 发送 一个信号量 ,我使用 全局 搜索 这个信号量 s_xSemaphore 得到 一下 几个 值

根据 这个 分析  我们找到了   数据 的 第二站 :void ethernetif_input( void * pvParameters )

/**
* This function is the ethernetif_input task, it is processed when a packet
* is ready to be read from the interface. It uses the function low_level_input()
* that should handle the actual reception of bytes from the network
* interface. Then the type of the received packet is determined and
* the appropriate input function is called.
*
* @param netif the lwip network interface structure for this ethernetif
*/
void ethernetif_input( void * pvParameters )
{
struct pbuf *p; for( ;; )
{
if (xSemaphoreTake( s_xSemaphore, emacBLOCK_TIME_WAITING_FOR_INPUT)==pdTRUE)
{
TRY_GET_NEXT_FRAME:
p = low_level_input( s_pxNetIf );
if (p != NULL)
{
if (ERR_OK != s_pxNetIf->input( p, s_pxNetIf))
{
pbuf_free(p);
}
else
{
goto TRY_GET_NEXT_FRAME;
}
}
}
}
}
/**
* This function is the ethernetif_input task, it is processed when a packet
* is ready to be read from the interface. It uses the function low_level_input()
* that should handle the actual reception of bytes from the network
* interface. Then the type of the received packet is determined and
* the appropriate input function is called.
*
* @param netif the lwip network interface structure for this ethernetif
*/ /*
这个 函数 是 ethernetif_input 的 任务 , 处理已经 读取 从 硬件接口发来的一个数据包
这个函数 调用 low_level_input() 函数 ,这个函数 是 处理当前从网络接口 接收的数据
我 的 理解 是 这个函数 就是 第一时间 处理 从 网络 接口 来的 数据包。
参数没有 用到 不解释 2017年8月11日16:20:29
*/
void ethernetif_input( void * pvParameters )
{
struct pbuf *p;// 定义 这样 一个类型(pbuf) 的 指针 for( ;; )
{
//接收 信号量 阻塞时间 是 emacBLOCK_TIME_WAITING_FOR_INPUT 即 100ms
if (xSemaphoreTake( s_xSemaphore, emacBLOCK_TIME_WAITING_FOR_INPUT)==pdTRUE)
{
//这是 go 语法 不会 请 度娘
TRY_GET_NEXT_FRAME: //这里 是调用 这个 函数 2017年8月11日16:26:08 这个函数 干嘛 的那 //2017年8月11日17:11:32 经过我 一段 时间 的 观察 // 这个 函数 是 从 ETH 的 DMA 缓冲区 BUFF 中 获取 接收的 数据 放到 一个 pbuf 类型 的指针 指向 的内存中 即 P //这个 怎么 获取数据 从 DMA 缓冲区 中 后面 在 初始化 STM32 ETH 的 DMA 时 讲 2017年8月11日17:14:49 p = low_level_input( s_pxNetIf ); if (p != NULL)//判断 这个指针 不为 NULL
{ // 这里 就有 点复杂了 2017年8月11日17:15:37
// s_pxNetIf->input 是一个指针函数 // 这个指针函数 是 什么时候 复制 的那 // 首先 看 s_pxNetIf 全局搜索一下,发现 s_pxNetIf =netif; // netif 是 static void low_level_init(struct netif *netif) 的参数局部参数 // 我们看一下 这个 low_level_init 函数在哪调用的 ethernetif_init这个 函数中 调用的 // 看一下 这个 ethernetif_init 函数在哪 调用的 netif_add(&xnetif, &ipaddr, &netmask, &gw, NULL, &ethernetif_init, &tcpip_input); //netif_add 这个 函数 是 LWIP 提供 的标准 操作 网卡 的 函数 在 http://www.nongnu.org/lwip/2_0_x/group__netif.html#gade5498543e74067f28cc6bef0209e3be //这个 网址 有详细 的 介绍 ,从这里 可以得知 s_pxNetIf->input 函数 指 的就是 tcpip_input 函数 //tcpip_input 是 lwip 处理 以太网 数据 的 标准 函数 //这里 就可以总结一下 了 : 以太网 中断 函数 接收到数据后 产生 DMA以太网 中断 ,中断函数 发送 信号量 给 这个函数,这个函数把 DMA接收 //的 数据 从 DMA 缓冲区 拿出来 放到一个 pbuf 类型 的 缓冲区 中 , 并交给 LWIP 的函数 tcpip_input 直接处理 这个 pbuf 类型 的 数据 // 以太网 数据 整个 过程 到此结束 具体是 : ETH_IRQHandler->ethernetif_input->low_level_input->tcpip_input if (ERR_OK != s_pxNetIf->input( p, s_pxNetIf))
{ //数据处理完毕 发现数据 有问题 就释放 这个 数据包 ,正确的话 就 应该 交给 应用层 或者 其他层 去处理 了 暂时不研究
pbuf_free(p);
}
else
{
goto TRY_GET_NEXT_FRAME;//继续 查看DMA 缓冲区 是否有数据 有就接着处理 没有 就进入 信号量等待 2017年8月11日17:29:30 suozhang
}
}
}
}
}

总结  :ETH_IRQHandler->ethernetif_input->low_level_input->tcpip_input

以太网 数据 整个 过程 到此结束 具体是 :  ETH_IRQHandler->ethernetif_input->low_level_input->tcpip_input

      1、  数据 经过 的 流程 是  STM32  的 DMA 会 把 接收 的数据放到 DMA 缓冲区    然后 产生  DMA  接收数据中断

      2、  DMA 中断函数 中 会 发送信号 量  告诉 已经接收到数据 在 缓冲区里  

      3、  ethernetif_input 接收到信号量 后 会 调用 low_level_input 函数把 数据 从 DMA缓冲区 复制 到 一个 PBUF 类型 的缓冲区中

      4、  PBUF 类型的 缓冲区 最后交给  tcpip_input 函数 处理

这里 牵扯 到了   网卡 操作函数   http://www.nongnu.org/lwip/2_0_x/group__netif.html  中的 第一个 函数  netif_add()   http://www.nongnu.org/lwip/2_0_x/group__netif.html#gade5498543e74067f28cc6bef0209e3be

Add a network interface to the list of lwIP netifs.  2017年8月11日17:33:52  suozhang

LWIP network interface 即 LWIP 的 硬件 数据 接口 移植 详解 STM32 以太网数据 到达 的第二站: void ethernetif_input( void * pvParameters )的更多相关文章

  1. LWIP network interface 即 LWIP 的 硬件 数据 接口 移植 首先 详解 STM32 以太网数据 到达 的第一站: ETH DMA 中断函数

    要 运行  LWIP  不光 要实现  OS  的 一些 接口  ,还要 有 硬件 数据 接口 移植 ,即 网线上 来的 数据 怎么个形式 传递给  LWIP ,去解析 做出相应的 应答  ,2017 ...

  2. LWIP network interface 网卡 初始化 以 STM32 为例子 后面会有 用 2G 或者4G 模块 用 PPP拨号的 形式 虚拟出网卡 所以先以 这个为 前提

    LWIP   network interface   网卡 初始化    以  STM32  为例子  后面会有 用  2G 或者4G 模块 用 PPP拨号的 形式  虚拟出网卡  所以先以 这个为 ...

  3. 详解vue的数据binding原理

    自从angular火了以后,各种mv*框架喷涌而出,angular虽然比较火,但是他的坑还是蛮多的,还有许多性能问题被人们吐槽.比如坑爹的脏检查机制,数据binding是受人喜爱的,脏检查就有点…性能 ...

  4. LigerUI之Grid使用详解(三)——字典数据展示

    一.问题概述 在开发web信息管理系统时,使用Web前端框架可以帮助我们快速搭建一组风格统一的界面效果,而且能够解决大多数浏览器兼容问题,提升开发效率.在关于LigerGrid的前两篇的内容里,给大家 ...

  5. 10.Spark Streaming源码分析:Receiver数据接收全过程详解

    原创文章,转载请注明:转载自 听风居士博客(http://www.cnblogs.com/zhouyf/)   在上一篇中介绍了Receiver的整体架构和设计原理,本篇内容主要介绍Receiver在 ...

  6. 详解Kafka: 大数据开发最火的核心技术

    详解Kafka: 大数据开发最火的核心技术   架构师技术联盟 2019-06-10 09:23:51 本文共3268个字,预计阅读需要9分钟. 广告 大数据时代来临,如果你还不知道Kafka那你就真 ...

  7. 基于CentOS6.5下如何正确安装和使用Tcpreplay来重放数据(图文详解)

    前期博客 基于CentOS6.5下snort+barnyard2+base的入侵检测系统的搭建(图文详解)(博主推荐) tcpreplay是什么? 简单的说, tcpreplay是一种pcap包的重放 ...

  8. Android开发笔记之: 数据存储方式详解

    无论是神马平台,神马开发环境,神马软件程序,数据都是核心.对于开发平台来讲,如果对数据的存储有良好的支持,那么对应用程序的开发将会有很大的促进作用.总体的来讲,数据存储方式有三种:一个是文件,一个是数 ...

  9. Activity详解二 activity数据传递

    首先看效果图: 1.Bundle类的作用 Bundle类用作携带数据,它类似于Map,用于存放key-value名值对形式的值.相对于Map,它提供了各种常用类型的putXxx()/getXxx()方 ...

随机推荐

  1. DOM基础代码练习(一)

    上一篇介绍了一下DOM的一些基础的知识,这里我整理了一些有关上一篇知识点的一些封装函数. 1.遍历元素节点 function retChild(node) { var child = node.chi ...

  2. [JSOI2008]最大数 线段树解法

    题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值. 限制:L不超过当前数列的长度. 2. 插入操作 ...

  3. gulp快速将css中的px替换成rem

    1.Gulp安装配置 1.全局安装gulp 1.1 安装 命令提示符执行cnpm install gulp -g; 1.2 查看是否正确安装:命令提示符执行gulp -v,出现版本号即为正确安装. 2 ...

  4. python学习笔记之——正则表达式

    1.re模块 Python通过re模块提供对正则表达式的支持,re 模块使 Python 语言拥有全部的正则表达式功能.使用re的一般步骤是先将正则表达式的字符串形式编译为Pattern实例,然后使用 ...

  5. iOS友盟分享的使用总结

    现在几乎所有的APP都会集成分享,为了可以更好的推广自己的APP. 目前市面上常用的分享无非就三个: 1.友盟分享; 2.shareSDK(mob); 3.苹果原生. 由于苹果原生的分享使用起来不方便 ...

  6. ESP8266调试记录

    1.引脚图:使用STM32F103ZET6芯片的串口1  PA9-TX //PA10-RX(该串口挂载到APB2总线时钟)然后分别连接模块的RX和TX,供电使用3.3v(供电一定要稳)但不能超过5v ...

  7. ubuntu桌面安装常用软件&及常见问题

    自己从windows转向ubuntu桌面开发,根据需求安装以下文件: ubuntu 桌面版下载:http://www.ubuntu.org.cn/download/desktop 有的公司设置静态ip ...

  8. 在notepad++中快速插入当前时间方法

    插件是notepad++的一大优势,而要实现此功能,也必须借助TextFX插件. 1.点击"插件"-->"Plugin Manager"-->&qu ...

  9. 安装kubernetes 环境

    master: 10.6.2.170     #master节点兼做仓库 node-1: 10.6.2.171 node-2: 10.6.2.172 1.添加host解析 # cat << ...

  10. 沉淀再出发:ElasticSearch的中文分词器ik

    沉淀再出发:ElasticSearch的中文分词器ik 一.前言   为什么要在elasticsearch中要使用ik这样的中文分词呢,那是因为es提供的分词是英文分词,对于中文的分词就做的非常不好了 ...