欢迎光临散文网 会员登陆 & 注册

【F280025】关于加速三角函数的计算

2023-08-19 02:01 作者:NostalgistL00  | 我要投稿

    就是吧,用C2000 MCU一般都是做电源或者电机控制之类的,在电源和电机控制中总得用到一些三角函数,比如sin cos之类的。一般来说像是GD32E50X带有三角函数加速器的就会用三角函数加速器来计算,没有的也会用ARM_Math Library来计算,C2000本身也带有类似的库叫做fastRTS,然后像是280025还带有TMU三角函数加速器,至于在C2000中怎么使用它们,还是踩了不少坑的。TI的文档说是在C2000ware中,但是文档有些都是过时的,还有很多东西他根本不写,资料也不知道搁哪里找,这边踩了几天坑然后大概算是会用了,简单做一个tutorial以及一些测试。注意:文本很长,从测试到资料查找过程从头列到尾,如果想省流,请直接去别处搜。

1.F280025 math.h sinf()测试

代码如下:

    Sysconfig中设置了CPUTimer,参数配置如下:

Sysconfig配置

    以下是在RAM中运行的结果:

RAM中运行结果
FLASH运行结果

可以看出,使用C标准库math.h运行一万次sinf,在RAM中运行结果是平均87.9976周期一次,在FLASH中是平均116.9989周期一次。且结果都是正确的。

2.F280025 Sysconfig中FPUfastRTS测试

    Sysconfig配置如下图:

Sysconfig配置图

    代码和之前一样,但是编译结果会出现一个Warning:

Warning

    先不管这个,直接看一下运行结果:

    RAM运行结果:

RAM运行结果

    FLASH运行结果:

FLASH运行结果

    可以看出在RAM中运行结果是平均54周期一次,但是Flash中运行结果是不正确的。这里就出现了问题,这就是刚刚提示的Warning的事情了。在解释这些事情之前,首先得看一下fastRTS的文档是怎么说的。

3.关于fastRTS

    fastRTS在C2000ware根目录中libraries/math/FPUfastRTS/c28中,其中的docs文件夹FASTRTS_SW_LIB_UG.pdf是关于此库的文档。在第一张Introduction中写到:

The Texas Instruments TMS320C28x Floating Point Unit Fast Run Time Support (FASTRTS) Library is a collection of optimized math routines written for C2000 devices that support either a single precision Floating Point Unit (FPU32), an FPU32 with Triginometric Math Unit (TMU type 0), or a double precision FPU (FPU64). These functions enable C/C++ programmers to take full advantage of the aforementioned hardware accelerators to speed up computation time. This document provides a description of each function included in the library.

    大概意思如下:

TI TMS320C28x FASTRTS库是用于支持FPU32(单精度浮点)、TMU(三角函数加速器)以及FPU64(双精度浮点)的C2000设备的优化过的常规数学计算集合。这些函数可利用上述硬件加速器加速计算时间,本文档提供库中每个函数的描述。

    也就是说fastRTS其实就是加速数学计算用的,具体怎么使用,来看第四章是怎么说的:

The source code and project(s) for the libraries are provided. The user may import the library project(s) into CCSv10 and be able to view and modify the source code for all routines and lookup tables. (see Figure 4.1)

文件中提供fastRTS源码,用户可根据需要将工程导入CCS以修改源码和查找表

    可以看出这个库是基于查找表的,我们可以尝试在CCS中导入此工程,在CCS中点import,目录选择C2000Ware_x_xx_xx_xx\libraries\math\FPUfastRTS\c28,找到rts2800_fpu32_fast_supplement:

导入工程

    可以看到有一个FPUmathTable.asm的文件,

FPUmathTables

FPUmathTables

    里面存有所用到的查找表。这就有一个判断就是说那我们在RAM中运行是可以正常找到这个表的,但是在FLASH中找不到这个表,那我们继续第二章,查看一下内存分配情况。

4.接第二章,查看内存分配并测试

    我们接着选择RAM运行,然后编译,查看Memory Allocation:

RAM内存分配

    这里我们可以看到有一个FPUmathTables。

    选择FLASH运行,编译之后查看Memory Allocation。


FLASH内存分配

    这里看到FPUmathTables是放在RAMLS4567中,因为我们知道fastRTS运行时需要FPUmathTables的,但是我们之前编译的时候提示我们没有分配FPUmathTables块,烧录时这段FPUmathTables或是烧录到RAMLS4567,但是其他应用到RAMLS4567的部分吧FPUmathTables覆盖掉了,或者就是DEBUG时会清空内存之类,这里TI没有给具体解释,我也不懂这些,但是基于推测,我觉得是这样的。

    为了验证我的猜想,我们吧FPUmathTables手动分配至Flash中,然后运行一下,想要做到这一点是需要修改cmd文件的,这里需要对cmd文件有点了解,其实也不是很难,简单看一下:

    可以看到开头定义了MEMORY,以及各个内存块以及Flash扇区的地址和长度,SECTIONS定义了内存分配,可以看出一个名字后面通过:>定义了这个块是放在哪个位置的,如果说我们定义一下:FPUmathTables    : > FLASH_BANK0_SEC15 是不是就是把查找表放在了最后一个Flash扇区中,我们在IQmathTables后面添加上述语句。然后编译看结果:

