Sun*_*hah 3 linux embedded arm
我正在使用ARM926EJS.我在内存复制测试中的内存速度提高了20%,没有Linux(就像入门可执行文件一样).但是在linux中,同样的代码运行速度慢了20%.
代码是
/// Below code just performs burst mode memcopy test.
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命令检查了这一点,它显示实时与usr时间相同 )
请告诉我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上进行了测试.
Jav*_*ier 10
这个芯片有一个MMU,所以Linux很可能用它来管理内存.也许只是启用它会引入一些性能影响.此外,Linux使用延迟内存分配策略,仅在首次命中时将内存页分配给进程.如果您正在复制大量内存,MMU将生成页面错误,要求内核在循环内部分配页面.在低端处理器上,所有这些上下文切换都会导致缓存刷新并引入明显的减速.
如果您的系统足够小,请尝试使用无MMU版本的Linux(如uClinux).也许它会让你使用性价比更低的芯片.在嵌入式系统上,每一分钱都很重要.
更新:一些额外的细节:
每个Linux进程都有它自己的内存映射,首先它只包含内核和(可能)可执行代码.所有其余的线性4GB(32位)似乎都可用,但没有分配RAM页面.一旦读取或写入未分配的内存地址,MMU就会发出页面错误信号并切换到内核.内核看到它仍然有很多空闲的RAM页面,所以选择一个,将它分配给故障点并返回到你的代码,完成中断的指令.下一个不会失败,因为整个页面(通常是4KB)已经分配; 但是稍后会进行一些迭代,它会击中另一个未分配的空间,MMU将再次调用内核.