硬汉嵌入式论坛

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

[以太网] 各位大佬, ucos-iii / ucos3 + lwip 可以dhcp, 能够正常获取到ip, 但是ping 时会出现卡顿 ?

[复制链接]

699

主题

3634

回帖

5756

积分

论坛元老

积分
5756
发表于 2025-9-6 09:19:59 | 显示全部楼层 |阅读模式
本帖最后由 hpdell 于 2025-9-6 09:56 编辑

使用 mdk v5.42a  + ac6 + lwip 2.1.2  + ucos3 v3.08.2

#define LWIP_COMPAT_MUTEX               0     


/* 启动任务 */
#define  APP_TASK_START_PRIO                   13

#define  APP_TASK_USER_PRIO                    14
#define  APP_TASK_COMMON_PRIO                                        15

#define  APP_TASK_MUSIC_PRIO                                        16
#define  APP_TASK_GUI_PRIO                                           (OS_CFG_PRIO_MAX - 6)

#define  APP_CFG_TASK_NET_DHCP_PRIO      8                //       
#define  APP_CFG_TASK_NET_LINK_PRIO      7                //               
#define  APP_CFG_TASK_NET_INPUT_PRIO     6                // ethernetif_input 线程

#define  APP_CFG_TASK_NET_TCPIP_PRIO     5                // tcpip 主线程的优先级
#define  APP_CFG_TASK_NET_PRIO           9





各位大佬, ucos-iii / ucos3 + lwip 可以dhcp, 能够正常获取到ip, 但是ping 时会出现卡顿 ?

开发板设为 服务端, 电脑上位机使用客户端进行链接成功

进行 socket 链接 成功, 不过在链接成功后 开发板端发送数据给 电脑上位机端 延时特别严重,

使用 电脑端上位机发送给开发板则是完全正常, 出现这样的情况是怎么一回事呀  ??

dhcp 获取 ip 的速度还是可以的


ppp6.png   ping 时每次都会丢, 貌似比较有规律

-------------------------------------------------------------------------------------------------------------------------------
上述出现的 问题如果
使用 mdk v5.42a  + ac5 + lwip 2.1.2  + ucos3 v3.08.2 则完全没有任何问题的, 所以现在有点迷糊了

#define LWIP_COMPAT_MUTEX               0     


/* 启动任务 */
#define  APP_TASK_START_PRIO                   13

#define  APP_TASK_USER_PRIO                    14
#define  APP_TASK_COMMON_PRIO                                        15

#define  APP_TASK_MUSIC_PRIO                                        16
#define  APP_TASK_GUI_PRIO                                           (OS_CFG_PRIO_MAX - 6)

#define  APP_CFG_TASK_NET_DHCP_PRIO      8                //       
#define  APP_CFG_TASK_NET_LINK_PRIO      7                //               
#define  APP_CFG_TASK_NET_INPUT_PRIO     6                // ethernetif_input 线程

#define  APP_CFG_TASK_NET_TCPIP_PRIO     5                // tcpip 主线程的优先级
#define  APP_CFG_TASK_NET_PRIO           9


望各位大佬指点迷津呀












回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
118331
QQ
发表于 2025-9-6 10:18:27 | 显示全部楼层
找到底层的发送函数,发送前做Cache Clean操作试试
回复

使用道具 举报

699

主题

3634

回帖

5756

积分

论坛元老

积分
5756
 楼主| 发表于 2025-9-6 11:25:06 | 显示全部楼层
eric2013 发表于 2025-9-6 10:18
找到底层的发送函数,发送前做Cache Clean操作试试




貌似初步找到问题点了,如下:

static OS_SEM TxPktSemaphore; /* 用于同步以太网发送数据信号 */



                        /* 创建多值信号量 TxPktSemaphore */
                OSSemCreate((OS_SEM      *)&TxPktSemaphore,    //指向信号量变量的指针
                                   (CPU_CHAR    *)"TxPktSemaphore",    //信号量的名字
                                   (OS_SEM_CTR   )1,             //表示现有资源数目
                                   (OS_ERR      *)&err);         //错误类型




void HAL_ETH_TxCpltCallback(ETH_HandleTypeDef *heth)   这个函数发送完成后都会触发
{
        CPU_INT08U  os_err;
        (void)OSSemPost((OS_SEM  *)&TxPktSemaphore,
                                         (OS_OPT   )OS_OPT_POST_ALL,  //OS_OPT_POST_1,
                                         (OS_ERR  *)&os_err);
}






