完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
最近在移植 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个回答
|
|
根据您提供的信息,您在使用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等)进行测试,以排除操作系统问题。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1786 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1622 浏览 1 评论
1089 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
730 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1680 浏览 2 评论
1942浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
739浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
576浏览 3评论
598浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
560浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-25 15:19 , Processed in 0.733135 second(s), Total 47, Slave 40 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号