硬件加速器三角函数单元(Trigonometric Function Unit)能够高速处理三角函数sin、cos、arctan和sqrt(x2+y2)函数的运算,可显著减少CPU负荷,在电机的矢量控制运算中非常有用。
本文介绍如何使用带有CC-RX编译器的三角函数单元。TFU现有两个版本TFUv1和TFUv2,配备TFU的芯片型号如下表所示。
三角函数单元TFU版本
配备TFU的芯片
TFUv1
RX72T/RX72M/RX72N
TFUv2
RX26T
1. TFUv1的使用说明
在工程中选择[Project] → [C/C++ Project Settings] → [Tool Settings] → [Compiler] → [Optimization] → [Advanced],如果器件有TFU,则会有选项"Execution method of library function that can use trigonometric function unit",如需使用TFU,选择"Use trigonometric function unit ",如图1所示。
图1 TFU选择设置
如上设置后,标准数学库函数sinf()、cosf()、atan2f()和hypotf()的计算将由TFU执行,如图2中代码所示。由于TFU可以同时计算sin和cos、arctan和sqrt(x2+y2),所以CC-RX编译器对相同输入值的sin和cos、arctan和sqrt(x2+y2)可使用同时计算功能,以进一步提高运算速度。可以使用函数__sincosf()和__atan2hypotf()来同时计算,如图3中代码所示。
图2 使用TFU的代码示例
图3 TFU同时计算代码示例
2. TFUv2的使用说明
三角函数单元TFUv1已经通过进一步的改进升级到TFUv2。TFUv2与TFUv1相比有以下改进:
1单精度浮点数计算速度的进一步提升,如图4所示
图4 计算速度对比
2支持定点类型的计算
在TFUv2中,单精度浮点数的操作与TFUv1中相同;对于定点数据类型,使用内部函数:
__sinfx((int32_t)(x)) / __cosfx((int32_t)(x))
__atan2fx((int32_t)(x), (int32_t)(y)) / __hypotfx((int32_t)(x), (int32_t)(y))
或者同时计算的函数:
__sincosfx((int32_t)(x), (int32_t *)(y), (int32_t *)(z))
__atan2hypotfx((int32_t)(w), (int32_t)(x), (int32_t *)(y), (int32_t *)(z))
对于定点数据,可以更改输入/输出的单位和格式。如果使用Smart Configurator,选择scfg文件,在[Components] → [r_bsp]中选择"Enable initilize function for TFU (fixed-point numbers)"为"Enabled",下面有三个选项可以修改,如图5所示。如果没有使用Smart Configurator,可以在硬件初始化的时候加入TFU的FXSCIOC和FXATIOC寄存器的设定来修改输入/输出的单位和格式。
图5 定点数据的单位和格式修改
3支持重入
TFUv2支持重入(TFUv1不支持),会在每个中断函数的入口和出口生成保存和恢复代码,但是会减慢处理速度。因此,如果不需要重入,可以禁止保存和恢复代码的生成。如果只是一个特定的中断禁止重入,可以在中断函数的申明中写"no_tfu"
#pragma interrupt func(no_tfu)
也可以使用选项禁止所有中断功能的保存和恢复,选择[Project] → [C/C++ Project Settings] → [Common] → [CPU],取消选中[Saves and restores the output by trigonometric function unit in interrupt functions],如图6所示。
图6 TFU取消重入设置
在图6设置下,如果仅对某个特定中断允许重入,可以在中断函数的申明中写"tfu"
#pragma interrupt func(tfu)
结合以上内容,对于内部配备硬件加速单元TFU的芯片,建议在电机矢量控制的运算中使用TFU,从而提高芯片在电机控制方面的性能。
全部0条评论
快来发表一下你的评论吧 !