stm32调试软件诡异现象,debug在bkpt停下了。
最近在调试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=data_buffer;
}
send(sock_conn,data_buffer,length, 0);
}
else
{
closesocket(sock_conn);
}
}
osDelay(1);
}
/* USER CODE END Start_Tcp_Connect_Task */
} 这里方法用过没有 lb0857 发表于 2022-3-26 09:14
这里方法用过没有
(引用自2楼)
第三种方法试了,没起作用。剩下两种还没试过。
看起来好像不是程序使用流程上的问题,像是协议栈使用了printf等函数,而keil又没有相关的支持导致的。
这么说好像也不是程序本身的问题。更像是编译设置的问题 achild 发表于 2022-3-26 10:52
第三种方法试了,没起作用。剩下两种还没试过。
看起来好像不是程序使用流程上的问题,像是协议栈使用了p ...
(引用自3楼)
试了一下,应该是协议栈在输出错误信息,而我这没有输出的接口。加了输出接口,但是其实更重要的是当协议栈需要输出错误信息的时候,说明此时程序已经出问题了。最重要的应该是解决这个出错的问题。 找到原因了lwip_setsockopt中参数的数据类型写错了。然后编译竟然没报错。哈哈哈 lwip_setsockopt中参数的数据类型错了
警告有没有?
都没有的话超出编译器检查范畴或者是逻辑性错误{:lol:} lb0857 发表于 2022-3-28 13:55
lwip_setsockopt中参数的数据类型错了
警告有没有?
都没有的话超出编译器检查范畴或者是逻辑性错误 ...
(引用自6楼)
这个的话,仔细看了一下,应该是我的问题,传递参数一个是数据指针,一个是数据长度。数据类型错的话,也确实不会引起报错。
不过。总算是摸清楚这个协议栈的套路了。收工
本帖最后由 achild 于 2022-3-31 15:07 编辑
在记录一种情况,总是在tcp收发数据的时候跳bkpt,感觉糟透了。仔细想了下,估计跟mpu有关,对比了原子的手册,试了加了句cache透写,然后好像是不调bkpt了。
页:
[1]