yebo_123 发表于 2014-8-12 10:25:30

关于1768单片机RAM 不够用的问题

最近在用1768做一个功能,1768与服务器能够进行数据交互,同时能够差U盘在开发板上进行数据读取。用到TCP和USB两个功能。作为两个大任务放在UCOS-II下运行。
在调试的过程遇到一些问题,叙述一下:
首先,我先单独测试TCP功能,单片机作为服务器端,电脑的调试软件作为客户端,能连接上,收发数据正常。见 图-1

然后单独测试USB的功能,也可以。
然后我把USB的功能移植到TCP工程里面,编译出错.\Out\ReleaseInFlash\LPC1700.axf: Error: L6406E: No space in execution regions with .ANY selector matching ip.o(.data).
                                                                        \Out\ReleaseInFlash\LPC1700.axf: Error: L6406E: No space in execution regions with .ANY selector matching tcp.o(.data).
应该是说程序太大,RAM放不下了,然后百度了一下解决方法,把KEIL里面的Targe Option的 IRAM2前面打上勾 图-2,OK,编译通过。烧程序,运行,然后停住了,程序不走了。
我琢磨着是不是TCP和USB两个任务之间有冲突。我就创建了一个简单的任务,流水灯。我测试TCP和流水灯两个任务的运行情况(把和USB有关的代码都屏蔽了),也不能运行,灯走了几步就停了,TCP也连不上。然后我想到
这两个任务的代码没有那么大,32K的本地RAM应该可以放下,然后把IRAM2前面的勾去掉了,确实是的,编译通过,下载运行。竟然可以了,流水灯一直运行,TCP也连上了,收发数据正常。然后我回去又把IRAM2前面的勾打上,
下载运行,奇了怪了,灯走了几步就停了,TCP也连不上。同样的代码,什么都没改,仅仅在IRAM2前打了个勾,运行结果就差这么大。我就想,原先的USB和TCP一起的工程是不是也是因为这个呢?但是想不到解决的办法,程序核心发部分没法优化,只能把堆栈数组改小些,但是还是太大,不勾IRAM2编译不通过。所以上论坛和想和大家讨论交流一下,不知道你们有没有遇到这种情况,有什么解决的方法呢?

yebo_123 发表于 2014-8-12 10:27:58

图片不知道怎么传不了,用附件形式把

myxiaonia 发表于 2014-8-12 12:09:56

把程序中特别大的数组指定一个IRAM中的地址,OPTION中不要勾选IRAM2,试试看

yebo_123 发表于 2014-8-12 12:33:09

myxiaonia 发表于 2014-8-12 12:09
把程序中特别大的数组指定一个IRAM中的地址,OPTION中不要勾选IRAM2,试试看

嗯~好的,谢谢,我试一下。

yebo_123 发表于 2014-8-14 13:05:55

myxiaonia 发表于 2014-8-12 12:09
把程序中特别大的数组指定一个IRAM中的地址,OPTION中不要勾选IRAM2,试试看

指定大数组地址这个方法我没有弄出结果,现在我是这样的,1768有两个16K的RAM,一个32K的本地RAM,正常都是放在32K的本地RAM里面的。现在程序数组较多,空间不够,如果放在第一个16K的RAM里面不行,放在第二个RAM里面竟然可以了,我把任务的堆栈改小了,现在第二个RAM空间还剩不少,第一个16K的RAM没有用,一用就出错。芯片手册上写的是这两个16K的RAM一般用于存储外设对数据,我想是不是第一个16K的RAM里面有一段地址是固定分配给某些外设,比如USB或者以太网,导致如果把任务堆栈发在里面就会出现堆栈不连续出错呢。现在虽然说能够满足使用了,但还是没有弄明白为什么第一个16k的RAM不能用~~

myxiaonia 发表于 2014-8-14 16:21:58

yebo_123 发表于 2014-8-14 13:05
指定大数组地址这个方法我没有弄出结果,现在我是这样的,1768有两个16K的RAM,一个32K的本地RAM,正常都 ...

我对1768没有研究啊,帮不上忙了呵呵

menglogic 发表于 2014-8-14 17:03:10

应该是网络跟USB都用到了同一个RAM,我的工程是这样做的在LPC17**—emac.h 里 定义 #define RX_DESC_BASE                0x20080000 //0x2007c000//在 usbhost_lpc17xx.c 中 定义#define HOST_BASE_ADDRESS 0x2007C000; 。这样子RAM就能分开。

yebo_123 发表于 2014-8-14 17:49:46

myxiaonia 发表于 2014-8-14 16:21
我对1768没有研究啊,帮不上忙了呵呵

恩呢~还是要谢谢你啦,呵呵

yebo_123 发表于 2014-8-14 17:58:44

menglogic 发表于 2014-8-14 17:03
应该是网络跟USB都用到了同一个RAM,我的工程是这样做的在LPC17**—emac.h 里 定义 #define RX_DESC_BASE               ...

那两个文件在哪里?我在工程中LPC17XX.H中 找到了
#define LPC_AHB_BASE          (0x50000000UL)
#define LPC_EMAC_BASE         (LPC_AHB_BASE+ 0x00000)和
#define LPC_USB_BASE          (LPC_AHB_BASE+ 0x0C000)
这是说明这两个同时用了一个RAM吗?

kinsno 发表于 2014-8-14 22:11:25

如果是我发现RAM不够用,我肯定直接把UCOS干掉,这丫太耗RAM了,平时耍耍还行,如果碍着道了,第一个搬走它;

menglogic 发表于 2014-8-15 09:16:23

yebo_123 发表于 2014-8-14 17:58
那两个文件在哪里?我在工程中LPC17XX.H中 找到了
#define LPC_AHB_BASE          (0x50000000UL)
#defin ...

不是在 LPC17XX.H 中,网络的在 lpc17xx_emac.h定义, USB的在usbhost_lpc17xx.c定义。

yebo_123 发表于 2014-8-15 09:59:37

menglogic 发表于 2014-8-15 09:16
不是在 LPC17XX.H 中,网络的在 lpc17xx_emac.h定义, USB的在usbhost_lpc17xx.c定义。
...

没找到这两个文件,是工程建好就生成的?

menglogic 发表于 2014-8-15 13:49:17

yebo_123 发表于 2014-8-15 09:59
没找到这两个文件,是工程建好就生成的?

可能是我们用的模板不一样,你查看EMAC初始化,与USB HOST 相关的宏定义,肯定会有内存分配的定义的。

yebo_123 发表于 2014-8-15 15:58:21

menglogic 发表于 2014-8-15 13:49
可能是我们用的模板不一样,你查看EMAC初始化,与USB HOST 相关的宏定义,肯定会有内存分配的定义的。 ...

嗯~谢谢啦

别有洞天下 发表于 2014-9-11 12:28:11

楼主在优化下程序吧

yebo_123 发表于 2014-9-16 22:25:06

别有洞天下 发表于 2014-9-11 12:28
楼主在优化下程序吧

嗯~一步步优化之后已经可以了
页: [1]
查看完整版本: 关于1768单片机RAM 不够用的问题