MSPM0 IQMath 用户指南

1. 引言

Texas Instruments® MSP IQmath 库是一个高度优化的高精度数学函数集合,可以使 C 语言编程人员将浮点算法无缝移植到 MSPM0 器件上的定点代码中。这些例程通常用于计算密集型实时应用程序,在这些应用程序中,最优的执行速度、高精度和超低能耗非常关键。与使用浮点数学算法编写的同等代码相比,使用 IQmath 库可以大幅提高执行速度并降低能耗。

IQmath 库可提供搭配使用 32 位数据类型的函数和高精度。

2. 使用 IQmath 库

2.1.IQmath 数据类型

IQmath 库使用 32 位定点有符号数(C99 中的“int32_t”)作为基础数据类型。此定点数字的 IQ 格式范围从 IQ1 到 IQ30,其中 IQ 格式数字指示小数位数。IQ 格式值存储为一个整数,它有一个基于 IQ 格式和小数位数的隐含范围。以下方程显示了一个IQ 格式的小数 xiq 如何使用带隐含范围的整数值 xi 来存储,其中 n 代表小数位数。

\[IQn(x_{iq}) = x_{i} ∗ 2^{-n}\]

例如,3.625 的 IQ24 值存储为以下方程中显示的整数值 60817408。

\[60817408 ∗ 2^{−24} = IQ24(3.625)\]

C typedef 是为各种 IQ 格式提供的,这些 IQmath 数据类型应优先于底层的“int32_t”数据类型使用,以明确哪些变量是 IQ 格式的。

下表提供了各种 IQ 格式的特征(C 数据类型、整数位数、小数位数、可表示的最小负值、可表示的最大正值和可表示的最小差值):

类型

整数位数

小数位数

最小范围

最大范围

分辨率

_iq30

2

30

-2

1.999 999 999

0.000 000 001

_iq29

3

29

-4

3.999 999 998

0.000 000 002

_iq28

4

28

-8

7.999 999 996

0.000 000 004

_iq27

5

27

-16

15.999 999 993

0.000 000 007

_iq26

6

26

-32

31.999 999 985

0.000 000 015

_iq25

7

25

-64

63.999 999 970

0.000 000 030

_iq24

8

24

-128

127.999 999 940

0.000 000 060

_iq23

9

23

-256

255.999 999 881

0.000 000 119

_iq22

10

22

-512

511.999 999 762

0.000 000 238

_iq21

11

21

-1,024

1,023.999 999 523

0.000 000 477

_iq20

12

20

-2,048

2,047.999 999 046

0.000 000 954

_iq19

13

19

-4,096

4,095.999 998 093

0.000 001 907

_iq18

14

18

-8,192

8,191.999 996 185

0.000 003 815

_iq17

15

17

-16,384

16,383.999 992 371

0.000 007 629

_iq16

16

16

-32,768

32,767.999 984 741

0.000 015 259

_iq15

17

15

-65,536

65,535.999 969 483

0.000 030 518

_iq14

18

14

-131,072

131,071.999 938 965

0.000 061 035

_iq13

19

13

-262,144

262,143.999 877 930

0.000 122 070

_iq12

20

12

-524,288

524,287.999 755 859

0.000 244 141

_iq11

21

11

-1,048,576

1,048,575.999 511 720

0.000 488 281

_iq10

22

10

-2,097,152

2,097,151.999 023 440

0.000 976 563

_iq9

23

9

-4,194,304

4,194,303.998 046 880

0.001 953 125

_iq8

24

8

-8,388,608

8,388,607.996 093 750

0.003 906 250

_iq7

25

7

-16,777,216

16,777,215.992 187 500

0.007 812 500

_iq6

26

6

-33,554,432

33,554,431.984 375 000

0.015 625 000

_iq5

27

5

-67,108,864

67,108,863.968 750 000

0.031 250 000

_iq4

28

4

-134,217,728

134,217,727.937 500 000

0.062 500 000

_iq3

29

3

-268,435,456

268,435,455.875 000 000

0.125 000 000

_iq2

30

2

-536,870,912

536,870,911.750 000 000

0.250 000 000

_iq1

31

1

-1,073,741,824

1,073,741,823.500 000 000

0.500 000 000

除了这些特定的 IQ 格式类型,还有一种对应于 GLOBAL_IQ 格式的类型。它就是 _iq,与上述的一种 IQ 格式匹配(基于 GLOBAL_IQ 的设置)。使用特定 _iqN 类型和 _iq24 之类的函数时,GLOBAL_IQ 格式没有影响。

2.2. 使用 IQMath 库

提供 IQmath 库的两个版本:

  • RTS:使用编译器 Runtime System (RTS)库的 C 实现

  • MathACL:利用 MSPM0 硬件数学加速器 (MathACL) ​

MSPM0 系列

RTS

MathACL

MSPM0G

支持

支持

MSPM0L