编译结果

   


编译结果

     可以看到RAMLS4567中的FPUmathTables不存在了,是在Flash扇区中。现在运行看一下结果:

运行结果

    可以看出运行结果是正确的,时间是105周期,比直接math会快一些。但是并没有快很多。如果想要快速运行,我们可能需要在启动时把Flash里的Table搬到RAM中,但是实际上这个Table占用了1676个WORD,也就是大概3352 Byte,实际上280025也只有12个KByte,不是很实用的一种方式,而且fastRTS中有写如下:

For the single prcecision library set the –float_support option to fpu32 in the Runtime Model Options. The user may optionally turn on tmu_support; none of the library functions use TMU instructions but the library is built with TMU support turned on

对于单精度浮点库,–float_support必须开启,也可以手动开启tmu_support,反正也没有一个函数用这个TMU指令

    也就是说fastRTS根本没有用到TMU,那么如果使用TMU计算sin会有多块呢,对于TMU,可以直接参考F280025的Technical Reference Manual。这个还是很好找的,如果找不到还是别学了。TMU在C28x Processor章节,本章节有介绍TMU作用,最后一句话写的:

For more information, see the TMS320C28x Extended Instruction Sets Technical Reference Manual. 

要了解更多关于TMU信息,看这个文档(提供了超链接)

    那此时我们直接进入下一章来看看TMU该如何使用。

5.TMU怎么用

    点开超链接之后,我们看到一个文档,其中有TMU章节,点开它查看一下:

TMU章节

    可以看到TMU章节里全是讲述TMU汇编指令之类的,一个都看不懂,那么我们后退一下,看一下Technical Reference Manual第二章有没有额外信息:

额外信息

    这边有提供一个C28X有关的合集,其中有一个文档叫:Enhancing the Computational Performance of the C2000™ Microcontroller Family

    这个看上去很像是我们需要的文档,往下翻看一下,可以看到第八章References:

Details about the FPU, TMU, and FINTDIV intrinsics for providing ease of software development can be found in the following document: • Texas Instruments: TMS320C28x Optimizing C/C++ Compiler v20.2.0.LTS User's Guide

    详细有关FPU、TMU和FINTDIV软件开发时的内部函数可以在以下文档中找到:TMS320C28x Optimizing C/C++ Compiler v20.2.0.LTS User's Guide(提供超链接)

    点开这个文档,可以看到7.6.3节看到TMU有关函数:

The following intrinsics perform faster trigonometric calculations using the Trigonometric Math Unit (TMU). These intrinsics are enabled if the --tmu_support=tmu0 or --tmu_support=tmu1 compiler option is used. The shaded rows list intrinsics that are supported only if --tmu_support=tmu1, and are supported for EABI only. If you are using the COFF ABI, arguments and return values listed as floats may also use doubles, because both are 32-bit types. If you are using EABI, these functions require the float type, because double is a 64-bit type.

下列函数用TMU计算三角函数可快了,只要你设置了--tmu_support=tmu0 或者 --tmu_support=tmu1这俩玩意儿,这些函数都能用。加阴影的那个只能在--tmu_support=tmu1里面用,而且只支持EABI。如果你想用COFF ABI的话,参数返回的值float就是double,double就是float,因为他俩都是32位的。如果你用EABI的话, float就是float,double就是double。

TMU函数

    看上去上面这些函数就是我们想要的TMU计算三角函数,来计算一下__sin(),代码如下:

    运行结果如图:

    RAM中:

RAM

    FLASH:

FLASH

    这回就快很多了,RAM平均22个周期,FLASH平均29周期,谁还用什么fastRTS啊。所以,只要照着上面那个表用TMU,那几本不用担心什么三角函数计算速度的问题了。本章完。

总结一下

    本文大概用了很大篇幅讲了一堆废话,其实我大可直接列出那个表来说怎么使用这个TMU,其他网站上也有相关的,但是有时候我就在想直接查到的东西那别人是怎么找到的呢?负责任的大厂应该会把所有的tutorial写在官网以及手册里,而不是去看一个其他人得教程,所以才有了本文这个一步一步推,一步一步找到最后的过程。可能会浪费一些时间,但是感觉有些东西还是需要找到源头会好些。尝试着做去做教程的人而不是看别人的教程会用就行。

【F280025】关于加速三角函数的计算的评论 (共 条)

分享到微博请遵守国家法律