查看: 4768|回复: 6

RT1052LWIP内存问题

[复制链接]

该用户从未签到

5

主题

21

帖子

0

注册会员

Rank: 2

积分
160
最后登录
2025-7-17
发表于 2019-2-25 13:55:35 | 显示全部楼层 |阅读模式
本帖最后由 tanic 于 2019-2-26 09:09 编辑

LWIP socket在使用内部RAM环境下测试OK,当换到SDRAM中时就不行了。
具体表现为:socket能创建但是DHCP无法获取到IP
SDRAM读写测试已经OK。

1.内存分配,从SDRAM中划出一块区域,用来给哪些只分配不需要释放的RAM快用
  1. #define __MYHEAP_ALIGN(var, alignbytes) \
  2.     ((unsigned int)((var) + ((alignbytes)-1)) & (unsigned int)(~(unsigned int)((alignbytes)-1)))
  3. /*16m*/
  4. /*0x80000000~0x80ffffff 用作静态分配*/

  5. static uint32_t static_addr=0;
  6. #define STATIC_SDRAM_ADDR                (0X80400000)
  7. #define STATIC_SDRAM_SPACE        (0XC00000)//12M
  8. __align(4) uint8_t staticsdram[STATIC_SDRAM_SPACE] __attribute__((at(STATIC_SDRAM_ADDR)));
  9. void *staticMalloc(uint32_t size)
  10. {
  11.         void *p=NULL;
  12. <div>        size = __MYHEAP_ALIGN(size,4);</div><div>if(size+static_addr>STATIC_SDRAM_SPACE)return NULL;
  13. </div>        p = (void*)(STATIC_SDRAM_ADDR + static_addr);
  14.         static_addr += size;
  15.         return p;
  16. }
复制代码
2.将lwip需要的缓冲区放到SDRAM中
  1. err_t ethernetif0_init(struct netif *netif)
  2. {
  3.     static struct ethernetif ethernetif_0;
  4. //    AT_NONCACHEABLE_SECTION_ALIGN(static enet_rx_bd_struct_t rxBuffDescrip_0[ENET_RXBD_NUM], FSL_ENET_BUFF_ALIGNMENT);
  5. //    AT_NONCACHEABLE_SECTION_ALIGN(static enet_tx_bd_struct_t txBuffDescrip_0[ENET_TXBD_NUM], FSL_ENET_BUFF_ALIGNMENT);
  6. //    SDK_ALIGN(static rx_buffer_t rxDataBuff_0[ENET_RXBD_NUM], FSL_ENET_BUFF_ALIGNMENT);
  7. //    SDK_ALIGN(static tx_buffer_t txDataBuff_0[ENET_TXBD_NUM], FSL_ENET_BUFF_ALIGNMENT);

  8. //    ethernetif_0.RxBuffDescrip = &(rxBuffDescrip_0[0]);
  9. //    ethernetif_0.TxBuffDescrip = &(txBuffDescrip_0[0]);
  10. //    ethernetif_0.RxDataBuff = &(rxDataBuff_0[0]);
  11. //    ethernetif_0.TxDataBuff = &(txDataBuff_0[0]);

  12.                 ethernetif_0.RxBuffDescrip = staticMalloc(SDK_SIZEALIGN(ENET_RXBD_NUM*sizeof(enet_rx_bd_struct_t),FSL_ENET_BUFF_ALIGNMENT));
  13.                 ethernetif_0.TxBuffDescrip = staticMalloc(SDK_SIZEALIGN(ENET_TXBD_NUM*sizeof(enet_tx_bd_struct_t),FSL_ENET_BUFF_ALIGNMENT));
  14.                 ethernetif_0.RxDataBuff = staticMalloc(SDK_SIZEALIGN(ENET_RXBUFF_SIZE, FSL_ENET_BUFF_ALIGNMENT)*ENET_RXBD_NUM);
  15.                 ethernetif_0.TxDataBuff = staticMalloc(SDK_SIZEALIGN(ENET_TXBUFF_SIZE, FSL_ENET_BUFF_ALIGNMENT)*ENET_TXBD_NUM);
  16.         
  17.     return ethernetif_init(netif, ðernetif_0, 0U, (ethernetif_config_t *)netif->state);
  18. }
复制代码
3.通过分散加载的方式,分配到外部SDRAM依然不行






回复

使用道具 举报

该用户从未签到

712

主题

6371

帖子

0

超级版主

Rank: 8Rank: 8

积分
24866
最后登录
2025-7-18
发表于 2019-3-1 18:31:47 | 显示全部楼层
楼主你好。
你有没有debug看看,你需要放到SDRAM的数据最后的地址是否在SDRAM。
另外,请你参考下SDK代码,工程xip目录下的xxx_sdram_ini_dcd.c,DCD的代码你是否添加了。
回复 支持 反对

使用道具 举报

该用户从未签到

26

主题

97

帖子

0

中级会员

Rank: 3Rank: 3

积分
386
最后登录
2023-9-12
发表于 2019-3-2 20:48:57 | 显示全部楼层
目前俺还是不太懂啊,俺得继续加油
回复 支持 反对

使用道具 举报

该用户从未签到

5

主题

21

帖子

0

注册会员

Rank: 2

积分
160
最后登录
2025-7-17
 楼主| 发表于 2019-5-28 15:52:31 | 显示全部楼层
本帖最后由 tanic 于 2019-5-28 15:54 编辑
小恩GG 发表于 2019-3-1 18:31
楼主你好。
你有没有debug看看,你需要放到SDRAM的数据最后的地址是否在SDRAM。
另外,请你参考下SDK代码, ...

sdram是OK的,可以用的,xip下面也是OK的,SDRAM一共32M
用的野火的RT1052开发板。LWIP这几个数组占的空间不是很大,SDRAM空间足够
回复 支持 反对

使用道具 举报

该用户从未签到

5

主题

21

帖子

0

注册会员

Rank: 2

积分
160
最后登录
2025-7-17
 楼主| 发表于 2019-5-28 15:55:29 | 显示全部楼层
怀疑是不是DMA的问题
回复 支持 反对

使用道具 举报

该用户从未签到

712

主题

6371

帖子

0

超级版主

Rank: 8Rank: 8

积分
24866
最后登录
2025-7-18
发表于 2019-5-29 14:16:31 | 显示全部楼层
tanic 发表于 2019-5-28 15:55
怀疑是不是DMA的问题

从你的代码来看,只是数据存放时间的变化,看不出与DMA操作有什么关系??
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

1

帖子

0

新手上路

Rank: 1

积分
6
最后登录
2021-7-8
发表于 2021-7-8 11:38:15 | 显示全部楼层
本帖最后由 xiaowei061 于 2021-7-8 11:39 编辑

DMA 访问不经过 cache 的原因,要将缓存放置于 noache 区域
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-7-19 09:57 , Processed in 0.096828 second(s), 25 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表