在线时间15 小时
UID3231476
注册时间2017-6-28
NXP金币49
该用户从未签到
注册会员

- 积分
- 160
- 最后登录
- 2025-7-17
|
本帖最后由 tanic 于 2019-2-26 09:09 编辑
LWIP socket在使用内部RAM环境下测试OK,当换到SDRAM中时就不行了。
具体表现为:socket能创建但是DHCP无法获取到IP
SDRAM读写测试已经OK。
1.内存分配,从SDRAM中划出一块区域,用来给哪些只分配不需要释放的RAM快用
- #define __MYHEAP_ALIGN(var, alignbytes) \
- ((unsigned int)((var) + ((alignbytes)-1)) & (unsigned int)(~(unsigned int)((alignbytes)-1)))
- /*16m*/
- /*0x80000000~0x80ffffff 用作静态分配*/
- static uint32_t static_addr=0;
- #define STATIC_SDRAM_ADDR (0X80400000)
- #define STATIC_SDRAM_SPACE (0XC00000)//12M
- __align(4) uint8_t staticsdram[STATIC_SDRAM_SPACE] __attribute__((at(STATIC_SDRAM_ADDR)));
- void *staticMalloc(uint32_t size)
- {
- void *p=NULL;
- <div> size = __MYHEAP_ALIGN(size,4);</div><div>if(size+static_addr>STATIC_SDRAM_SPACE)return NULL;
- </div> p = (void*)(STATIC_SDRAM_ADDR + static_addr);
- static_addr += size;
- return p;
- }
复制代码 2.将lwip需要的缓冲区放到SDRAM中
- err_t ethernetif0_init(struct netif *netif)
- {
- static struct ethernetif ethernetif_0;
- // AT_NONCACHEABLE_SECTION_ALIGN(static enet_rx_bd_struct_t rxBuffDescrip_0[ENET_RXBD_NUM], FSL_ENET_BUFF_ALIGNMENT);
- // AT_NONCACHEABLE_SECTION_ALIGN(static enet_tx_bd_struct_t txBuffDescrip_0[ENET_TXBD_NUM], FSL_ENET_BUFF_ALIGNMENT);
- // SDK_ALIGN(static rx_buffer_t rxDataBuff_0[ENET_RXBD_NUM], FSL_ENET_BUFF_ALIGNMENT);
- // SDK_ALIGN(static tx_buffer_t txDataBuff_0[ENET_TXBD_NUM], FSL_ENET_BUFF_ALIGNMENT);
- // ethernetif_0.RxBuffDescrip = &(rxBuffDescrip_0[0]);
- // ethernetif_0.TxBuffDescrip = &(txBuffDescrip_0[0]);
- // ethernetif_0.RxDataBuff = &(rxDataBuff_0[0]);
- // ethernetif_0.TxDataBuff = &(txDataBuff_0[0]);
- ethernetif_0.RxBuffDescrip = staticMalloc(SDK_SIZEALIGN(ENET_RXBD_NUM*sizeof(enet_rx_bd_struct_t),FSL_ENET_BUFF_ALIGNMENT));
- ethernetif_0.TxBuffDescrip = staticMalloc(SDK_SIZEALIGN(ENET_TXBD_NUM*sizeof(enet_tx_bd_struct_t),FSL_ENET_BUFF_ALIGNMENT));
- ethernetif_0.RxDataBuff = staticMalloc(SDK_SIZEALIGN(ENET_RXBUFF_SIZE, FSL_ENET_BUFF_ALIGNMENT)*ENET_RXBD_NUM);
- ethernetif_0.TxDataBuff = staticMalloc(SDK_SIZEALIGN(ENET_TXBUFF_SIZE, FSL_ENET_BUFF_ALIGNMENT)*ENET_TXBD_NUM);
-
- return ethernetif_init(netif, ðernetif_0, 0U, (ethernetif_config_t *)netif->state);
- }
复制代码 3.通过分散加载的方式,分配到外部SDRAM依然不行
|
|