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 代表小数位数。
例如,3.625 的 IQ24 值存储为以下方程中显示的整数值 60817408。
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 |