qinmeng 发表于 2012-11-27 15:31:00

RTT+LWIP,只用STM32F407内部0x10000000开始64K的CCMRAM中,网络不通

RT,硬件环境STM32F407VET6+KSZ8041NL,之前一直没注意内存的使用问题,所以网络一直都是好的。
目前我们需要很大一部分存储空间作为缓冲区(越大越好)。
因为STM32F407内存空间为:0x20000000开始的128KB的SRAM和0x10000000开始的64KB的CCMRAM。
所以就想着把连续的128KB全部做为缓冲区,而把其他的放到0x10000000开始的64KB的CCMRAM中。

已经注意到那64KB的CCRAM不能用作DMA缓冲,所以已经把网络DMA定义到了0x20000000开始的SRAM中去,可是网络还是不通,最基本的网络中断都进不去~~~不知道有人做过这方面的研究没,一起探讨一下!

ffxz 发表于 2012-11-27 16:26:21

还是建议关注CCM不能使用DMA的问题

qinmeng 发表于 2012-11-27 16:30:23

刚刚问题貌似得到解决了,我来说明一下吧:stm32f4x7_eth.c中
不但要将网络发送DMA缓冲区Tx_Buff、接收DMA缓冲区Rx_Buff定义到0x20000000中去,还要将发送、接收DMA描述符表(Ethernet Tx, Rx DMA Descriptor):也放到0x20000000中去。
如下:
#pragma data_alignment=4
#pragma location = ".DMARAM"
   ETH_DMADESCTypeDefDMARxDscrTab;/* Ethernet Rx MA Descriptor */
#pragma data_alignment=4
   #pragma location = ".DMARAM"
   ETH_DMADESCTypeDefDMATxDscrTab;/* Ethernet Tx DMA Descriptor */
#pragma data_alignment=4
#pragma location = ".DMARAM"
   uint8_t Rx_Buff; /* Ethernet Receive Buffer */
#pragma data_alignment=4
#pragma location = ".DMARAM"
   uint8_t Tx_Buff; /* Ethernet Transmit Buffer */

liurangzhou 发表于 2012-11-27 16:46:13

之前我也遇到这么低级问题,DMA访问不到CCRAM

ctgutc 发表于 2012-12-18 20:33:23

你定义128K缓存后,以太网速度有多块?

qinmeng 发表于 2013-1-2 11:03:45

ctgutc 发表于 2012-12-18 20:33 static/image/common/back.gif
你定义128K缓存后,以太网速度有多块?

我的128K不是真正作为网络的DMA缓存,而是人为的保存下来之前发送的UDP数据,为自定义的重传使用!
所以那128KRAM对系统跟网络速度都没有提升

qinmeng 发表于 2013-1-3 10:34:40

本帖最后由 qinmeng 于 2013-1-3 11:18 编辑

ffxz 发表于 2012-11-27 16:26 static/image/common/back.gif
还是建议关注CCM不能使用DMA的问题

你好,ffxz:还是关于那64KCCMRAM的问题,我之前以为通过一下方式得到解决了

刚刚问题貌似得到解决了,我来说明一下吧:stm32f4x7_eth.c中
不但要将网络发送DMA缓冲区Tx_Buff、接收DMA缓冲区Rx_Buff定义到0x20000000中去,还要将发送、接收DMA描述符表(Ethernet Tx, Rx DMA Descriptor):也放到0x20000000中去。
如下:
#pragma data_alignment=4
#pragma location = ".DMARAM"
   ETH_DMADESCTypeDefDMARxDscrTab;/* Ethernet Rx MA Descriptor */
#pragma data_alignment=4
   #pragma location = ".DMARAM"
   ETH_DMADESCTypeDefDMATxDscrTab;/* Ethernet Tx DMA Descriptor */
#pragma data_alignment=4
#pragma location = ".DMARAM"
   uint8_t Rx_Buff; /* Ethernet Receive Buffer */
#pragma data_alignment=4
#pragma location = ".DMARAM"
   uint8_t Tx_Buff; /* Ethernet Transmit Buffer */

现在出现了新问题:
当我向一个任意IP地址的任意端口(也即IP:Port不存在)发送UDP包的时候,netconn_send会返回错误类型,这到没什么。
但是当发送几次之后,就进入硬件错误。提示在RT-Thread/src/mem.c的第291行(RTT1.1.0RC版本)(RTT1.1.0正式版的302行)                              
/* and insert it between mem and mem->next */
mem->next = ptr2;
mem->used = 1;
如果我向一个已知的IP地址已知端口(也即有IP:Port在接收UDP包)发送UDP包,netconn_send返回ERR_OK也能持续发送,不会进入硬件错误
而在uCOS中没有出现过这种现象

另,今天刚测试的结果:RT-Thread1.1.0正式版+lwip1.4.1版本
当我不用那64KCCMRAM时候,不管是向哪个IP:port都不会进硬件错误
当我只用64KCCMRAM,只把网络DMA放到0x20000000的128kRAM中去,网络可以正常运行,但是:
当向不存在的IP:Port发送UDP包时,进硬件错误,向已知IP:Port(也即有IP:Port在接收次UDP包)则不进硬件错误

希望问题能得到解决!谢谢~

刚刚又测试得到的结果:(网络DMABuffer始终在0x20000000的128kRAM中)
readwrite, block HEAP, block CSTACK
上面这3块不能同时放在CCMRAM中去,任意两个放进去,或者任意一个放进去或者都不放进去,这样就不会发生上面的硬件错误!

更明确一点:不是readwrite不能跟block HEAP, block CSTACK同时放在CCMRAM中,而是任务堆栈不能跟block HEAP, block CSTACK同时放在CCMRAM中。

即使是一个空任务(只有一个rt_thread_delay(1000);)也不能把它的任务堆栈跟block HEAP, block CSTACK同时放在CCMRAM中。

戒指320 发表于 2013-2-22 13:07:57

john800422 发表于 2013-7-26 01:54:19

關注下64K

tscjc 发表于 2014-2-11 16:26:51

你好,我现在在做STM32F407的网络部分,问题很多,希望大侠指点一下网络中断,现在可以接收和发送数据,但是想用网络中断方式,网络中断看了挺长时间,还是不明白,连最基本的中断都进不去,希望指点一下
页: [1]
查看完整版本: RTT+LWIP,只用STM32F407内部0x10000000开始64K的CCMRAM中,网络不通