最近在实际的项目中碰到这样的问题:
嵌入式系统DDR (RBC row, bank, columne), 每块1Gbit816, 两块由片选决定读写其中的一块.
Memory controller通过AXI连接在SOC中.
1.
在I-CACHE没有使能的情况下, 通过MC访问DDR有三路TRAFFIC, 分别是取指令, CPU刷/写FRAME BUFFER, DMA取/读FRAME BUFFER的数据
在低分辨率的情况下, 没有发现图像闪烁, 到了高分辨率的情况(1680*1050 60p, 720p, 或者1080p, RGB8888)下,就有图像闪烁
I-CACHE使能的情况下, 本以为MC访问DDR的原本三路TRAFFIC降到了二路, 情况能够改善,结果,问题更加严重
2.
同时, 将指令与FRAME BUFFER放在相同的DDR颗粒与不同的颗粒,也会产生不同的效果(闪烁与否)
关于这两个问题, 明显就在于对DDR/MC的了解与特定情况的分析上
不同的读写方式(RBC, BRC, B RH CH RL CL), 不同的刷新模式, DMA BURST的方式(长度), DMA OUTSTANDING的数目, CPU往FRAME BUFFER中写的方式(DWORD or LOAD ASSEMBLY).
最新UPDATES:
通过对DDR的性能的学习与了解, 然后通过数学上的计算, 对以上两个问题有了比较彻底的分析与解决.
常常听有些人说, 底层软件工程师的工作, 就是"改硬件寄存器", 也有人讲, 码农的工作, 就是写代码, 复杂点的东西, 就是一些逻辑, 没有多少价格在这里.
事实上, 说这些话的人, 要么是外行, 要么是内行中做过的东西浅尝则止的, 真正要把底层软件做好, 把性能提上去, 要学要做要走的路, 很多很多很长.