尊敬的 TI 专家:
我正在使用 C2000 F28379D Launchpad。 我测试了 CPU 周期以执行"math.h"中的 asinf (float x)函数。 但结果与我预期的不符。 我认为该 LaunchPad 可能只需20到30个周期即可运行此函数、事实是它需要高达6822个 CPU 周期来处理 asinf 函数。 我已附上以下图片。
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
尊敬的 TI 专家:
我正在使用 C2000 F28379D Launchpad。 我测试了 CPU 周期以执行"math.h"中的 asinf (float x)函数。 但结果与我预期的不符。 我认为该 LaunchPad 可能只需20到30个周期即可运行此函数、事实是它需要高达6822个 CPU 周期来处理 asinf 函数。 我已附上以下图片。
由于 TMU 不支持 arcsin 或 arcos 指令集、因此您将有更多的工作要做。 您可以使用两个反向 TRIG 函数和 arctan 的 TMU 支持来实现以下函数:
易失性浮点 x = 0.6513246f;
volatile float v、a、b;
void main (void)
{
// a = asinf (x)
v = x /sqrtf (1 -(x*x));
a = atanf (v);
// b = acosf (x)
v = sqrtf (1 -(x*x))/ x;
b = atanf (v);
(笑声)
在-fp_mode =宽松且优化关闭的情况下、这些应该在~60个周期内进行计算。
此致、
Richard
车间材料是指装配说明 ATANPUF32。 在结果可用之前、这个指令需要三个延迟时隙。 在汇编语言中编码时、通常会将这些时隙用于其他东西、但在 C 语言中它们将显示为 NOP、因此获得结果的流水线周期总数为5。 此外,该指令还返回“标么值”,因此要获得以弧度表示的答案,您需要乘以2*PI,这需要另一个额外的延迟时隙。 从 C 调用时会产生一些开销、因此您会看到更多周期。 有两个 C 内在函数可实现更高效的 atanf()计算,因此我们可以使用这些函数来加快计算速度。 请参阅 C 编译器指南的第171页:
http://www.ti.com/lit/ug/spru514s/spru514s.pdf
现在的情况比我之前解释的要复杂一些。 ATANPUF32的输入范围有一定的限制、这是必须遵守的、否则答案是错误的。 我之前使用的反向三角公式可能会合法地返回超出此范围的值、在这种情况下、我们需要执行稍微不同的计算。 此外、我们需要允许对 ASIN 和 acos 进行负面输入、因此整体代码会更复杂一些。
我将提供一些用于计算这些函数的 C 代码、我认为这是可靠的。 我认为通过汇编代码可以显著加快速度。 下面的所有变量都是浮点值。
// arcsin
PHI = fabsf (theta);
asin_v = phi / sqrtf (1 -(phi*phi));
如果(ASIN_v > 1.0f)
{
ASIN_b = 1.5708f -_atan (1.0f / ASIN_v);
}
其他
{
asin_b =__atan (asin_v);
}
IF (signbit (theta))
{
asin_b =-asin_b;
}
// arcos
Acos_v = sqrtf (1 -(phi*phi))/ phi;
如果(acos_v >1.0f)
{
ACS_b = 1.5708f -_atan (1.0f / acos_v);
}
其他
{
ACS_b =__atan (acos_v);
}
IF (signbit (theta))
{
ACS_b = 3.142159f - acos_b;
}
此致、
Richard