【发布时间】:2009-09-09 14:42:04
【问题描述】:
我正在使用 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 命令检查了这一点,它显示 real 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 上进行了测试。
【问题讨论】:
-
您能在两种不同的设置上发布您的测试代码和场景吗?还有什么是入门可执行文件?总的来说,只是稍微详细一点,可能有很多不同的原因
-
这里的性能比较几乎是苹果与橘子的比较,因为您运行的是一个完整的操作系统,该操作系统具有计时器滴答声、内存管理等,所有这些都计划运行,而没有操作系统只是运行直接指令。我认为这几乎可以解释您的性能差异。就像哈维尔说的那样,即使内核上没有其他用户进程,它自己仍然可以做很多事情。
-
我有一个类似的硬件(ARM926EJS + DDR),我观察到完全相反:没有操作系统,内存操作太慢了,直到缓存被激活(即在操作系统中)
-
像我一样使用突发模式 RAM 访问,使用 LDMIA 和 STMIA 来提高速度。