支持

不支持

易于使用的名为 iqmath.a 的存档文件中提供了这些库。存档文件应配合工程使用,以取代 .lib 文件。

要找到提供的库,只需导航到 source/ti/iqmath/lib 下的器件目录,在那里可找到 iqmath.a 的不同版本。

要使用 IQmath,用户还需要确保其拥有 IQMath include 文件夹的正确路径,即 #include <ti/iqmath/include/IQmathLib.h>

有关如何向工程中添加文件、库和路径的详细信息,请查阅相应的 IDE 文档。

2.3. 从 C 代码调用函数

要从 C 代码调用 IQmath 函数,必须包含 C 头文件。然后,应用程序可以使用 _iq 和 _iqN 数据类型以及 IQmath 函数。

例如,以下代码以 IQ12 格式执行一些简单的算术:

#include <ti/iqmath/include/IQmathLib.h>

int main(void)
{
    _iq12 X, Y, Z;
    X = _IQ12(1.0);
    Y = _IQ12(7.0);
    Z = _IQ12div(X, Y);
}

2.4. 选择 Global IQ 格式

不同的应用程序对数值精度和动态范围的要求差别很大。库提供 GLOBAL_IQ 格式(使用 _iq 数据类型),应用程序可使用它执行一般格式(可在编译时更改)的计算。使用 GLOBAL_IQ 格式编写的应用程序可更改为另一种格式,只需要更改 GLOBAL_IQ 值并重新编译即可,这样可以轻松测量和评估不同 格式的精度和性能影响。

GLOBAL_IQ 的设置在 _iqN 格式和对应的函数中没有任何影响。这些类型始终有相同的固定精度,无论 GLOBAL_IQ 格式为何。

默认的 GLOBAL_IQ 格式为 IQ24。可以通过两种方法之一轻松覆盖它:

在源文件中,可以在包含头文件之前选择格式。以下示例选择了 IQ8 的 GLOBAL_IQ 格式:

//
// Set GLOBAL_IQ to 8 prior to including IQmathLib.h.
//
#define GLOBAL_IQ 8
#include <ti/iqmath/include/IQmathLib.h>

在工程文件中,为 GLOBAL_IQ 添加一个预定义的值。添加预定义值的方法因工具链而异。

第一种方法允许应用程序中的不同模块有不同的全局格式值,而第二种方法更改整个应用程序的全局格式值。最合适的方法因应用程序而异。

注意:当 GLOBAL_IQ 为 30 时,某些函数不可用。请参阅“API 指南”部分中列出的函数和可用的 IQ 格式。

2.5. 示例工程

IQmathLib 提供了 RTS 和 MathACL 类型的两个示例工程作为用户的起点,并演示了 IQmath 函数的用法,而 SDK 包含若干利用 IQmath 打造更高级的应用程序的工程。包含的示例为:

  • IQmathLib MathACL 运行测试示例

  • IQmathLib RTS 运行测试示例

IQmathLib 工程为编译定点应用程序提供了起点。这些工程已经添加了库,而且 include 路径设置为包含头文件。

示例展示了如何使用若干 IQmathLib 函数和数据类型执行数学计算,唯一的区别是 MathACL 的使用。

3. API 指南

完整的 API 指南包含在内,显示了有关所有文件、API 和相应参数的详细信息。IQmath 包括五类例程:

  • 格式转换函数:在各种格式之间转换数字的方法。

  • 算术函数:执行基础算术(加减乘除)的方法。

  • 三角函数:执行三角函数(sin、cos、atan 等等)的方法。

  • 数学函数:执行高等算术(平方根、ex 等等) 的方法。

  • 其他:其他方法(饱和值和绝对值)。后面章节中将详细介绍每个组中的方法。

详细指南可以在这里找到:

4. 基准测试

此部分包括 IQmath 库的基准测试,以每个函数的平均执行周期数来衡量。这些基准测试是在器件 LaunchPad 上使用 IAR Embedded Workbench for ARM 9.20.11.43606 运行的。每个函数的测试都使用一组不同的值运行,每个值迭代 1000 次,从而得到呈现的平均值。

MSPM0G 基准测试是在早期实验器件上进行的。

函数名称

(MSPM0G) MathACL IQmath

(MSPM0G) RTS IQmath

(MSPM0G) Float

(MSPM0L) RTS IQmath

(MSPM0L) Float

sin

98

291

1260

292

1223

cos

99

289

1262

291

1227

frac

21

21

不适用

24

不适用

asin

310

521

1889

522

2056

acos

311

523

1889

525

2058

atan

264

670

1404

671

1540

atan2

279

675

1379

675

1537

sqrt

105

564

238

566

254

exp

638

645

1663

646

1694

log

892

898

1479

905

1513

add

9

9

73

11

71

sub

9

9

70

9

69

mpy

34

63

76

65

74

div

52

442

228

443

294