Tag:

如何从ARM处理器开始?

是否可以直接从ARM处理器的数据表和用户手册开始为新手或首先了解ARM世界然后继续?

Cortex A9 NEON与VFP使用混淆

我正在尝试为Cortex A9 ARM处理器(更具体的OMAP4)构建一个库,我对于哪些\何时在浮点运算和SIMD中使用NEON vs VFP有点困惑。 需要注意的是,我知道2个硬件协处理器单元之间的区别(这也在SO上有所描述),我对它们的正确使用有一些误解。 与此相关我使用以下编译标志: GCC -O3 -mcpu=cortex-a9 -mfpu=neon -mfloat-abi=softfp -O3 -mcpu=cortex-a9 -mfpu=vfpv3 -mfloat-abi=softfp ARMCC –cpu=Cortex-A9 –apcs=/softfp –cpu=Cortex-A9 –fpu=VFPv3 –apcs=/softfp 我已经阅读了ARM文档,很多wiki( 比如这个 ),论坛和博客post,每个人似乎都同意使用NEON比使用VFP或至少混合NEON更好(例如使用instrinsics来实现一些算法在SIMD)和VFP不是一个好主意; 如果这适用于整个应用程序\库的上下文或仅适用于代码中的特定位置(函数),我还不是100%确定。 所以我在我的应用程序中使用neon作为FPU,因为我也想使用内在函数。 结果我遇到了一些麻烦,我对如何在Cortex A9上最好地使用这些function(NEON vs VFP)的困惑只是进一步深化而不是清理。 我有一些代码为我的应用程序进行基准测试,并使用一些自定义的计时器类,其中计算基于双精度浮点。 使用NEON作为FPU会产生完全不合适的结果(尝试打印这些值会导致打印主要是inf和NaN;相同的代码在为x86构建时没有任何障碍)。 所以我改变了我的计算以使用单精度浮点, 据记载,NEON不处理双精度浮点 。 我的基准测试仍然没有给出正确的结果(最糟糕的是现在它在x86上不再起作用了;我认为这是因为精度损失但我不确定)。 所以我几乎完全迷失了:一方面我想使用NEON用于SIMDfunction并使用它,因为FPU没有提供正确的结果,另一方面将它与VFP混合似乎不是一个好主意。 在这方面的任何建议将不胜感激!! 我在上面提到的wiki的文章中找到了在NEON上下文中浮点优化应该做些什么的总结: “ 仅使用单精度浮点 当您发现瓶颈FPfunction时,请使用NEON内在函数/ ASM。 你可以比编译器做得更好。 最小化条件分支 启用RunFast模式 对于softfp: 内联浮点代码(除非它非常大) 通过指针而不是值传递FP参数,并在函数调用之间执行整数工作。 “ 我不能用于浮动ABI,因为我无法链接到我可用的库。 大多数的推荐对我来说都是有意义的(除了“runfast模式”,我不明白应该做什么以及此时我能做得比编译器更好的事实)但是我一直得到不一致的结果和我现在不确定。 任何人都可以了解如何正确使用浮点和NEON用于Cortex A9 […]

如何保护isr和常规函数共享的全局变量?

假设我有function 1和一个isr routine ,它们共享并更新相同的标志,它们之间没有任何锁定。 系统是单线程的。 while将是一个3臂汇编指令,这意味着它不是primefaces操作,是否可以在非isr和isr函数之间共享一个全局变量而没有任何锁定或保护? function1: while (flag == false); flag = false; 常规: do something flag=true 我不记得有一个Linux内核机制用于在可睡眠和非可睡眠上下文之间进行锁定,例如irq和kernel thread 。 感谢@artless的答案,这里有一些我不确定的问题: 有没有办法我不会错过中断? 内存障碍如何解决问题,当代码在单个cpu上运行时它是否有效? 在不同情境之间使用障碍时的预期行为是什么? 在while loop睡眠可以解决同步问题吗?

ARM:从int atomic写/读?

在ARM架构上,遗憾的是我不确切知道它是什么芯片,是一个32位的int读/写primefaces? 对基本类型的读/写有什么保证吗?

ARM / NEON的64位/ 32位分区更快算法?

我正在编写一个代码,其中两个地方有64位乘32位定点除法,结果取32位。 这两个地方共占用了我总时间的20%以上。 所以我觉得如果我能删除64位除法,我可以很好地优化代码。 在NEON中,我们可以有一些64位指令。 任何人都可以建议通过使用更快的实现来解决瓶颈问题。 或者如果我可以用C中的32位/ 32位除法进行64位/ 32位除法,那也没关系? 如果有人有想法,你能帮帮我吗?

使用谓词指令将c转换为程序集

我想使用谓词指令将此代码转换为程序集 If (A>B){ C=A; D=B; E=0 } else{ C=B; } 它是正确的还是我如何使用跳跃? cmp R1,R2; considering B is assigned to R2 and A assigned to R1 movlf R3,R1;R3 assign to C mov R4,R2;R4 assign to D mov R5,0; R5 assign to E movlt R3,R2