|
发表于 2020-12-22 14:56:52
|
显示全部楼层
继续折腾了一下,可以ping成功了,但是效果不够稳定,还是容易掉
修改点:
1. MPU
保护区域覆盖描述符和后面的收发缓冲区
- static void MPU_Config( void )
- {
- MPU_Region_InitTypeDef MPU_InitStruct;
- /* 禁止 MPU */
- HAL_MPU_Disable();
- /* 最高性能,读Cache和写Cache都开启 */
- /* 配置AXI SRAM的MPU属性为Write back, Read allocate,Write allocate */
- MPU_InitStruct.Enable = MPU_REGION_ENABLE;
- MPU_InitStruct.BaseAddress = 0x24000000;
- MPU_InitStruct.Size = MPU_REGION_SIZE_512KB;
- MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
- MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;
- MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
- MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
- MPU_InitStruct.Number = MPU_REGION_NUMBER0;
- MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL1;
- MPU_InitStruct.SubRegionDisable = 0x00;
- MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
- HAL_MPU_ConfigRegion(&MPU_InitStruct);
- //NetX MPU保护描述符
- MPU_InitStruct.Enable = MPU_REGION_ENABLE;
- MPU_InitStruct.BaseAddress = 0x30040000;
- MPU_InitStruct.Size = MPU_REGION_SIZE_1KB;
- 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_NUMBER1;
- MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
- MPU_InitStruct.SubRegionDisable = 0x00;
- MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
- HAL_MPU_ConfigRegion(&MPU_InitStruct);
- //保护收发缓冲区
- MPU_InitStruct.Enable = MPU_REGION_ENABLE;
- MPU_InitStruct.BaseAddress = 0x30040400;
- MPU_InitStruct.Size = MPU_REGION_SIZE_32KB;
- 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_NUMBER3;
- MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL1;
- MPU_InitStruct.SubRegionDisable = 0x00;
- MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
- HAL_MPU_ConfigRegion(&MPU_InitStruct);
- /*使能 MPU */
- HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
- }
复制代码 2. NetX的接收函数
我自己觉得原来楼主那个接收处理写的不够完善,我把它稍微完善了下,可能还是有问题,但是起码ping成功的机率高了
- static VOID _nx_driver_hardware_packet_received(VOID)
- {
- ETH_BufferTypeDef RxBuff;
- uint32_t framelength = 0, cnt, status = 0;
- NX_PACKET *received_packet_ptr;
- NX_PACKET *packet_ptr;
- // for(idx=0; idx<ETH_RX_DESC_CNT-1; idx++)
- // {
- // RxBuff[idx].next = &RxBuff[idx+1];
- // }
- //
- // RxBuff[ETH_RX_DESC_CNT-1].next = &RxBuff[0];
- // 对于HAL_ETH_GetRxDataBuffer函数 ST库有介绍
- // 应该先调用HAL_ETH_GetRxDataLength,得到BUFF的数据
- // 然后对RxBuff分配内存大小,对RxBuff初始化(链型结构)
- // 在调用HAL_ETH_GetRxDataBuffer函数,ST在移植LWIP时没有这么做
- // 因为ST移植的程序不会出现一次收到2个以上的BUFF。
- // 如果收到多个BUFF,这个函数要改动
- memset(&RxBuff, 0, sizeof(ETH_BufferTypeDef));
- SCB_CleanInvalidateDCache ();
- if (HAL_ETH_IsRxDataAvailable(&EthHandle))
- {
- if (HAL_ETH_GetRxDataBuffer(&EthHandle, &RxBuff) == HAL_OK)
- {
- HAL_ETH_GetRxDataLength(&EthHandle, &framelength);
- /* Invalidate data cache for ETH Rx Buffers */
- SCB_InvalidateDCache_by_Addr((uint32_t*) RxBuff.buffer, framelength);
- cnt = EthHandle.RxDescList.FirstAppDesc; // 用户第一个描述符
- if (EthHandle.RxDescList.AppDescNbr != 1)
- {
- printf("RxDataBuffer !=1 error!\r\n");
- }
- // printf("rx: buffer=0x%x, len=0x%x cn=%d\r\n", (uint32_t) RxBuff.buffer, RxBuff.len, cnt);
- // printf("rx_pool 0x%x, tx_pool 0x%x\r\n", rx_pool.nx_packet_pool_available_list->nx_packet_data_end,
- // tx_pool.nx_packet_pool_available_list->nx_packet_data_end);
- // 保存用户描述符
- received_packet_ptr = nx_driver_information.nx_driver_information_receive_packets[cnt];
- // 重新分配一个新的BUFF给DMA描述符
- UINT ret = nx_packet_allocate(nx_driver_information.nx_driver_information_packet_pool_ptr, &packet_ptr,
- NX_RECEIVE_PACKET, NX_NO_WAIT);
- if (ret == NX_SUCCESS)
- {
- // Adjust the packet.
- packet_ptr->nx_packet_prepend_ptr += 2;
- // Remember the receive packet poitner.
- nx_driver_information.nx_driver_information_receive_packets[cnt] = packet_ptr;
- // 初始化RX描述符指针
- HAL_ETH_DescAssignMemory(&EthHandle, cnt, (uint8_t*) (packet_ptr->nx_packet_prepend_ptr), NULL);
- // Build Rx descriptor to be ready for next data reception
- HAL_ETH_BuildRxDescriptors(&EthHandle);
- SCB_InvalidateDCache_by_Addr((uint32_t*) packet_ptr->nx_packet_data_start, packet_ptr->nx_packet_data_end - packet_ptr->nx_packet_data_start);
- }
- else if (ret != NX_NO_PACKET)
- {
- // 分配内存失败--POOL不够大
- printf("rx_pool allocate error!\r\n");
- status = 1;
- }
- // 内存不足,扔掉数据 netx接收到数据,处理完最后会释放它,DMX描述符指向NULL的话-------HardFault_Handler见
- if (!status)
- {
- received_packet_ptr->nx_packet_next = NX_NULL;
- received_packet_ptr->nx_packet_length = RxBuff.len - 4; //去掉4位CRC检验码
- received_packet_ptr->nx_packet_append_ptr = received_packet_ptr->nx_packet_prepend_ptr + received_packet_ptr->nx_packet_length;
- received_packet_ptr->nx_packet_prepend_ptr = RxBuff.buffer;
- _nx_driver_transfer_to_netx(nx_driver_information.nx_driver_information_ip_ptr, received_packet_ptr);
- }
- }
- }
- }
复制代码 主要是加了个前置判断和对应的故障码判断
看看还有谁有更好的优化方法没~~~
|
|