gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 03:00:04 26 4
gpt4 key购买 nike

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

我有两个正在玩的微 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com