c - 基于 ARM 的 arduino 型系统比基于 AVR 的系统慢得多

标签 c arm arduino

我正在编写一些机器人运动学代码,我首先编写了用于计算关节角度的朴素的、有意未优化的函数,这样我就可以使用逻辑分析仪测量时序,并有一种切实可行的方法来测量增益在定点数学等优化中。

我有两个正在玩的微 Controller 板:Teensy 2.0 和 Teensy 3.0。我正在使用 Arduino 环境为他们构建代码。与大多数 Arduino 一样,2.0 是一个 8 位 16MHz AVR。 3.0 是 32 位 48MHz ARM cortex M4。

代码将引脚拉低,进行一条腿的 IK 计算,然后将引脚拉回高位。我正在使用古老的逻辑分析仪来测量线路处于低电平的时间。

奇怪的是 ARM 板的边缘之间的时间明显更长! AVR 在大约 960 微秒内完成,但 ARM 需要大约 18.5 毫秒!

这在我看来并不成立。有没有人知道为什么会这样?

logic analyzer timing of AVR board, 960.0us

logic analyzer timing of ARM board, 18.5ms

这是我正在使用的代码。不要介意它是故意未优化的,可能我数学不好,但这不是这里的问题:)

#include <math.h>

#define lc 21.0
#define lf 40.0
#define lt 62.0

#define lfsqrd 1600.0
#define ltsqrd 3844.0

struct Vector {
  double x;
  double y;
  double z;
};

struct Joints {
  double c;
  double f;
  double t;
};

void calc_joints(struct Vector *foot, struct Joints *joints) {
   double l1 = sqrt(pow(foot->y,2) + pow(foot->x, 2));
   double l2 = l1 - lc;
   double l3 = sqrt(pow(foot->z,2) + pow(l2, 2));

   double tx = atan2(l2, foot->z);
   double ty = acos( (pow(l3,2) + lfsqrd - ltsqrd) / (2 * l3 * lf) );

  // todo: convert these from radians to degrees
   joints->c = atan2(foot->y, foot->x);
   joints->f = tx + ty;
   joints->t = acos( (lfsqrd + ltsqrd - pow(l3,2)) / (2 * lf * lt) );
}

void setup() {
   Serial.begin(9600);
   pinMode(0, OUTPUT);
   digitalWrite(0, HIGH);
}

void loop() {
    digitalWrite(0, LOW);
    struct Vector v = { 10, 20, 30 };
    struct Joints j;

    calc_joints(&v, &j);
    digitalWrite(0, HIGH);


    Serial.print(j.c);    
    Serial.print(", ");
    Serial.print(j.f);    
    Serial.print(", ");
    Serial.println(j.t); 
}

最佳答案

ARM cortex M4

Cortex M4 中的 FPU 仅支持精度,但您在代码中使用了很多。这意味着软件计算而不是硬件。您是否尝试过将 double 变量和函数调用更改为 float

关于c - 基于 ARM 的 arduino 型系统比基于 AVR 的系统慢得多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15017061/

相关文章:

java - 结合Java + 蓝牙 + arduino

c - 使用 while(getchar()! ='\n' ) 我清空标准输入,但我必须按下 Enter 键

c - 为什么这个程序分配了8页,但只能容纳2048个8字节的节点?

node.js - 尝试为arm交叉编译node.js时错误的-rpath选项

c++ - 使用 arduino/c++ 每隔一段时间使 LED 闪烁 1 到 3 次

java - 使用 Java 打开 Arduino 上的 LED

c - 通过 Z1 mote 上的 Cooja 接收 UART 消息

c - 在不接管屏幕的情况下识别特殊键

xcode - 如何在 XCode/clang 中为 iPhone 编译独立的 ARM 程序集文件

embedded - system() 返回错误值