STM32
直播中

douyin8

13年用户 1184经验值
私信 关注
[问答]

用ATKKPING做PING测试,运行一段时间后PING不通的原因?怎么解决?

最近在移植 niche stack 网络协议栈,用的操作系统是 ucos ii ,硬件平台是 NUCLEO H743ZI遇到了一些问题请教一下各位。

现象:用ATKKPING 做PING测试。按下复位键单片机开始运行,PING时间<1ms,过了一会就会PING不通,或者PING延时非常高。以上是在我去掉 FTP 、TELNET、 PINGAPP 等一些无关任务后做的测试。附件是我用 SYSTEM VIEW 抓到的数据。

我也移植到了FREERTOS下但是也遇到了相似问题,所以回到Ucos 下。

下面是我的的 时钟、 MPU、 ETHDSC、接收 发送、 关键代码。

时钟:

void  BSP_ClkInit (void)

{

    RCC_ClkInitTypeDef  RCC_ClkInit;

    RCC_OscInitTypeDef  RCC_OscInit;

    RCC_PeriphCLKInitTypeDefPeriphClkInitStruct;


    PWR->CR3  = ~PWR_CR3_SCUEN;                                 /* Supplyconfiguration updated locked.                */


    __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);  /* See Note 2.                                      */


    while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)){

        ;

    }

    /* Enable D2 domainSRAM3 Clock (0x30040000 AXI)*/

    __HAL_RCC_D2SRAM3_CLK_ENABLE();

    /* Enable D2 domainSRAM2 Clock (0x30020000 AXI)*/

    __HAL_RCC_D2SRAM2_CLK_ENABLE();

                                                               /* Enable HSE Osc and activate PLL with HSE as source   */

    RCC_OscInit.OscillatorType =RCC_OSCILLATORTYPE_HSE;        /* HSE = 8MHz                                          */

    RCC_OscInit.HSEState       = RCC_HSE_BYPASS;

    RCC_OscInit.HSIState       = RCC_HSI_OFF;

    RCC_OscInit.CSIState       = RCC_CSI_OFF;

    RCC_OscInit.PLL.PLLState   = RCC_PLL_ON;

    RCC_OscInit.PLL.PLLSource  = RCC_PLLSOURCE_HSE;


    RCC_OscInit.PLL.PLLM       = 4u;                            /*f(REF_CK)    = HSE / PLLM          = 2MHz            */

    RCC_OscInit.PLL.PLLN       = 400u;                          /* f(VCO clock)= f(REF_CK) * PLLN    = 800MHz          */

    RCC_OscInit.PLL.PLLP       = 2u;                            /* PLL(PCLK)   = f(VCO clock) / PLLR =400MHz          */

    RCC_OscInit.PLL.PLLR       = 2u;                            /* PLL(RCLK)   = f(VCO clock) / PLLR =400MHz          */

    RCC_OscInit.PLL.PLLQ       = 4u;                            /* PLL(QCLK)   = f(VCO clock) / PLLQ =200MHz          */


    RCC_OscInit.PLL.PLLVCOSEL  = RCC_PLL1VCOWIDE;

    RCC_OscInit.PLL.PLLRGE     =RCC_PLL1VCIRANGE_2;


    if (HAL_RCC_OscConfig( RCC_OscInit) != HAL_OK) {

        while(1u);                                              /* STOP iferror                                       */

    }


                                                               /* ----- CFG SYSCLK SOURCE AND BUS CLOCK DIVIDERS ----- */

    RCC_ClkInit.ClockType      =(RCC_CLOCKTYPE_SYSCLK   |

                                 RCC_CLOCKTYPE_HCLK     |

                                 RCC_CLOCKTYPE_D1PCLK1  |

                                 RCC_CLOCKTYPE_PCLK1    |

                                 RCC_CLOCKTYPE_PCLK2    |

                                 RCC_CLOCKTYPE_D3PCLK1);


    RCC_ClkInit.SYSCLKSource   =RCC_SYSCLKSOURCE_PLLCLK;       /* Select PLL assystem clock source.                   */

    RCC_ClkInit.SYSCLKDivider  =RCC_SYSCLK_DIV1;               /* SYSCLK  = PLL(P CLK) = 400MHz                        */

    RCC_ClkInit.AHBCLKDivider  =RCC_HCLK_DIV2;                 /* HCLK    = AHBxCLK = SYSCLK / AHBPRES(2) =200MHz.    */

    RCC_ClkInit.APB3CLKDivider =RCC_APB3_DIV2;                 /* APB3CLK =AHB3CLK / APB3DIV(2)          =100MHz.    */

    RCC_ClkInit.APB1CLKDivider =RCC_APB1_DIV2;                 /* APB1CLK =AHB1CLK / APB1DIV(2)          =100MHz.    */

    RCC_ClkInit.APB2CLKDivider =RCC_APB2_DIV2;                 /* APB2CLK =AHB2CLK / APB2DIV(2)          =100MHz.    */

    RCC_ClkInit.APB4CLKDivider =RCC_APB4_DIV2;                 /* APB2CLK =AHB4CLK / APB4DIV(2)          =100MHz.    */


    if (HAL_RCC_ClockConfig( RCC_ClkInit,FLASH_LATENCY_4) != HAL_OK) {

        while(1u);                                              /* STOP iferror                                       */

    }

    PeriphClkInitStruct.PeriphClockSelection =RCC_PERIPHCLK_USART3;

    PeriphClkInitStruct.Usart234578ClockSelection =RCC_USART234578CLKSOURCE_D2PCLK1;

    if (HAL_RCCEx_PeriphCLKConfig( PeriphClkInitStruct)!= HAL_OK) {

        while(1u);                                              /* STOP iferror                                       */

    }

    __HAL_RCC_CSI_ENABLE();                                     /* activate CSI clkmondatory for I/O Compensation Cell */

    __HAL_RCC_SYSCFG_CLK_ENABLE();                              /* Enable SYSCFGclk mondatory for I/O Compensation Cell*/

    HAL_EnableCompensationCell();                               /* Enables theI/O Compensation Cell                   */

}

