C28x+FPU架構(gòu)的C2000微處理器在原有的C28x定點(diǎn)CPU的基礎(chǔ)上加入了一些寄存器和指令,來(lái)支持IEEE 單精度浮點(diǎn)數(shù)的運(yùn)算。對(duì)于在定點(diǎn)微處理器上編寫(xiě)的程序,浮點(diǎn)C2000也完全兼容,不需要對(duì)程序做出改動(dòng)。浮點(diǎn)處理器相對(duì)于定點(diǎn)處理器有如下好處:
編程更簡(jiǎn)單
性能更優(yōu),比如除法,開(kāi)方,F(xiàn)FT和IIR濾波等算法運(yùn)算效率更高。
程序魯棒性更強(qiáng)。
一、IEEE754格式的浮點(diǎn)數(shù)
C28x+FPU的單精度浮點(diǎn)數(shù)遵循IEEE754格式。它包括:
1位符號(hào)位:0表示正數(shù),1表示負(fù)數(shù)。
8位階碼
23位尾數(shù)
31 | 30 23 | 22 0 |
符號(hào)位 | 階碼 | 尾數(shù) |
表1:IEEE單精度浮點(diǎn)數(shù)
符號(hào)位S | 階碼E | 尾數(shù)M | 值 |
0 | 0 | 0 | 正0 |
1 | 0 | 0 | 負(fù)0 |
0或1 | 0 | 非0 | 非規(guī)格化數(shù)(1) |
0 | 1-254 | 0x00000-0x7FFFF | 正常范圍正數(shù)(2) |
1 | 1-254 | 0x00000-0x7FFFF | 正常范圍負(fù)數(shù)(2) |
0 | 255 | 0 | 正無(wú)窮大 |
1 | 255 | 0 | 負(fù)無(wú)窮大 |
0或1 | 255 | 非0 | 非數(shù)值(NaN) |
(1)非規(guī)格化數(shù)值非常小,計(jì)算公式為(-1)sx2(E-126)x0.M
(2)正常范圍數(shù)值計(jì)算公式為(-1)sx2(E-127)x1.M
正常范圍數(shù)值落在± ~1.7 x 10 -38 to ± ~3.4 x 10 +38范圍內(nèi)。從表1可以看出,IEEE754標(biāo)準(zhǔn)包括:
標(biāo)準(zhǔn)數(shù)據(jù)格式和特殊值,比如非數(shù)值(NaN)和無(wú)窮大
標(biāo)準(zhǔn)舍入模式和浮點(diǎn)運(yùn)算
多平臺(tái)支持,包括德州儀器C67x系列芯片。
C2000對(duì)該標(biāo)準(zhǔn)作了一些簡(jiǎn)化:
狀態(tài)標(biāo)志位和比較運(yùn)算不區(qū)分正0和負(fù)0
非規(guī)格化數(shù)值被認(rèn)為是0
對(duì)非數(shù)值(NaN)處理方式和無(wú)窮大一樣。
IEEE754標(biāo)準(zhǔn)有5種舍入模式,C28x+FPU只支持其中兩種:
--截?cái)啵盒?shù)位不管大小全部舍去
--就近舍入向偶舍入:這種模式下如果小數(shù)位小于5就舍去,大于5就進(jìn)位,如果小數(shù)位為5,則舍入到最近的偶數(shù)。
表2展示了不同的舍入模式對(duì)數(shù)據(jù)的影響。C28x+FPU編譯器默認(rèn)將微處理器配置為就近舍入向偶舍入模式[1]。
表2:不同舍入模式示例
模式 / 實(shí)際值 | +11.5 | +12.5 | ?11.5 | ?12.5 |
就近舍入向偶舍入 | +12.0 | +12.0 | ?12.0 | ?12.0 |
就近舍入遠(yuǎn)離0舍入 | +12.0 | +13.0 | ?12.0 | ?13.0 |
截?cái)?/td> | +11.0 | +12.0 | ?11.0 | ?12.0 |
向上舍入 | +12.0 | +13.0 | ?11.0 | ?12.0 |
向下舍入 | +11.0 | +12.0 | ?12.0 | ?13.0 |
二、浮點(diǎn)C2000芯片運(yùn)算技巧和注意點(diǎn)
浮點(diǎn)數(shù)的精度由尾數(shù)位決定,絕大多數(shù)的數(shù)在用浮點(diǎn)數(shù)表示時(shí)都會(huì)有誤差,這些誤差很小,多數(shù)情況下可以忽略,但是在經(jīng)過(guò)多次計(jì)算后這個(gè)誤差可能會(huì)大到無(wú)法接受。
下面用實(shí)例來(lái)進(jìn)行說(shuō)明,下面一段代碼定義float類(lèi)型變量,分別在TI最新的Delfino芯片F(xiàn)28379D的CPU1和CLA1上,將11.7加20001次。
float CLATMPDATA=0;
int index=20001;
while(index--)
{
CLATMPDATA=CLATMPDATA+11.7;
}
得到如下結(jié)果:
其中CLATMPDATA1是在CLA中將11.7加20001次得到的結(jié)果,CLATMPDATA2是在CPU中將11.7加20001次得到的結(jié)果。可以看出兩者所得到的結(jié)果不同,并且都和正確結(jié)果234011.7有較大差距。
為何CPU和CLA計(jì)算結(jié)果不同?
CPU和CLA運(yùn)算結(jié)果的不同是由于其對(duì)浮點(diǎn)數(shù)的舍入模式的不同造成的,前文已經(jīng)說(shuō)過(guò),C28x+FPU 編譯器默認(rèn)將CPU配置為就近舍入向偶舍入模式。而CLA不同,CLA默認(rèn)為截?cái)嗌崛肽J絒2]。在CLA的代碼中,我們可以通過(guò)增加下述代碼:
__asm(" MSETFLG RNDF32=1");//1為就近舍入向偶舍入,0為截?cái)嗌崛?/p>
將CLA的舍入模式更改為就近舍入向偶舍入模式,然后再運(yùn)行代碼,可以得到和CPU同樣的結(jié)果。
2. 為何CPU和CLA計(jì)算結(jié)果都有較大誤差?如何解決?
11.7在用IEEE754格式的浮點(diǎn)數(shù)表示時(shí)為0x413b3333,其對(duì)應(yīng)的實(shí)際值為11.69999980926513671875,可以看出誤差很小,但是經(jīng)過(guò)多次累加多次舍入后得到的結(jié)果誤差較大,對(duì)此,我們可以將CLATMPDATA定義為long double型變量(64位),再次運(yùn)行相同的代碼,可以得到如下結(jié)果,可以看到誤差很小可以忽略。
需要指出的是,現(xiàn)有的C28x CPU只支持單精度(32位)的硬件浮點(diǎn)運(yùn)算,對(duì)于64位雙精度浮點(diǎn)數(shù)的運(yùn)算都是通過(guò)軟件實(shí)現(xiàn)的,所以其運(yùn)算速率會(huì)慢很多。另外CLA不支持64位數(shù)。
在這個(gè)實(shí)例中,我們可以分別觀察float類(lèi)型變量和long double類(lèi)型變量的匯編代碼如下:
C code: CLATMPDATA2=CLATMPDATA2+11.7;
如果CLATMPDATA2是float型變量,則相應(yīng)的匯編代碼為:
00c08d: E80209D8 MOVIZ R0, #0x413b 1cycle
00c08f: E2AF0112 MOV32 R1H, @0x12, UNCF 1cycle
00c091: E8099998 MOVXI R0H, #0x3333 1cycle
00c093: E7100040 ADDF32 R0H, R0H, R1H 2cycle
00c095: 7700 NOP 1cycle
00c096: E2030012 MOV32 @0x12, R0H 1cycle
如果CLATMPDATA2是long double型變量,則相應(yīng)的匯編代碼為:
00c08b: 7680005A MOVL XAR6, #0x00005a 1cycle
00c08d: 8F00005A MOVL XAR4, #0x00005a 1cycle
00c08f: 8F40C26A MOVL XAR5, #0x00c26a 1cycle
00c091: FF69 SPM #0 1cycle
00c092: 7640C0C9 LCR FD$$ADD 4cycle(跳轉(zhuǎn)耗時(shí))
+25cycle(FD$$ADD函數(shù)內(nèi)部需要25cycle)
可以看出CPU對(duì)float類(lèi)型數(shù)執(zhí)行一次加法耗時(shí)7個(gè)cycle,對(duì)long double類(lèi)型數(shù)執(zhí)行一次加法耗時(shí)33個(gè)cycle。
三、結(jié)論
1. C2000的CPU和CLA默認(rèn)的舍入模式不同,在計(jì)算浮點(diǎn)數(shù)時(shí)可能會(huì)得到不同的結(jié)果,但是我們可以通過(guò)代碼改變其舍入模式得到相同的結(jié)果。
2. 單精度浮點(diǎn)數(shù)經(jīng)過(guò)多次計(jì)算后可能會(huì)有較大誤差,可以通過(guò)將變量定義為64位long double型解決精度問(wèn)題。
3. C28x CPU只支持單精度(32位)的硬件浮點(diǎn)運(yùn)算,對(duì)于64位雙精度浮點(diǎn)數(shù)的運(yùn)算都是通過(guò)軟件實(shí)現(xiàn)的,所以其運(yùn)算速率會(huì)慢很多。在下一代的C2000產(chǎn)品中我們會(huì)實(shí)現(xiàn)對(duì)64位雙精度浮點(diǎn)數(shù)運(yùn)算的硬件支持。
審核編輯:郭婷
-
寄存器
+關(guān)注
關(guān)注
31文章
5402瀏覽量
122921 -
微處理器
+關(guān)注
關(guān)注
11文章
2359瀏覽量
83667 -
C2000
+關(guān)注
關(guān)注
5文章
207瀏覽量
41016
發(fā)布評(píng)論請(qǐng)先 登錄
TI C2000系列重大更新!首次加入NPU,內(nèi)核升級(jí)到64位!

C2000浮點(diǎn)運(yùn)算CPU和CLA計(jì)算差異的解決
關(guān)于“#17003-D warning”的解決方案
C2000官方學(xué)習(xí)課件
C2000微處理器手冊(cè)
TI C2000 CLA 常見(jiàn)問(wèn)題解答(FAQ)集錦

C2000入門(mén):C2000的復(fù)位系統(tǒng)介紹
C2000系列有關(guān)CLA的常見(jiàn)問(wèn)題專(zhuān)業(yè)解答
C2000 CLA的使用與常見(jiàn)CLA內(nèi)存問(wèn)題及解決方案

C2000浮點(diǎn)運(yùn)算注意事項(xiàng)之CPU和CLA的差異及誤差處理技巧
HW2000B應(yīng)用注意事項(xiàng)

新一代C2000產(chǎn)品用DC 事件做PWM動(dòng)作和保護(hù)的注意事項(xiàng)

C2000 CLA的使用與常見(jiàn)CLA內(nèi)存問(wèn)題的解決方案

C2000 CLA的使用與常見(jiàn)CLA內(nèi)存問(wèn)題的解決方案

C2000 CPU內(nèi)存內(nèi)置自檢功能

評(píng)論