STM32H7 LWIP 踩坑

/ 0评 / 0

其实LWIP移植网上教程太多了,针对H7踩坑的描述也非常多,但是我这里要说的当然有些例外.

网上说必须修改主RAM到D2域,这完全不需要啊,包括官方例子也是这么做,实际上没必要,放着TCM不用,用低速内存?所以我是保持的.

第二,官方可能为了保持移植兼容性,所以以太网描述符都在SRAM1,但是其实H743是有SRAM3的,而且这一块在D2 SRAM末端,本来就是设计给以太网和USB使用的,在MPU中使他可缓存,不可共享,然后在lwipopts中配置.

/* MEM_SIZE: the size of the heap memory. If the application will send
a lot of data that needs to be copied, this should be set high. */
#define MEM_SIZE                (16*1024)

/* Relocate the LwIP RAM heap pointer */
#define LWIP_RAM_HEAP_POINTER    (0x30040000)

第三,LWIP的POOL最好在D2,这样可以减少D1-D2或者D3-D2的传输开销,所以这里也放在一起.

#pragma location=0x30000000
ETH_DMADescTypeDef  DMARxDscrTab[ETH_RX_DESC_CNT]; /* Ethernet Rx DMA Descriptors */
#pragma location=0x30000200
ETH_DMADescTypeDef  DMATxDscrTab[ETH_TX_DESC_CNT]; /* Ethernet Tx DMA Descriptors */

/* Memory Pool Declaration */
LWIP_MEMPOOL_DECLARE(RX_POOL, ETH_RX_BUFFER_CNT, sizeof(RxBuff_t), "Zero-copy RX PBUF pool");

#pragma location = 0x30000400
extern u8_t memp_memory_RX_POOL_base[];

那么这里是多大呢,首先描述符一个是4B * 8,我这里设置16个RX,16个TX,这样提高交换效率,低了减少内存占用,大了优化性能.所以上面就有1024字节占用.接着在ETH_RX_BUFFER_CNT定义为12,开启统计,因此内存占用是(1056 * ETH_RX_BUFFER_CNT) = 12676.

所以目前移植下来的内存占用情况是:

现在的库在我看来是没有BUG的,测试没发现有问题,大家都可以参考工程,一般来说,都上网络了,不上OS不是不行,只是比较麻烦,实际涉及移植的文件有sys_arch.c/sys_arch.h,当然这个是FreeRTOS给的移植,剩余的移植都在Core目录内,都是自己的文件,驱动嘛,基本不用管,为了提高效率和使用HAL库,额外重载了HAL Tick相关API.

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注