我正在使用ARM926EJS。在无Linux的情况下(仅作为入门可执行文件),我在内存复制测试中获得了20%以上的内存速度。但在Linux中,相同的代码运行要慢20%。
以下是代码:
``` /// 以下代码只执行突发模式memcopy测试。 void asmcpy(void *a, void *b, int iSize) { do { asm volatile ( "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) ); }while(size--) } ```
我验证了在Linux中没有其他进程占用CPU时间。(我使用time命令检查了这一点,它显示“real time”与“usr time”相同)
请告诉我Linux可能有什么问题?
谢谢和问候。
附加:
我的测试代码是:
``` int main() { int a[320 * 120], b[320 * 120];
for(int i=0; i != 10000; i++) { /// Size is divided by 8 because our memcpy function performs 8 integer load stores in the iteration asmcpy(a, b, (320 * 120) / 8); } } ```
Getting Started可执行文件是一个bin文件,通过串口发送到RAM中并直接通过跳转到该RAM地址执行。(无需操作系统)
补充:
我没有在其他处理器上看到这样的性能差异。它们使用SD RAM,而此处理器使用DDR Ram。可能是原因吗?
补充: 入门代码未启用数据缓存,而Linux模式下启用了数据缓存,因此理论上所有数据都应被缓存且无需任何RAM延迟进行访问,但Linux仍慢20%。
补充: 我的微控制器是LPC3250。两个测试都在同一外部DDR RAM上进行了测试。
以下是代码:
``` /// 以下代码只执行突发模式memcopy测试。 void asmcpy(void *a, void *b, int iSize) { do { asm volatile ( "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) ); }while(size--) } ```
我验证了在Linux中没有其他进程占用CPU时间。(我使用time命令检查了这一点,它显示“real time”与“usr time”相同)
请告诉我Linux可能有什么问题?
谢谢和问候。
附加:
我的测试代码是:
``` int main() { int a[320 * 120], b[320 * 120];
for(int i=0; i != 10000; i++) { /// Size is divided by 8 because our memcpy function performs 8 integer load stores in the iteration asmcpy(a, b, (320 * 120) / 8); } } ```
Getting Started可执行文件是一个bin文件,通过串口发送到RAM中并直接通过跳转到该RAM地址执行。(无需操作系统)
补充:
我没有在其他处理器上看到这样的性能差异。它们使用SD RAM,而此处理器使用DDR Ram。可能是原因吗?
补充: 入门代码未启用数据缓存,而Linux模式下启用了数据缓存,因此理论上所有数据都应被缓存且无需任何RAM延迟进行访问,但Linux仍慢20%。
补充: 我的微控制器是LPC3250。两个测试都在同一外部DDR RAM上进行了测试。