OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4353|回复: 3

关于原子udp_senddata()函数源代码中指针指飞践踏全局变量内存的问题

[复制链接]

1

主题

1

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2015-7-29
在线时间
4 小时
发表于 2017-8-13 11:49:05 | 显示全部楼层 |阅读模式
1金钱
以下是源代码
s8 udp_senddata(struct udp_pcb *upcb,u8 *sendbuf,u8 len)
{
        struct pbuf *ptr;
        static s8 err_s;
        ptr=pbuf_alloc(PBUF_TRANSPORT,len,PBUF_POOL); //éêÇëÄú′æ
        if(ptr)
        {
                //ptr->payload=(void*)sendbuf;     //此行代码为原子源代码
                memcpy(ptr->payload,sendbuf,len);//此行代码是本人更正后的代码
                err_s=udp_send(upcb,ptr);        //
                pbuf_free(ptr);//êí·ÅÄú′æ
        }
return err_s;       
}

问题描述:在调用udp_senddata(struct udp_pcb *upcb,u8 *sendbuf,u8 len)时,会出现程序中定义的某个全局变量数值被更改的情况。


原因:在调用udp_senddata()时,ptr->payload=(void*)sendbuf; 代码将要发送的UDP发送数组的指针给了 ptr->payload。而在执行UDP发送时,LWIP源码库里会操作ptr->payload 以及ptr->payload前后的内存,这样就相当于把 sendbuf前后的内存给践踏了。以至于全局变量被更改。
解决措施:改用memcpy(ptr->payload,sendbuf,len);//此行代码是本人更正后的代码,将要发送的数组sendbuf拷贝到 ptr->payload,而不是将数组sendbuf的指针赋给 ptr->payload。实际验证,措施有效。


请原子哥回答一下,上述描述是否合理。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2017-8-14 00:55:08 | 显示全部楼层
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2019-6-18
在线时间
11 小时
发表于 2023-6-5 09:36:06 | 显示全部楼层
感谢楼主 帮大忙了! 刚好我也碰到这个问题,看了你的帖子才解决的
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2023-12-19
在线时间
2 小时
发表于 2023-12-29 17:11:58 | 显示全部楼层
大佬,遇到过使用上述代码udp_senddata的函数接口,循环发送结构体数据,只有第一次接收端接收到的是正确的,后续数据全是0的问题吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 22:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表