如果使用netconn API的话,udp接收过程需要用到mbox传递接收的包(传递的是指针)

mbox发送过程:

api_msg.c中recv_udp中会将接收的包发送给udp的接收mbox

sys_mbox_trypost传送的仅仅是netbuf的指针

  1. static void
  2. recv_udp(void *arg, struct udp_pcb *pcb, struct pbuf *p,
  3. const ip_addr_t *addr, u16_t port)
  4. {
  5. struct netbuf *buf;
  6. struct netconn *conn;
  7. u16_t len;
  8.  
  9. buf = (struct netbuf *)memp_malloc(MEMP_NETBUF);
  10. if (buf == NULL) {
  11. pbuf_free(p);
  12. return;
  13. } else {
  14. buf->p = p;
  15. buf->ptr = p;
  16. ip_addr_set(&buf->addr, addr);
  17. buf->port = port;
  18. }
  19.  
  20. len = p->tot_len;
  21. if (sys_mbox_trypost(&conn->recvmbox, buf) != ERR_OK) {
  22. netbuf_delete(buf);
  23. return;
  24. } else {
  25. /* Register event with callback */
  26. API_EVENT(conn, NETCONN_EVT_RCVPLUS, len);
  27. }
  28. }

在sys_mbox_trypost中,调用FreeRTOS的消息队列发送函数,这里传送的就是buf的地址了,即netbuf的指针的指针

  1. err_t sys_mbox_trypost(sys_mbox_t *mbox, void *msg)
  2. {
  3. err_t result;
  4.  
  5. if ( xQueueSend( *mbox, &msg, ) == pdPASS )
  6. {
  7. result = ERR_OK;
  8. }
  9. else {
  10. // could not post, queue must be full
  11. result = ERR_MEM;
  12. }
  13.  
  14. return result;
  15. }

mbox接收过程:

api_lib.c中完成udp的接收过程,netconn_recv主要完成TCP的接收,对于UDP其实是在netconn_recv_data函数中

  1. static err_t
  2. netconn_recv_data(struct netconn *conn, void **new_buf)
  3. {
  4. void *buf = NULL;
  5. u16_t len;
  6.  
  7. *new_buf = NULL;
  8.  
  9. #if LWIP_SO_RCVTIMEO
  10. 11 if (sys_arch_mbox_fetch(&conn->recvmbox, &buf, conn->recv_timeout) == SYS_ARCH_TIMEOUT) {
  11. return ERR_TIMEOUT;
  12. }
  13. #else
  14. sys_arch_mbox_fetch(&conn->recvmbox, &buf, );
  15. #endif /* LWIP_SO_RCVTIMEO*/
  16.  
  17. #if (LWIP_UDP || LWIP_RAW)
  18. {
  19. LWIP_ASSERT("buf != NULL", buf != NULL);
  20. len = netbuf_len((struct netbuf*)buf);
  21. }
  22. #endif /* (LWIP_UDP || LWIP_RAW) */
  23.  
  24. /* Register event with callback */
  25. API_EVENT(conn, NETCONN_EVT_RCVMINUS, len);
  26.  
  27. LWIP_DEBUGF(API_LIB_DEBUG, ("netconn_recv_data: received %p, len=%"U16_F"\n", buf, len));
  28.  
  29. *new_buf = buf;
  30. /* don't set conn->last_err: it's only ERR_OK, anyway */
  31. return ERR_OK;
  32. }

在sys_arch_mbox_fetch中,msg的参数是一个指针的指针,因为要修改指针指向的位置,调用FreeRTOS的消息队列接收函数(该函数只有void*),xQrecv用的只是指针,前面post的可是指针的指针啊?

  1. u32_t sys_arch_mbox_fetch(sys_mbox_t *mbox, void **msg, u32_t timeout)
  2. {
  3. void *dummyptr;
  4. portTickType StartTime, EndTime, Elapsed;
  5.  
  6. StartTime = xTaskGetTickCount();
  7.  
  8. if ( timeout != )
  9. {
  10. if ( pdTRUE == xQueueReceive( *mbox, &(*msg), timeout / portTICK_RATE_MS ) )
  11. {
  12. EndTime = xTaskGetTickCount();
  13. Elapsed = (EndTime - StartTime) * portTICK_RATE_MS;
  14.  
  15. return ( Elapsed );
  16. }
  17. else // timed out blocking for message
  18. {
  19. *msg = NULL;
  20.  
  21. return SYS_ARCH_TIMEOUT;
  22. }
  23. }
  24. else // block forever for a message.
  25. {
  26. while( pdTRUE != xQueueReceive( *mbox, &(*msg), portMAX_DELAY ) ){} // time is arbitrary
  27. EndTime = xTaskGetTickCount();
  28. Elapsed = (EndTime - StartTime) * portTICK_RATE_MS;
  29.  
  30. return ( Elapsed ); // return time blocked TODO test
  31. }
  32. }

recv_udp              netconn_recv_data(**)

  netbuf *buf        

  try_post(*)        fetch(**)

    xQsend(**)    xQrecv(**)

还是没太想明白~~~

知乎里有一个回答https://www.zhihu.com/question/29180416

传递指针,是需要修改指针指向的变量

传递指针的指针,是需要修改指针本身,即修改指针指向的东西。比如udp_app中定义netbuf* buf,但该指针是空的,没有指向任何东西,在netconn_recv中需要将buf指向协议栈分配的那个netbuf,就需要修改buf指向的东西,所以,需要传递buf的地址,即指针的指针,其实是指针的地址。

