本帖最后由 chenyongand 于 2016-6-26 00:40 编辑
本帖子当作经验交流。存储的问题我已经解决。在帖子最后我提出另一个问题。
LPC1788具有片上512K rom用来运行程序,片上96K SRAM。本人的工程样板还使用了EMC外挂了Nandflash、Norflash和SDRAM。自从工程开始做我就认为片上512K ROM足够使用,就很放心,谁知道在工程接近结尾的时候,突然有一天编译报错,说空间不够了,顿时傻眼了,要知道我还有些功能没实现呢,而且还有后期的升级之类的需要空间啊。Keil的优化等级我开到2级了,还是不行,看来得调整方案了,于是就有了后面一些问题。
首先参照其他高级点ARM芯片的方法,上电BOOTLOADER,把app拷贝到SDRAM运行,可是上网查资料有些说1788不像ARM9那样适合在SDRAM跑程序。据说效率很低,跑起来很慢,我没试过不死心,就决定要尝试一下。而且得知,我这工程情况,向量表偏移最远只能到片内SRAM,到不了片外,所以我把向量表设置在SRAM靠近尾端部分。在bootloader跳转前配置MPU,而且进入APP后,不能再初始化SDRAM,否则导致程序复位再次进入bootloader。
我从bootloader跳转到app后,稍等一两秒的时间,然后又会复位重启。我观察了拷贝的向量表,并和app的MAP文件对比,是正确的向量。 后来我调整了思路,先不让app在SDRAM运行,裁剪app使其可以放进片上rom,也就是说,先在rom内bootloader跳转。结果一试居然成了,app顺畅的运行起来了。我再修改app工程配置里的rom地址到SDRAM,结果还是之前一样,bootloader不成功。看来问题不是app的问题,而是bootloader的问题了。
APP在rom内就可以跳转执行,在SDRAM里就不能跳转执行。对比两者的区别,发现在APP在SDRAM的情况,多了一个MPU配置,这是手册明确要求的。现在问题明确了,MPU配置的嫌疑最大。又是一番研究资料,中间不细说。最后发现MPU使能寄存器里也需要使能背景映射。把背景映射一开,bootloader可以成功跳转SDRAM里的app了。
程序是可以跳转了,但是app在SDRAM里运行,果然是慢的要死,龟速啊,果然跟网上其他人反映的一样。这下我有点绝望了,这效果肯定不能用在产品上的。我又把目光盯上了Norflash,大家的普遍意见是,此flash贵,产品使用这个都是土豪。但是为了打开目前困境,我也只能试试了。这里方法同之前SDRAM的方法一样,app里工程配置里,ROM地址改为Norflash里。当然之前的MPU也要增加一个Norflash的块配置。
这次顺利实现了跳转,程序运行效果说实话跟SDRAM里不相上下。估计问题是还是EMC的性能问题吧。一个EMC总线外接NORFLASH+NANDFLASH+SDRAM。明显总线竞争啊,一个时刻只能操作一种存储,执行SDRAM时候,NORFLASH就得停,反之亦然,这样总体估计也快不到哪里去吧。最后我还是得回归到ROM去,优化一下代码,实在不行去掉操作系统,emwin是肯定要的。挤压点空间出来,争取把项目搞完。
在这段时间的折腾里,我还发现了一个比较棘手的问题。Bootloader程序里,需要USB功能,为了开机时候检测U盘升级app。但是为了bootloader运行时候有更好的信息提示,我又操作了LCD(显存在SDRAM里)来显示启动信息。但是我发现,只要使用了LCD,就会导致USB枚举不成功。就算偶尔成功,读取文件的时候也会失败。去掉LCD操作,USB功能马上正常,顺溜溜的。如此反复验证,确定是LCD和USB之间的功能上有干涉,而且在app里也会需要LCD+USB的功能。这个实在找不到原因,在这里还希望大侠们分析原因。
|