MPU:

/**

  * @brief Configure the MPU attributes

  * @param None

  * @retval None

  */

static void MPU_Config(void)

{

  MPU_Region_InitTypeDef MPU_InitStruct;


  /* Disable the MPU */

  HAL_MPU_Disable();


  /* Configure the MPU attributes asDevice not cacheable

     for ETH DMA descriptors */

  MPU_InitStruct.Enable =MPU_REGION_ENABLE;                      //区域使能/禁止

  MPU_InitStruct.BaseAddress = 0x30040000;                        //配置区域基地址

  MPU_InitStruct.Size =MPU_REGION_SIZE_256B;                    //区域容量

  MPU_InitStruct.AccessPermission =MPU_REGION_FULL_ACCESS;       //设置访问权限

  MPU_InitStruct.IsBufferable =MPU_ACCESS_BUFFERABLE;            //禁止/允许缓冲

  MPU_InitStruct.IsCacheable =MPU_ACCESS_NOT_CACHEABLE;          //禁止/允许缓存

  MPU_InitStruct.IsShareable =MPU_ACCESS_NOT_SHAREABLE;          //禁止/允许共享

  MPU_InitStruct.Number = MPU_REGION_NUMBER0;                     //区域编号

  MPU_InitStruct.TypeExtField =MPU_TEX_LEVEL0;                   //类型扩展级别

  MPU_InitStruct.SubRegionDisable = 0x00;                         // region 除能位段设置

  MPU_InitStruct.DisableExec =MPU_INSTRUCTION_ACCESS_ENABLE;     //允许/禁止取指


  HAL_MPU_ConfigRegion( MPU_InitStruct);


  /* Configure the MPU attributes asCacheable write through */

  MPU_InitStruct.Enable =MPU_REGION_ENABLE;                      //区域使能/禁止

  MPU_InitStruct.BaseAddress = 0x30020000;                        //配置区域基地址

  MPU_InitStruct.Size =MPU_REGION_SIZE_128KB;                   //区域容量

  MPU_InitStruct.AccessPermission =MPU_REGION_FULL_ACCESS;       //设置访问权限

  MPU_InitStruct.IsBufferable =MPU_ACCESS_NOT_BUFFERABLE;        //禁止/允许缓冲

  MPU_InitStruct.IsCacheable =MPU_ACCESS_CACHEABLE;              //禁止/允许缓存

  MPU_InitStruct.IsShareable =MPU_ACCESS_NOT_SHAREABLE;          //禁止/允许共享

  MPU_InitStruct.Number =MPU_REGION_NUMBER1;                     //区域编号

  MPU_InitStruct.TypeExtField =MPU_TEX_LEVEL0;                   //类型扩展级别

  MPU_InitStruct.SubRegionDisable = 0x00;                         // region 除能位段设置

  MPU_InitStruct.DisableExec =MPU_INSTRUCTION_ACCESS_ENABLE;     //允许/禁止取指


  HAL_MPU_ConfigRegion( MPU_InitStruct);


  /* Enable the MPU */

  HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);

}


ETH DSC

#pragma location=0x30040000

ETH_DMADescTypeDef  DMARxDscrTab[ETH_RX_DESC_CNT]; /* Ethernet RxDMA Descriptors */

#pragma location=0x30040060

ETH_DMADescTypeDef  DMATxDscrTab[ETH_TX_DESC_CNT]; /* Ethernet TxDMA Descriptors */

#pragma location=0x30040200

