搜索
bottom↓
回复: 7

stm32调试软件诡异现象,debug在bkpt停下了。

[复制链接]

出10入4汤圆

发表于 2022-3-25 21:06:45 | 显示全部楼层 |阅读模式
最近在调试stm32h7的lwip协议栈中用socket写一个tcp服务器端。
本来是通了的,为了防阻塞接收发送卡死,给connect加timeout的时候发现,只要写了设置timeout语句lwip_setsockopt,就会在debug的时候在执行到accept的时候自动停在bkpt汇编指令处。
此时还没有运行到lwip_setsockopt。真的好诡异。求大佬解惑啊!
tcp任务如下。

void Start_Tcp_Connect_Task(void *argument)
{
  /* USER CODE BEGIN Start_Tcp_Connect_Task */
  /* Infinite loop */
       
        //netconn_set_nonblocking(conn,1);
        while(!eth_ok_flag)
        {
                osDelay(1);
        }               
        struct sockaddr_in server_addr;                                //服务器地址
        struct sockaddr_in conn_addr;                                //连接地址
        int sock_fd;                                                                //服务器的 socked
        int sock_conn;                                                                // 请求的 socked
        socklen_t addr_len;                                                        // 地址长度
        int err;
        int length;
        int send_timeout=5000;
        int recv_timeout=5000;
       
        sock_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);                //建立一个新的socket连接       
        memset(&server_addr, 0, sizeof(server_addr));                                //将服务器地址清空
        server_addr.sin_family = AF_INET;                                                        //地址家族
        server_addr.sin_addr.s_addr =htonl(INADDR_ANY);                                //注意转化为网络字节序
        server_addr.sin_port = htons(6000);       
        err = bind(sock_fd, (struct sockaddr *)&server_addr, sizeof(server_addr));        //建立绑定
        if (err < 0)                                                                                                                            //如果绑定失败则关闭套接字
        {
                        closesocket(sock_fd);                                                                                                 //关闭套接字
        }
        err = listen(sock_fd, 1);                                                                        //监听连接请求
        if (err < 0)                                                                                                 //如果监听失败则关闭套接字
        {
                        closesocket(sock_fd);                                                                 //关闭套接字
        }
        addr_len = sizeof(struct sockaddr_in);                                        //将链接地址赋值给addr_len
        sock_conn = accept(sock_fd, (struct sockaddr *)&conn_addr, &addr_len);       
        send(sock_conn, "connect success!\n\r", 21, 0);
  for(;;)
  {       
                if(sock_conn<0)                                                                                        //状态小于0代表连接故障,此时关闭套接字
                {
                        closesocket(sock_fd);
                }
                else
                {
                        lwip_setsockopt(sock_conn,SOL_SOCKET,SO_SNDTIMEO,&send_timeout,sizeof(send_timeout));                       
                        lwip_setsockopt(sock_conn,SOL_SOCKET,SO_RCVTIMEO,&recv_timeout,sizeof(recv_timeout));                               
                        memset(data_buffer, 0, sizeof(data_buffer));                        //清空接收Buff
                        length = recv(sock_conn, (unsigned int *)data_buffer, 100, 0);       
                        if(length>0)
                        {
                                for(uint8_t i=0;i<length;i++)
                                {
                                        tcp_server_recvbuf[i]=data_buffer[i];
                                }
                                send(sock_conn,data_buffer,length, 0);       
                        }
                        else
                        {
                                closesocket(sock_conn);
                        }
                }
                osDelay(1);
  }
  /* USER CODE END Start_Tcp_Connect_Task */
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出1315入193汤圆

发表于 2022-3-26 09:14:44 | 显示全部楼层
这里方法用过没有

出10入4汤圆

 楼主| 发表于 2022-3-26 10:52:35 | 显示全部楼层
lb0857 发表于 2022-3-26 09:14
这里方法用过没有
(引用自2楼)

第三种方法试了,没起作用。剩下两种还没试过。
看起来好像不是程序使用流程上的问题,像是协议栈使用了printf等函数,而keil又没有相关的支持导致的。
这么说好像也不是程序本身的问题。更像是编译设置的问题

出10入4汤圆

 楼主| 发表于 2022-3-28 11:06:55 | 显示全部楼层
achild 发表于 2022-3-26 10:52
第三种方法试了,没起作用。剩下两种还没试过。
看起来好像不是程序使用流程上的问题,像是协议栈使用了p ...
(引用自3楼)

试了一下,应该是协议栈在输出错误信息,而我这没有输出的接口。加了输出接口,但是其实更重要的是当协议栈需要输出错误信息的时候,说明此时程序已经出问题了。最重要的应该是解决这个出错的问题。

出10入4汤圆

 楼主| 发表于 2022-3-28 11:56:25 | 显示全部楼层
找到原因了lwip_setsockopt中参数的数据类型写错了。然后编译竟然没报错。哈哈哈

出1315入193汤圆

发表于 2022-3-28 13:55:39 | 显示全部楼层
lwip_setsockopt中参数的数据类型错了  
警告有没有?
都没有的话  超出编译器检查范畴  或者是逻辑性错误  

出10入4汤圆

 楼主| 发表于 2022-3-28 14:07:12 | 显示全部楼层
lb0857 发表于 2022-3-28 13:55
lwip_setsockopt中参数的数据类型错了  
警告有没有?
都没有的话  超出编译器检查范畴  或者是逻辑性错误   ...
(引用自6楼)

这个的话,仔细看了一下,应该是我的问题,传递参数一个是数据指针,一个是数据长度。数据类型错的话,也确实不会引起报错。
不过。总算是摸清楚这个协议栈的套路了。收工

出10入4汤圆

 楼主| 发表于 2022-3-31 14:56:53 | 显示全部楼层
本帖最后由 achild 于 2022-3-31 15:07 编辑

在记录一种情况,总是在tcp收发数据的时候跳bkpt,感觉糟透了。仔细想了下,估计跟mpu有关,对比了原子的手册,试了加了句cache透写,然后好像是不调bkpt了。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-29 09:32

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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