最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

【F280025】關(guān)于加速三角函數(shù)的計(jì)算

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

????就是吧,用C2000?MCU一般都是做電源或者電機(jī)控制之類的,在電源和電機(jī)控制中總得用到一些三角函數(shù),比如sin cos之類的。一般來(lái)說(shuō)像是GD32E50X帶有三角函數(shù)加速器的就會(huì)用三角函數(shù)加速器來(lái)計(jì)算,沒有的也會(huì)用ARM_Math?Library來(lái)計(jì)算,C2000本身也帶有類似的庫(kù)叫做fastRTS,然后像是280025還帶有TMU三角函數(shù)加速器,至于在C2000中怎么使用它們,還是踩了不少坑的。TI的文檔說(shuō)是在C2000ware中,但是文檔有些都是過時(shí)的,還有很多東西他根本不寫,資料也不知道擱哪里找,這邊踩了幾天坑然后大概算是會(huì)用了,簡(jiǎn)單做一個(gè)tutorial以及一些測(cè)試。注意:文本很長(zhǎng),從測(cè)試到資料查找過程從頭列到尾,如果想省流,請(qǐng)直接去別處搜。

1.F280025?math.h sinf()測(cè)試

代碼如下:

????Sysconfig中設(shè)置了CPUTimer,參數(shù)配置如下:

Sysconfig配置

????以下是在RAM中運(yùn)行的結(jié)果:

RAM中運(yùn)行結(jié)果
FLASH運(yùn)行結(jié)果

可以看出,使用C標(biāo)準(zhǔn)庫(kù)math.h運(yùn)行一萬(wàn)次sinf,在RAM中運(yùn)行結(jié)果是平均87.9976周期一次,在FLASH中是平均116.9989周期一次。且結(jié)果都是正確的。

2.F280025 Sysconfig中FPUfastRTS測(cè)試

??? Sysconfig配置如下圖:

Sysconfig配置圖

????代碼和之前一樣,但是編譯結(jié)果會(huì)出現(xiàn)一個(gè)Warning:

Warning

????先不管這個(gè),直接看一下運(yùn)行結(jié)果:

????RAM運(yùn)行結(jié)果:

RAM運(yùn)行結(jié)果

????FLASH運(yùn)行結(jié)果:

FLASH運(yùn)行結(jié)果

????可以看出在RAM中運(yùn)行結(jié)果是平均54周期一次,但是Flash中運(yùn)行結(jié)果是不正確的。這里就出現(xiàn)了問題,這就是剛剛提示的Warning的事情了。在解釋這些事情之前,首先得看一下fastRTS的文檔是怎么說(shuō)的。

3.關(guān)于fastRTS

????fastRTS在C2000ware根目錄中l(wèi)ibraries/math/FPUfastRTS/c28中,其中的docs文件夾FASTRTS_SW_LIB_UG.pdf是關(guān)于此庫(kù)的文檔。在第一張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庫(kù)是用于支持FPU32(單精度浮點(diǎn))、TMU(三角函數(shù)加速器)以及FPU64(雙精度浮點(diǎn))的C2000設(shè)備的優(yōu)化過的常規(guī)數(shù)學(xué)計(jì)算集合。這些函數(shù)可利用上述硬件加速器加速計(jì)算時(shí)間,本文檔提供庫(kù)中每個(gè)函數(shù)的描述。

????也就是說(shuō)fastRTS其實(shí)就是加速數(shù)學(xué)計(jì)算用的,具體怎么使用,來(lái)看第四章是怎么說(shuō)的:

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源碼,用戶可根據(jù)需要將工程導(dǎo)入CCS以修改源碼和查找表

????可以看出這個(gè)庫(kù)是基于查找表的,我們可以嘗試在CCS中導(dǎo)入此工程,在CCS中點(diǎn)import,目錄選擇C2000Ware_x_xx_xx_xx\libraries\math\FPUfastRTS\c28,找到rts2800_fpu32_fast_supplement:

導(dǎo)入工程

????可以看到有一個(gè)FPUmathTable.asm的文件,

FPUmathTables

FPUmathTables

????里面存有所用到的查找表。這就有一個(gè)判斷就是說(shuō)那我們?cè)赗AM中運(yùn)行是可以正常找到這個(gè)表的,但是在FLASH中找不到這個(gè)表,那我們繼續(xù)第二章,查看一下內(nèi)存分配情況。

4.接第二章,查看內(nèi)存分配并測(cè)試

????我們接著選擇RAM運(yùn)行,然后編譯,查看Memory?Allocation:

RAM內(nèi)存分配

????這里我們可以看到有一個(gè)FPUmathTables。

? ? 選擇FLASH運(yùn)行,編譯之后查看Memory?Allocation。


FLASH內(nèi)存分配

????這里看到FPUmathTables是放在RAMLS4567中,因?yàn)槲覀冎纅astRTS運(yùn)行時(shí)需要FPUmathTables的,但是我們之前編譯的時(shí)候提示我們沒有分配FPUmathTables塊,燒錄時(shí)這段FPUmathTables或是燒錄到RAMLS4567,但是其他應(yīng)用到RAMLS4567的部分吧FPUmathTables覆蓋掉了,或者就是DEBUG時(shí)會(huì)清空內(nèi)存之類,這里TI沒有給具體解釋,我也不懂這些,但是基于推測(cè),我覺得是這樣的。

????為了驗(yàn)證我的猜想,我們吧FPUmathTables手動(dòng)分配至Flash中,然后運(yùn)行一下,想要做到這一點(diǎn)是需要修改cmd文件的,這里需要對(duì)cmd文件有點(diǎn)了解,其實(shí)也不是很難,簡(jiǎn)單看一下:

