一. NAND与SDRAM冲突
从OMAPL138的架构上看 EMIF总线上连接着NAND和SDRAM
也就是说这2个设备是不能同时访问的
假设NAND上的文件系统是yaffs2, 128page/block, 2kB/page,
如果 DSP程序正在访问SDRAM时进行下面的操作
1. ARM写NAND, 此时会100%造成磁盘坏块, 这些个坏块用 flase_eraseall 命令无法擦除, 只能屏蔽, 用nand srub可以擦除, 证明这个是伪坏块
2. ARM程序读NAND文件, 此时有一定概率, 5%~30%会读错, 文件越大越容易错
3. 加载libc, 这个是最隐含的, 当arm程序第一次调用libc时, 相应的so才会被调入内存, 比如 log10函数, 若第一次调用它的时候, dsp在访问SDRAM就会错
解决方案:
在上面的三种情况下, ARM程序向DSP程序放指令, 让DSP暂停, 此时DSP程序进入while(1)中, 待收到ARM唤醒命令后再恢复访问SDRAM
让DSP暂停/恢复是由ARM/DSP程序自定义的方法实现, 没有标准
二. DDR与DSP冲突
当ARM程序使用DDR作为内存时, 若出现下列情况, ARM程序, 包括整个linux都会变得非常缓慢
1. DSP程序形如
while (1 );
改为在while里加sleep能解决
2. DSP程序访问外设, 如AD采样, 随着访问频率的增加, ARM程序会越来越慢
改为在每个访问操作之间加延时能解决
结论
OMAPL138系列把ARM和DSP集成到一个芯片上降低成本, 降低功耗, 降低空间
带来的是开发成本的增加, 上面这些都是我在开发中慢慢发现的, 耗费了非常多的时间.
陷阱应该还有我没发现的.
总之还是一分钱一分货啊, 下次做开发不能再用几合一的了