关于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编译不通过。所以上论坛和想和大家讨论交流一下,不知道你们有没有遇到这种情况,有什么解决的方法呢?
图片不知道怎么传不了,用附件形式把 把程序中特别大的数组指定一个IRAM中的地址,OPTION中不要勾选IRAM2,试试看 myxiaonia 发表于 2014-8-12 12:09
把程序中特别大的数组指定一个IRAM中的地址,OPTION中不要勾选IRAM2,试试看
嗯~好的,谢谢,我试一下。 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不能用~~ yebo_123 发表于 2014-8-14 13:05
指定大数组地址这个方法我没有弄出结果,现在我是这样的,1768有两个16K的RAM,一个32K的本地RAM,正常都 ...
我对1768没有研究啊,帮不上忙了呵呵 应该是网络跟USB都用到了同一个RAM,我的工程是这样做的在LPC17**—emac.h 里 定义 #define RX_DESC_BASE 0x20080000 //0x2007c000//在 usbhost_lpc17xx.c 中 定义#define HOST_BASE_ADDRESS 0x2007C000; 。这样子RAM就能分开。 myxiaonia 发表于 2014-8-14 16:21
我对1768没有研究啊,帮不上忙了呵呵
恩呢~还是要谢谢你啦,呵呵 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吗? 如果是我发现RAM不够用,我肯定直接把UCOS干掉,这丫太耗RAM了,平时耍耍还行,如果碍着道了,第一个搬走它;
yebo_123 发表于 2014-8-14 17:58
那两个文件在哪里?我在工程中LPC17XX.H中 找到了
#define LPC_AHB_BASE (0x50000000UL)
#defin ...
不是在 LPC17XX.H 中,网络的在 lpc17xx_emac.h定义, USB的在usbhost_lpc17xx.c定义。
menglogic 发表于 2014-8-15 09:16
不是在 LPC17XX.H 中,网络的在 lpc17xx_emac.h定义, USB的在usbhost_lpc17xx.c定义。
...
没找到这两个文件,是工程建好就生成的? yebo_123 发表于 2014-8-15 09:59
没找到这两个文件,是工程建好就生成的?
可能是我们用的模板不一样,你查看EMAC初始化,与USB HOST 相关的宏定义,肯定会有内存分配的定义的。 menglogic 发表于 2014-8-15 13:49
可能是我们用的模板不一样,你查看EMAC初始化,与USB HOST 相关的宏定义,肯定会有内存分配的定义的。 ...
嗯~谢谢啦 楼主在优化下程序吧 别有洞天下 发表于 2014-9-11 12:28
楼主在优化下程序吧
嗯~一步步优化之后已经可以了
页:
[1]