由lwip的mbox中netbuf传递看指针的指针的更多相关文章

  1. C++程序设计(关于函数中数组传递的一点心得)

    题目: 10个学生考完期末考试评卷完成后,老师需要划出及格线,要求如下: (1) 及格线是10的倍数: (2) 保证至少有60%的学生及格: (3) 如果所有的学生都高于60分,则及格线为60分:   ...

  2. java面试3-对于java中值传递的理解(Hollis)

    这是根据Hollis的直面java内容习得(有兴趣的可以加他微信公众号) 对于初学者来说,要理解java中的值传递很难理解,为什么说java只有值传递?那引用传递呢? java中的错误理解: 错误理解 ...

  3. C++中引用传递与指针传递区别

    C++中引用传递与指针传递区别 在C++中,指针和引用经常用于函数的参数传递,然而,指针传递参数和引用传递参数是有本质上的不同的: 指针传递参数本质上是值传递的方式,它所传递的是一个地址值.值传递过程 ...

  4. 深入理解python中函数传递参数是值传递还是引用传递

    深入理解python中函数传递参数是值传递还是引用传递 目前网络上大部分博客的结论都是这样的: Python不允许程序员选择采用传值还是传 引用.Python参数传递采用的肯定是"传对象引用 ...

  5. Android中Intent传递对象的两种方法(Serializable,Parcelable)

    今天要给大家讲一下Android中 Intent中如何传递对象,就我目前所知道的有两种方法,一种是Bundle.putSerializable(Key,Object);另一种是 Bundle.putP ...

  6. 【持续集成】[Jenkins]Job中如何传递自定义变量

    [Jenkins]Job中如何传递自定义变量 来自dweiwei   2015-06-27 18:37:19|  分类: 自动化测试 |举报 |字号大中小 订阅 用微信  “扫一扫” 将文章分享到朋友 ...

  7. Spark小课堂Week7 从Spark中一个例子看面向对象设计

    Spark小课堂Week7 从Spark中一个例子看面向对象设计 今天我们讨论了个问题,来设计一个Spark中的常用功能. 功能描述:数据源是一切处理的源头,这次要实现下加载数据源的方法load() ...

  8. 转:C++中引用传递与指针传递区别

    从概念上讲.指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变. 而引用是一个别名,它在逻辑上不是独立的,它的存在具有 ...

  9. 2015年4月27日---C语言:输出特殊图案,请在c环境中运行,看一看,Very Beautiful!

    ---恢复内容开始--- 题目:输出特殊图案,请在c环境中运行,看一看,Very Beautiful! 1.程序分析:字符共有256个.不同字符,图形不一样. 2.程序源代码: [code=c] #i ...

随机推荐

  1. Objectarx 相交矩形求并集 面域转多段线

    测试结果: 主要思路:拾取一个点作为矩形的插入点,分别以该点进行两次jig操作,就能得到白色的两个相交的polyline,之后需要变成红色的封闭多段线.做法就是:求出两个白色矩形的面域,然后通过boo ...

  2. Unity 基于Cinemachine计算透视摄像机在地图中的移动范围

    Unity中Cinemachine的基础功能介绍可详见之前写的博客: https://www.cnblogs.com/koshio0219/p/11820654.html 本篇的重点是讨论,在给定规则 ...

  3. MySql笔记(二)

    目录 MySQL笔记(二) 一幅画,一次瞬间的回眸,就在那次画展上,那个眼神,温柔的流转,还是那干净的皮鞋,一尘不染,俊朗的眉宇性感的唇,悄悄走近,牵手一段浪漫 MySQL笔记(二) 13.条件查询 ...

  4. web网页设计五种布局

    1.大框套小框布局   2.通栏布局   3.导航栏在主视觉下方的布局  4.左中右布局  5.环绕式布局

  5. Asp.Net Core 已支持 gRPC-Web !!

    grpc-dotnet 项目在 PR #695 完成了 ASP.NET Core 服务与 .NET Core gRPC 客户端的 gRPC-Web 实现. 虽然目前还是实验性项目,但是并不阻碍我们为之 ...

  6. CF6B President's Office 题解

    看到大致思路一致的题解,决定发一篇运用STL不用dfs的题解     好久不发题解,心里不爽 思路: 1.输入的同时找到总统桌子的位置,用vector<pair <int,int> ...

  7. windows下RocketMQ安装部署

    一.预备环境 1.系统 Windows 2. 环境 JDK1.8.Maven.Git 二. RocketMQ部署 1.下载 1.1地址:http://rocketmq.apache.org/relea ...

  8. (转) exp1-2://一次有趣的XSS漏洞挖掘分析(2)

      第一次和一套程序做了这么多次的斗争.今天基友又给我来信说,没得玩了.了解了下情况,是他拿着0day到处插,被人家发现了.还出了个公告,说所有***必须安装补丁.呵呵,性福总是走的这么突然.这乐子一 ...

  9. 创建dynamics CRM client-side (九) - 用JS来获取look up 信息

    我们用以下的代码可以获取到look up 的信息. 大家可以查看微软文档来查看更多关于 lookup object的信息 https://docs.microsoft.com/en-us/powera ...

  10. Linux程序守护脚本

    不废话,直接上脚本,[]注释的下发语句需要按需替换: #!/usr/bin/env bash PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/us ...