????可以看到開頭定義了MEMORY,以及各個(gè)內(nèi)存塊以及Flash扇區(qū)的地址和長(zhǎng)度,SECTIONS定義了內(nèi)存分配,可以看出一個(gè)名字后面通過:>定義了這個(gè)塊是放在哪個(gè)位置的,如果說(shuō)我們定義一下:FPUmathTables? ? : > FLASH_BANK0_SEC15 是不是就是把查找表放在了最后一個(gè)Flash扇區(qū)中,我們?cè)贗QmathTables后面添加上述語(yǔ)句。然后編譯看結(jié)果:

編譯結(jié)果

???


編譯結(jié)果

?????可以看到RAMLS4567中的FPUmathTables不存在了,是在Flash扇區(qū)中?,F(xiàn)在運(yùn)行看一下結(jié)果:

運(yùn)行結(jié)果

????可以看出運(yùn)行結(jié)果是正確的,時(shí)間是105周期,比直接math會(huì)快一些。但是并沒有快很多。如果想要快速運(yùn)行,我們可能需要在啟動(dòng)時(shí)把Flash里的Table搬到RAM中,但是實(shí)際上這個(gè)Table占用了1676個(gè)WORD,也就是大概3352 Byte,實(shí)際上280025也只有12個(gè)KByte,不是很實(shí)用的一種方式,而且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

對(duì)于單精度浮點(diǎn)庫(kù),–float_support必須開啟,也可以手動(dòng)開啟tmu_support,反正也沒有一個(gè)函數(shù)用這個(gè)TMU指令

????也就是說(shuō)fastRTS根本沒有用到TMU,那么如果使用TMU計(jì)算sin會(huì)有多塊呢,對(duì)于TMU,可以直接參考F280025的Technical Reference Manual。這個(gè)還是很好找的,如果找不到還是別學(xué)了。TMU在C28x Processor章節(jié),本章節(jié)有介紹TMU作用,最后一句話寫的:

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

要了解更多關(guān)于TMU信息,看這個(gè)文檔(提供了超鏈接)

????那此時(shí)我們直接進(jìn)入下一章來(lái)看看TMU該如何使用。

5.TMU怎么用

????點(diǎn)開超鏈接之后,我們看到一個(gè)文檔,其中有TMU章節(jié),點(diǎn)開它查看一下:

TMU章節(jié)

????可以看到TMU章節(jié)里全是講述TMU匯編指令之類的,一個(gè)都看不懂,那么我們后退一下,看一下Technical Reference Manual第二章有沒有額外信息:

額外信息

????這邊有提供一個(gè)C28X有關(guān)的合集,其中有一個(gè)文檔叫:Enhancing the Computational Performance of the C2000? Microcontroller Family

????這個(gè)看上去很像是我們需要的文檔,往下翻看一下,可以看到第八章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

????詳細(xì)有關(guān)FPU、TMU和FINTDIV軟件開發(fā)時(shí)的內(nèi)部函數(shù)可以在以下文檔中找到:TMS320C28x Optimizing C/C++ Compiler v20.2.0.LTS User's Guide(提供超鏈接)

????點(diǎn)開這個(gè)文檔,可以看到7.6.3節(jié)看到TMU有關(guān)函數(shù):

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.

下列函數(shù)用TMU計(jì)算三角函數(shù)可快了,只要你設(shè)置了--tmu_support=tmu0?或者?--tmu_support=tmu1這倆玩意兒,這些函數(shù)都能用。加陰影的那個(gè)只能在--tmu_support=tmu1里面用,而且只支持EABI。如果你想用COFF?ABI的話,參數(shù)返回的值float就是double,double就是float,因?yàn)樗麄z都是32位的。如果你用EABI的話,?float就是float,double就是double。

TMU函數(shù)

????看上去上面這些函數(shù)就是我們想要的TMU計(jì)算三角函數(shù),來(lái)計(jì)算一下__sin(),代碼如下:

????運(yùn)行結(jié)果如圖:

????RAM中:

RAM

????FLASH:

FLASH

????這回就快很多了,RAM平均22個(gè)周期,F(xiàn)LASH平均29周期,誰(shuí)還用什么fastRTS啊。所以,只要照著上面那個(gè)表用TMU,那幾本不用擔(dān)心什么三角函數(shù)計(jì)算速度的問題了。本章完。

總結(jié)一下

? ? 本文大概用了很大篇幅講了一堆廢話,其實(shí)我大可直接列出那個(gè)表來(lái)說(shuō)怎么使用這個(gè)TMU,其他網(wǎng)站上也有相關(guān)的,但是有時(shí)候我就在想直接查到的東西那別人是怎么找到的呢?負(fù)責(zé)任的大廠應(yīng)該會(huì)把所有的tutorial寫在官網(wǎng)以及手冊(cè)里,而不是去看一個(gè)其他人得教程,所以才有了本文這個(gè)一步一步推,一步一步找到最后的過程。可能會(huì)浪費(fèi)一些時(shí)間,但是感覺有些東西還是需要找到源頭會(huì)好些。嘗試著做去做教程的人而不是看別人的教程會(huì)用就行。

【F280025】關(guān)于加速三角函數(shù)的計(jì)算的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
安乡县| 长岭县| 洪湖市| 城固县| 紫金县| 岑巩县| 新乐市| 方山县| 郯城县| 会理县| 个旧市| 桐城市| 老河口市| 仲巴县| 赞皇县| 调兵山市| 凤山县| 神木县| 五原县| 马山县| 外汇| 淮南市| 公安县| 富顺县| 沅陵县| 霞浦县| 通许县| 安福县| 南召县| 嘉黎县| 常宁市| 阳西县| 安徽省| 张家川| 邯郸县| 丰城市| 商城县| 三亚市| 河北省| 调兵山市| 兰考县|