英文:
Ethernet is stopped after using global variables in STM32
问题
I am using STM32H735ZGTx_ LQFP144.
我正在使用STM32H735ZGTx_ LQFP144。
I have done Ethernet configuration according to this link https://controllerstech.com/stm32-ethernet-1-connection/
我已经根据此链接https://controllerstech.com/stm32-ethernet-1-connection/进行了以太网配置。
If I am not using any global in any of the source file, I am not facing any issue, Ethernet is working fine.
如果我在任何源文件中不使用任何全局变量,我就不会遇到任何问题,以太网正常工作。
Whenever I declare and use global variables or static variables, I am facing some issue and the Ethernet is stopped.
每当我声明并使用全局变量或静态变量时,我就会遇到一些问题,以太网停止工作。
I am getting different errors based on the global variables size, as follows:
根据全局变量的大小,我会收到不同的错误,如下:
Error : Hard Fault error
char buff[5] = "123"; //已初始化
错误:硬件错误
char buff[100]; // uninitialized
Error: ssertion "pc>custom_free_function != NULL" failed at line 767 in../Middlewares/Third_Party/LwIP/sr/core/pbuf.c
char buff[100]; // 未初始化
错误:在../Middlewares/Third_Party/LwIP/sr/core/pbuf.c的第767行处,出现了“断言”pc > custom_free_function != NULL”的错误
char buff[200]: //uninitialized
Error:
Assertion "pbuf_free: p->ref > 0" failed at line 753 in../Middlewares/Third_Party/LwIP/src/core/pbuf.c
Error: Assertion "mem_trim: legal memory" failed at line 721 in ../Middlewares/Third_Party/LwIP/src/core/mem.c
char buff[200]: // 未初始化
错误:
在../Middlewares/Third_Party/LwIP/src/core/pbuf.c的第753行处,出现了“断言”pbuf_free: p->ref > 0”的错误
错误:在../Middlewares/Third_Party/LwIP/src/core/mem.c的第721行处,出现了“断言”mem_trim: legal memory”的错误
Changing the variable size is changing the errors.
更改变量大小会改变错误。
I'm new to STM, please help me with this issue.
我对STM不太了解,请帮我解决这个问题。
I have checked the address of global variables, all are stored in RAM_D1.
我已经检查了全局变量的地址,它们都存储在RAM_D1中。
In the hard fault, I noticed that, it's causing error when it is in pbuf_free() function.
在硬件错误中,我注意到当它在pbuf_free()函数中时,会导致错误。
<details>
<summary>英文:</summary>
I am using STM32H735ZGTx_ LQFP144.
I have done Ethernet configuration according to this link https://controllerstech.com/stm32-ethernet-1-connection/
If I am not using any global in any of the source file, I am not facing any issue, Ethernet is working fine.
Whenever I declare and use global variables or static variables, I am facing some issue and the Ethernet is stopped.
I am getting different errors based on the global variables size, as follows
char buff[5] = "123"; //initialized
Error : Hard Fault error
char buff[100]; // uninitialized
Error: ssertion "pc>custom_free_function != NULL" failed at line 767 in../Middlewares/Third_Party/LwIP/sr/core/pbuf.c
char buff[200]: //uninitialized
Error:
Assertion "pbuf_free: p->ref > 0" failed at line 753 in../Middlewares/Third_Party/LwIP/src/core/pbuf.c
Error: Assertion "mem_trim: legal memory" failed at line 721 in ../Middlewares/Third_Party/LwIP/src/core/mem.c
Changing the variable size is changing the errors.
I'm new to STM, please help me with this issue.
I have checked the address of global variables, all are stored in RAM_D1.
In the hard fault, I noticed that, it's causing error when it is in pbuf_free() function.
</details>
# 答案1
**得分**: 0
我发现一些STM32H7x系列的芯片存在以太网问题。尽管我们在CubeMX的ethernetif.c中配置了地址,但我们需要将RX_POOL缓冲区放在特定的RAM位置。
要修改链接脚本(*.ld)以便将ETH描述符和缓冲区放在D2 SRAM中。还建议将所有RAM都放在RAM_D1中。在STM32CubeMX生成的项目中,默认情况下使用带有"_FLASH"后缀的链接脚本(例如:STM32H750XBHx_FLASH.ld),应该进行修改。带有"_RAM"后缀的链接脚本是用于从内部RAM存储器执行代码的模板。
在进行这些修改之后,我的问题得到了解决。Rx_Pool存储pbufs,但由于不正确的对齐,它会覆盖一些pbuf指针。
**注意**:如果您将Rx_Pool存储在其他RAM或地址中,对齐必须正确,否则它会再次覆盖。
<details>
<summary>英文:</summary>
I have found that some of the STM32H7x series have Ethernet issues.
Although we configured the address in CubeMX in ethernetif.c but we need to place RX_POOL buffer at specific RAM.
/* USER CODE BEGIN 2 /
#if defined ( GNUC ) / GNU Compiler /
attribute((section(".Rx_PoolSection"))) extern u8_t memp_memory_RX_POOL_base[];
#endif
/ USER CODE END 2 */
Modify the linkerscript (*.ld) that the **ETH descriptors and buffers are located in D2 SRAM. Also it is recommended to place all RAM to RAM_D1.** In STM32CubeMX generated project, the "_FLASH" suffix linkerscript should be modified, which is used by default
(e.g.: STM32H750XBHx_FLASH.ld). The "_RAM" suffix linkerscript is template for executing code from internal RAM memory.
} >RAM_D1
/* Modification start */
.lwip_sec (NOLOAD) :
{
. = ABSOLUTE(0x30040000);
*(.RxDecripSection)
. = ABSOLUTE(0x30040060);
*(.TxDecripSection)
/* Rx_Pool section must be added in linker */
. = ABSOLUTE(0x30040200);
*(.Rx_PoolSection)
} >RAM_D2
After these modifications, my issue was resolved.
Rx_Pool stores the pbufs, but due to improper alignment it was overwriting some of the pbuf pointers.
**Note**: If you are storing Rx_Pool in some other RAM or address, the alignment must be proper, or else it will overwrite again.
</details>
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论