Questions tagged «arm»

该标签用于与ARM(高级RISC机器)计算机家族有关的问题。即在ARM处理器内核或使用ARM内核的系统上运行的机器或电子设备。

1
精确的机器代码副本运行速度比原始功能慢50%
我一直在尝试从嵌入式系统上的RAM和闪存执行性能。为了快速进行原型制作和测试,我目前使用的是Arduino Due(SAM3X8E ARM Cortex-M3)。据我所知,Arduino运行时和引导程序在这里应该没有任何区别。 这是问题所在:我有一个用ARM Thumb Assembly编写的函数(calc)。calc计算一个数字并将其返回。(对于给定的输入,> 1s运行时)现在,我手动提取了该函数的汇编机器代码,并将其作为原始字节放入另一个函数中。确认这两个功能都驻留在闪存中(地址0x80149和0x8017D紧挨着)。通过反汇编和运行时检查已确认了这一点。 void setup() { Serial.begin(115200); timeFnc(calc); timeFnc(calc2); } void timeFnc(int (*functionPtr)(void)) { unsigned long time1 = micros(); int res = (*functionPtr)(); unsigned long time2 = micros(); Serial.print("Address: "); Serial.print((unsigned int)functionPtr); Serial.print(" Res: "); Serial.print(res); Serial.print(": "); Serial.print(time2-time1); Serial.println("us"); } int calc() { asm …

2
是什么导致Cortex-A72上带有-O0而不是-O3的简单紧密循环的周期如此高的变化?
我正在围绕获取一段代码的高度一致的运行时进行一些实验。我当前正在计时的代码是一个相当随意的CPU约束工作负载: int cpu_workload_external_O3(){ int x = 0; for(int ind = 0; ind < 12349560; ind++){ x = ((x ^ 0x123) + x * 3) % 123456; } return x; } 我已经编写了一个内核模块,该模块禁用中断,然后运行上述功能的10次尝试,通过获取前后时钟周期计数器的差值来计时每次尝试。其他注意事项: 该机器是ARM​​ Cortex-A72,具有4个插槽,每个插槽具有4个内核(每个插槽都有自己的L1缓存) 时钟频率缩放关闭 不支持超线程 机器几乎没有运行,除了一些简单的系统进程 换句话说,我相信大多数/所有系统可变性的原因都可以解决,尤其是当通过禁用了中断的内核模块运行时spin_lock_irqsave(),代码在运行时应该获得几乎相同的性能(可能对性能造成很小的影响)在第一次运行时,首先将某些指令拉入缓存,仅此而已)。 的确,当使用编译基准测试代码时-O3,我平均看到了大约135,845,192个周期中的最多200个周期,并且大多数测试花费的时间完全相同。但是,当使用编译时-O0,范围从262,710,916上升至158,386个周期。范围是指最长和最短运行时间之间的差。而且,对于-O0代码而言,哪个试验是最慢/最快的试验并没有太多的一致性-违反直觉,在某些情况下,最快的试验是最先的,而最慢的试验是在后的! 那么:是什么原因导致-O0代码的可变性如此高的上限?看一下程序集,似乎-O3代码将所有内容(?)存储在寄存器中,而-O0代码中有很多引用sp,因此似乎正在访问内存。但是即使那样,我也希望所有内容都可以放入L1缓存中,并且在确定的访问时间内就可以坐在那里。 码 被基准测试的代码在上面的代码段中。组件在下面。两者都编译时gcc 7.4.0没有标记,除了-O0和-O3。 -O0 0000000000000000 <cpu_workload_external_O0>: 0: d10043ff sub sp, sp, …

1
这个C ++ AtomicInt实现正确吗?
前提:我正在使用甚至没有C ++ 11(带有std::atomic<int>)的ARM嵌入式(几乎是裸机)环境,因此请避免回答“ 仅使用标准C ++”std::atomic<int> ”:我不能。 这个AtomicInt的ARM 实现正确吗?(假设ARM体系结构是ARMv7-A) 您看到一些同步问题吗?是否volatile需要/有用? // File: atomic_int.h #ifndef ATOMIC_INT_H_ #define ATOMIC_INT_H_ #include <stdint.h> class AtomicInt { public: AtomicInt(int32_t init = 0) : atom(init) { } ~AtomicInt() {} int32_t add(int32_t value); // Implement 'add' method in platform-specific file int32_t sub(int32_t value) { return add(-value); } int32_t …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.