static err_t low_level_output(struct netif *netif, struct pbuf *p)
{
       

       
        // ETH_INPUT_MODE         == ETH_INPUT_TASK  在工作时会出现卡顿, ping, 或 开发板与 上位机链接 都会出现卡顿的情况
                (void)netif;
       
          uint32_t i = 0U;
          struct pbuf *q = NULL;
          err_t errval = ERR_OK;
          ETH_BufferTypeDef Txbuffer[ETH_TX_DESC_CNT] = {0};

          memset(Txbuffer, 0 , ETH_TX_DESC_CNT*sizeof(ETH_BufferTypeDef));

          for(q = p; q != NULL; q = q->next)
          {
                if(i >= ETH_TX_DESC_CNT)
                  return ERR_IF;

                Txbuffer.buffer = q->payload;
                Txbuffer.len = q->len;

                if(i>0)
                {
                  Txbuffer[i-1].next = &Txbuffer;
                }

                if(q->next == NULL)
                {
                  Txbuffer.next = NULL;
                }

                i++;
          }

          TxConfig.Length = p->tot_len;
          TxConfig.TxBuffer = Txbuffer;
          TxConfig.pData = p;

          pbuf_ref(p);

          do
          {
                if(HAL_ETH_Transmit_IT(&EthHandle, &TxConfig) == HAL_OK)
                {
                  errval = ERR_OK;
                }
                else
                {

                  if(HAL_ETH_GetError(&EthHandle) & HAL_ETH_ERROR_BUSY)
                  {
        //        /* Wait for descriptors to become available */

// 出现卡顿, 问题就出在 OSSemPend 这个函数上, 如果把 OSSemPend 这个函数屏蔽掉后 发送 响应速度贼快, ping 也贼快, 这个地方 要怎么写才能够正常不卡的呀 ?
// 赶脚是 OSSemPend 这个函数等待的 TxPktSemaphore 信号量超时退出而不是正常等到的情况 ??
                                CPU_INT08U  os_err;
                       
                                 OSSemPend((OS_SEM  *)&TxPktSemaphore,
                                                          (OS_TICK  )0,
                                                          (OS_OPT   )OS_OPT_PEND_NON_BLOCKING,                // OS_OPT_PEND_NON_BLOCKING   OS_OPT_PEND_BLOCKING
                                                          (CPU_TS  *)0,
                                                          (OS_ERR  *)&os_err);
                          
                        HAL_ETH_ReleaseTxPacket(&EthHandle);
                        errval = ERR_BUF;
                  }
                  else
                  {
                        /* Other error */
                        pbuf_free(p);
                        errval =  ERR_IF;
                  }
                }
          }while(errval == ERR_BUF);

          return errval;
  
}










回复

使用道具 举报

699

主题

3634

回帖

5756

积分

论坛元老

积分
5756
 楼主| 发表于 2025-9-7 17:15:54 | 显示全部楼层
本帖最后由 hpdell 于 2025-9-7 17:17 编辑
eric2013 发表于 2025-9-6 10:18
找到底层的发送函数,发送前做Cache Clean操作试试

你好,, 问一下出现我的这个情况,是不是我的  ucos3 没有移植好造成的呀 ??

我移植的 ucos3 src 使用的是 3.8.2
                       lib   使用的 是从    3.8.1 版本里面 抠出来的
                       cpu 使用的 是从    3.8.1 版本里面 抠出来的




回复

使用道具 举报

699

主题

3634

回帖

5756

积分

论坛元老

积分
5756
 楼主| 发表于 2025-9-8 08:36:20 | 显示全部楼层
赶脚又有点不像是 ucos3 没有移植好, 因为在 mdk ac5 下运行又都是正常的, 代码都是一样的(只是 ucos3 在 ac6 下几个接口文件不同外),真是搞迷糊呀   
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
118331
QQ
发表于 2025-9-9 10:46:55 | 显示全部楼层
hpdell 发表于 2025-9-7 17:15
你好,, 问一下出现我的这个情况,是不是我的  ucos3 没有移植好造成的呀 ??

我移植的 ucos3 src  ...

uCOS本身的移植应该没问题,应该是和lwip的接口函数还有点问题。

调节AC6的优化等级试试
回复

使用道具 举报

699

主题

3634

回帖

5756

积分

论坛元老

积分
5756
 楼主| 发表于 2025-9-9 17:05:06 | 显示全部楼层
本帖最后由 hpdell 于 2025-9-9 17:07 编辑
eric2013 发表于 2025-9-9 10:46
uCOS本身的移植应该没问题,应该是和lwip的接口函数还有点问题。

调节AC6的优化等级试试




mdk ac6 优化等级 从 -O0 到最高都最高都试过了,结果都无一例外的 都不行,

目前的处理方式是采用 在 发送 中断信号量的地方采用 标志位 的方法, 在等待信号量的地方 判断发送标志位是否置位 来进行,这个方法测试速度很快,应该算是暂时解决了,但总有点哪里怪怪的

我在 使用等待信号量的地方打印 log 时发现 等待的信号量是等到了,等待前/后 都打印一个字符出来查看,结果等待信号量前/后 都很快,但就是不清楚为何还是那么卡  啊  ? (都已经等到发送完成后发送过来的信号量)

lwip 接口部分还得再研究研究




回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-26 16:31 , Processed in 0.043507 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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