我正在使用 ARM926EJS。在没有 Linux 的情况下,我在内存复制测试中的内存速度提高了 20%(就像入门可执行文件一样)。但在 linux 中,相同的代码运行速度要慢 20%。
代码是
/// 下面的代码只是执行突发模式的内存复制测试。 void asmcpy(void *a, void *b, int iSize) { 做 { asm易失性( "ldmia %0!, {r3-r10} \n\t" "stmia %0!, {r3-r10} \n\t" :"+r"(a), "+r"(b) : :"r"(r3),"r"(r4),"r"(r5),"r"(r6),"r"(r7),"r"(r8),"r"(r9), “r”(r10) ); }而(大小--) }
我确认没有其他进程在 linux 上占用 CPU 时间。(我使用 time 命令检查了这一点,它显示实时与usr time相同 )
请告诉我linux可能有什么问题?
感谢和问候。
添加:
我的测试代码是
主函数() { int a[320 * 120],b[320 * 120]; for(int i=0; i != 10000; i++) { /// 大小除以 8 因为我们的 memcpy 函数在迭代中执行了 8 个整数加载存储 asmcpy(a, b, (320 * 120) / 8); } }
Getting Started 可执行文件是一个 bin 文件,它使用串行端口发送到 RAM,并通过跳转到 RAM 中的该地址直接执行。(无需操作系统)
添加。
我没有在其他处理器上看到这样的性能差异。他们使用的是 SD RAM,这个处理器使用的是 DDR Ram。可以是一个理由吗?
添加。入门代码中未启用数据缓存,并且在 Linux 模式下启用了数据缓存,因此理想情况下,所有数据都应被缓存并在没有任何 RAM 延迟的情况下进行访问,但 Linux 仍然慢 20%。
补充:我的微控制器是 LPC3250。两项测试均在相同的外部 DDR RAM 上进行了测试。