3

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

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

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

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

这在我的脑海中没有加起来。有没有人知道为什么会这样?

AVR 板逻辑分析仪时序,960.0us

ARM板逻辑分析仪时序,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); 
}
4

2 回答 2

4

ARM 皮质 M4

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

于 2013-02-23T04:57:28.003 回答
0

好奇的问题!尝试以下代码作为检查时钟速度的快速方法:

boolean pinValue;

void setup() {
   Serial.begin(9600);
   pinMode(13, OUTPUT);
   digitalWrite(13, HIGH);
   pinValue = true;
}

void loop() {
    pinValue = !pinValue;
    digitalWrite(13, pinValue);
}

您的逻辑分析仪应该显示大约 50% 的 Arduino 占空比“尽可能快”。使用它来确认您的电路板正在按照您的想法进行计时。

这将帮助您确定您的 Teensy 3.0 是否因为执行基本指令的时间而变慢,或者执行数学函数的指令对于 ARM 是否不如 AVR 最佳。如果即使对于这个简单的程序也很慢,我强烈怀疑您没有按照您的想法计时。

我建议您确认您的探头是否按照您认为的方式接线......即“慢速”通道是否真的连接到“快速”电路板?

于 2013-02-23T04:41:45.030 回答