uint8_tRx_Buff[ETH_RX_DESC_CNT][ETH_RX_BUFFER_SIZE]; /* Ethernet ReceiveBuffers */



RX

void  EthifTask (void *p_arg)

{

  (void)p_arg;

  ETH_BufferTypeDef RxBuff;

  uint32_t framelength = 0;

  CPU_INT08U err;


  for (;;)

  {

    OSSemPend(RxPktSemaphore, 0,  err);

    if ((err != OS_NONE_ERR)   (err != OS_SEM_TIMEOUT))

      dtrap();


    if (HAL_ETH_GetRxDataBuffer( EthHandle,  RxBuff) == HAL_OK)

    {

      HAL_ETH_GetRxDataLength( EthHandle,  framelength);


      /* Invalidate datacache for ETH Rx Buffers */

      SCB_InvalidateDCache_by_Addr((uint32_t *)Rx_Buff,(ETH_RX_DESC_CNT * ETH_RX_BUFFER_SIZE));


      if (current_pbuf_idx <(ETH_RX_DESC_CNT - 1))

      {

        current_pbuf_idx++;

      }

      else

      {

        current_pbuf_idx = 0;

      }

    }


#ifdef ALT_INICHE


#ifdef SYSTEM_VIEW

  SEGGER_SYSVIEW_PrintfHostEx("ETH Rcv RxPkt",SEGGER_SYSVIEW_LOG);

#endif


    input_ippkt(RxBuff.buffer, framelength);

#endif

    /* Build Rxdescriptor to be ready for next data reception */

    HAL_ETH_BuildRxDescriptors( EthHandle);

  }

}



TX


int8_t ETH_SendTxPkt(uint8_t *buffer, uint32_t len)

{

  int8_t errval = HAL_OK;

  ETH_BufferTypeDef *Txbuffer = NULL;


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


  Txbuffer->buffer  = buffer;

  Txbuffer->len     = len;

  Txbuffer->next    = NULL;


  TxConfig.Length   = len;

  TxConfig.TxBuffer = Txbuffer;


#ifdef SYSTEM_VIEW

  SEGGER_SYSVIEW_PrintfHostEx("ETH SendTx Pkt",SEGGER_SYSVIEW_LOG);

#endif


  errval = HAL_ETH_Transmit( EthHandle,  TxConfig, 0);


  return errval;

}



回帖(1)

打马过草原

2024-5-10 17:58:00
根据您提供的信息,您在使用ATKKPING进行PING测试时遇到了一些问题,包括PING不通或者延时非常高。在分析问题和提供解决方案之前,我们需要考虑以下几个方面:

1. 网络环境:确保您的网络环境稳定,没有其他设备或应用程序干扰网络连接。

2. 硬件平台:检查NUCLEO H743ZI硬件平台是否存在问题,例如网络接口卡(NIC)或其他硬件故障。

3. 软件配置:检查您的网络协议栈配置是否正确,包括IP地址、子网掩码、网关等设置。

4. 操作系统:确保UCOS II操作系统的配置和调度策略正确,以避免任务调度问题。

5. 网络协议栈:检查niche stack网络协议栈的移植和配置是否正确。

针对您提到的问题,以下是一些建议和可能的解决方案:

1. 检查网络环境:确保您的网络环境稳定,没有其他设备或应用程序干扰网络连接。您可以尝试在不同的网络环境下进行测试,以排除网络环境问题。

2. 检查硬件平台:检查NUCLEO H743ZI硬件平台是否存在问题,例如网络接口卡(NIC)或其他硬件故障。您可以尝试使用其他硬件平台进行测试,以排除硬件问题。

3. 检查软件配置:确保您的网络协议栈配置正确,包括IP地址、子网掩码、网关等设置。您可以使用网络配置工具(如ifconfig)检查网络配置。

4. 优化操作系统:检查UCOS II操作系统的配置和调度策略,确保任务调度正确。您可以尝试调整操作系统的优先级、时间片等参数,以优化任务调度。

5. 检查网络协议栈:检查niche stack网络协议栈的移植和配置是否正确。您可以尝试使用其他网络协议栈进行测试,以排除网络协议栈问题。

6. 分析系统视图:您提到使用了SYSTEM VIEW抓取数据,仔细分析这些数据,查找可能导致问题的原因。例如,检查CPU使用率、内存使用情况、任务调度等。

7. 优化关键代码:检查您的时钟、MPU、ETHDSC、接收发送等关键代码,确保它们正确实现并优化性能。您可以尝试使用性能分析工具(如gprof)分析程序的性能瓶颈。

8. 考虑使用其他操作系统:您提到在FREERTOS下也遇到了相似问题,可以尝试使用其他实时操作系统(如ThreadX、VxWorks等)进行测试,以排除操作系统问题。


举报

更多回帖

×
20
完善资料,
赚取积分