硬汉嵌入式论坛

 找回密码
 立即注册
查看: 397|回复: 7
收起左侧

[以太网] RL-TCP 多设备同时发送死机在tcp发送

[复制链接]

1

主题

3

回帖

6

积分

新手上路

积分
6
发表于 2023-11-29 11:29:49 | 显示全部楼层 |阅读模式
求助:

在使用硬汉哥的RL_TCP 进行传输数据时候,目前单个板可以正常收发数据(稳定运行1天以上),但同时使用多个板同时(将串口数据转换为以太网数据发送出去)向电脑端发送数据时候 差不多30分钟会开始有板子死机,通过调试发现最终死在tcp_send 造成hardfault 或则申请内存失败,已经加大了任务的heap,情况无好转。有遇到类似情况的吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106826
QQ
发表于 2023-11-29 12:02:26 | 显示全部楼层
注意不同板子设置不同的MAC地址,这个地方改了吧。
回复

使用道具 举报

1

主题

3

回帖

6

积分

新手上路

积分
6
 楼主| 发表于 2023-11-29 14:34:18 | 显示全部楼层
eric2013 发表于 2023-11-29 12:02
注意不同板子设置不同的MAC地址,这个地方改了吧。

更改了的  mac ip 都改了  不然应该也不能通讯几十分钟   另外 请问一下  ETHTask优先级    CoreTask 优先级  和自己写的任务优先级  有没有什么先后关系呢   我看您的demo 都是用的同一个优先级   我尝试将CoreTask优先级防高  发现 通讯速率变低了
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106826
QQ
发表于 2023-11-29 15:35:07 | 显示全部楼层
yutianlong 发表于 2023-11-29 14:34
更改了的  mac ip 都改了  不然应该也不能通讯几十分钟   另外 请问一下  ETHTask优先级    CoreTask 优 ...

如果这个区分开了,那1个没问题,多个应该也是没问题的,剩下就是看下你电脑处理多路并发数据处理了。
回复

使用道具 举报

1

主题

3

回帖

6

积分

新手上路

积分
6
 楼主| 发表于 2023-12-1 09:37:23 | 显示全部楼层
硬汉哥,昨天又做了测试,发现在发送模块中 如果发送完成后 延迟1ms 再次发送 就很快会出现发送不成功的情况,这种情况  有没有什么改进的方式呢  具体发送模块代码如下,其他代码与您的Demo工程一致

void TcpSevTx(void)
{             
                int32_t iCount;
                uint32_t maxlen;
          uint8_t *sendbuf;
       
                uint32_t send_len = 0;
                uint8_t msg_prio;
          uint8_t *txbufptr;
    osDelay(TcpTxCycleTime);/*在这里 延迟时间如果是1ms  将在10S 左右一直发不出数据*/
                if(osMessageQueueGet(TcpTxQueueHandle,TcpSendNumBuf,&msg_prio,0)==osOK)/*回复请求消息*/
                {
                                TrsmitNumT = TcpSendNumBuf[0];
                }
                else//发送数据
    {
                                if(TestF)/*模拟测试数据发送*/
                                {
                                                memcpy(TcpSendBuf,TcpSendBuf1,1780);/*测试数据在TcpSendBuf1 中*/
                                                TrsmitNumT = 1068;
                                }
                                else/*武数据发送*/
                                {
                                        return ;
                                }                               
                }
                iCount = TrsmitNumT;//send_len;
                do
                {
                        if(netTCP_SendReady(tcp_sock) == true )
                        {
                                        maxlen  = netTCP_GetMaxSegmentSize (tcp_sock);
                                        iCount -= maxlen;
                                       
                                        if(iCount < 0)
                                        {
                                                /* 这么计算没问题的 */
                                                maxlen = iCount + maxlen;
                                        }                               
                                        sendbuf = netTCP_GetBuffer(maxlen);
                                        for(send_len=0;send_len<maxlen;send_len++)
                                        {
                                                sendbuf[send_len] = TcpSendBuf[send_len];
                                                //txbufptr++;
                                        }                               
                                        /* 必须使用申请的内存空间 */
                                        netTCP_Send (tcp_sock, sendbuf, maxlen);
                                        retryCnt = 0;
                                        retryCnt = HAL_GetTick();
                        }                       
                }while(iCount > 0);       
}
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106826
QQ
发表于 2023-12-2 09:53:11 | 显示全部楼层
yutianlong 发表于 2023-12-1 09:37
硬汉哥,昨天又做了测试,发现在发送模块中 如果发送完成后 延迟1ms 再次发送 就很快会出现发送不成功的情 ...

这个if判断的逻辑实现是不是不太好。

   if(osMessageQueueGet(TcpTxQueueHandle,TcpSendNumBuf,&msg_prio,0)==osOK)/*回复请求消息*/
                {
                                TrsmitNumT = TcpSendNumBuf[0];
                }
else
{
}
回复

使用道具 举报

1

主题

3

回帖

6

积分

新手上路

积分
6
 楼主| 发表于 2023-12-3 15:34:49 | 显示全部楼层
硬汉哥:
现在通过抓包分析看到卡死的原因为 接收到PC 发过来的数据  还没有发送ACK  这个时候有数据要发送 ,先发送了数据 ,再发送ACK   ;  造成PC端回复ACK的Seq为ARM回复ACK req , 进而造成ARM一直没有接收到发送包的ACK,造成一直卡在发送函数。详细件附件图片

所以有没有什么方法能确保收到PC数据后,ACK已经完成发送方法呢?
另外 通过抓包工具分析发现回复ACK的时间基本上在800us 以上 ,有没有什么方法提高ack的回复时间呢?

死机抓包图片.png
回复

使用道具 举报

5

主题

192

回帖

212

积分

高级会员

积分
212
发表于 2023-12-4 13:14:17 | 显示全部楼层
yutianlong 发表于 2023-12-3 15:34
硬汉哥:
现在通过抓包分析看到卡死的原因为 接收到PC 发过来的数据  还没有发送ACK  这个时候有数据要发 ...

你TCP数据的发送周期是多少? 我任务100ms执行一次,没出现过卡死的情况
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-6 07:08 , Processed in 0.312229 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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