Linux嵌入式(ARM)中的低内存吞吐量
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Linux嵌入式(ARM)中的低内存吞吐量,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2048字,纯文字阅读大概需要3分钟。
内容图文
![Linux嵌入式(ARM)中的低内存吞吐量](/upload/InfoBanner/zyjiaocheng/963/c3251fc9446d491ca59d6662afa4c5f4.jpg)
我正在使用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上进行了测试.
解决方法:
这个芯片有一个MMU,所以Linux很可能用它来管理内存.也许只是启用它会引入一些性能影响.此外,Linux使用延迟内存分配策略,仅在首次命中时将内存页分配给进程.如果您正在复制大量内存,MMU将生成页面错误,要求内核在循环内部分配页面.在低端处理器上,所有这些上下文切换都会导致缓存刷新并引入明显的减速.
如果您的系统足够小,请尝试使用无MMU版本的Linux(如uClinux).也许它会让你使用性价比更低的芯片.在嵌入式系统上,每一分钱都很重要.
更新:一些额外的细节:
每个Linux进程都有它自己的内存映射,首先它只包含内核和(可能)可执行代码.所有其余的线性4GB(32位)似乎都可用,但没有分配RAM页面.一旦读取或写入未分配的内存地址,MMU就会发出页面错误信号并切换到内核.内核看到它仍然有很多空闲的RAM页面,所以选择一个,将它分配给故障点并返回到你的代码,完成中断的指令.下一个不会失败,因为整个页面(通常是4KB)已经分配;但是稍后会进行一些迭代,它会击中另一个未分配的空间,MMU将再次调用内核.
内容总结
以上是互联网集市为您收集整理的Linux嵌入式(ARM)中的低内存吞吐量全部内容,希望文章能够帮你解决Linux嵌入式(ARM)中的低内存吞吐量所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。