色yeye在线视频观看_亚洲人亚洲精品成人网站_一级毛片免费播放_91精品一区二区中文字幕_一区二区三区日本视频_成人性生交大免费看

當前位置: > 華清遠見教育科技集團 > 嵌入式學習 > 講師博文 > ARM 浮點運算一
ARM 浮點運算一
時間:2016-12-14作者:華清遠見

很多時候我們要處理的數據,不僅僅是整數和字符串,還有浮點數即小數。在多媒體數據處理方面表現的更多。是不是所有的CPU都支持,浮點運算呢?答案:不是。

我們常常聽到贏浮點和軟浮點,這些到底說的是什么呢?下面我們就來一探究竟吧。在這里我們說的是ARM核浮點運算。

(1)硬浮點(hard-float)

編譯器將代碼直接編譯成硬件浮點協處理器(浮點運算單元FPU)能識別的指令,這些指令在執行的時候ARM核直接把它轉給協處理器執行。FPU 通常有一套額外的寄存器來完成浮點參數傳遞和運算。使用實際的硬件浮點運算單元(FPU)會帶來性能的提升。

(2)軟浮點(soft-float)

編譯器把浮點運算轉成浮點運算的函數調用和庫函數調用,沒有FPU的指令調用,也沒有浮點寄存器的參數傳遞。浮點參數的傳遞也是通過ARM寄存器或者堆棧完成。現在的Linux系統默認編譯選擇使用hard-float,如果系統沒有任何浮點處理器單元,這就會產生非法指令和異常。因而一般的系統鏡像都采用軟浮點以兼容沒有VFP的處理器。

用一句話總結,軟浮點是通過浮點庫去實現浮點運算的,效率低;硬浮點是通過浮點運算單元(FPU)來完成的,效率高。

一、使用浮點庫實現浮點運算(soft-float)

例如:我想實現兩個浮點數相加,代碼如下:

使用GNU ARM編譯器翻譯成的部分匯編代碼如下:

從圖中我們可以知道,默認情況下,編譯器使用的是軟浮點,圖中__aeabi_fadd這個函數是在浮點庫中實現。如果想讓代碼能正常的運行,還需要在連接的時候靜態連接一下浮點庫。

在這里我們以一個完成的案例來說明一下,軟浮點庫的使用方法。

start.S:
        .global _start
        #define USER_MODE 0x10
        _start:
        @設置CPU為user模式
        mov r0,#USER_MODE
        msr cpsr_c,r0
        @跳到main函數
        ldr sp,=0x34000
        bl main
        stop:
        b stop
        main.c:
        int main()
        {
                float f1,f2,f3;
                f1 = 1.24;
                f2 = 1.22;
                f3 = f1 + f2;
                return 0;
        }
        Makefile:
        LD=arm-none-eabi-ld
        OBJDUMP=arm-none-eabi-objdump
        RM=rm -rf
        CFLAG= -g -c
        ASFLAG=-g -c
        OBJ=start.o main.o
        LDFLAGS= -static -L\
        #指定浮點庫所在的路徑
        "C:\Program Files\yagarto\lib\gcc\arm-none-eabi\4.6.2" -lgcc
        #設置編譯模式
        %.o:%.S
        $(CC) $(ASFLAG) $< -o $@

        %.o:%.c
        $(CC) $(CFLAG) $< -o $@
        all:$(OBJ)
        $(LD) -Ttext=0x20000 $^ -o arm.elf $(LDFLAGS)
        $(OBJDUMP) -D arm.elf > arm.dis
        clean:
        $(RM) *.o arm.dis arm.elf

使用硬件浮點實現浮點運算(hard-float)

使用硬件浮點的時候,我們需要給編譯器傳遞一些參數,讓編譯器編譯出硬件浮點單元處理器能識別的指令。

(1)-mfpu=name

參數-mfpu就是用來指定要產生那種硬件浮點運算指令,常用的右vfp和neon等。

浮點協處理器指令:

ARM10 and ARM9:
        -mfpu=vfp(or vfpv1 or vfpv2)
        Cortex-A8:
        -mfpu=neon

(2) -mfloat-abi=value

-mfloat-abi=soft 使用這個參數時,其將調用軟浮點庫(softfloat lib)來支持對浮點的運算,GCC編譯器已經有這個庫了,一般在libgcc里面。這時根本不會使用任何浮點指令,而是采用常用的指令來模擬浮點運算。但使用的ARM芯片不支持硬浮點時,可以考慮使用這個參數。在使用這個參數時,連接時一般會出現下面的提示:

undefined reference to `__aeabi_fdiv'

或者類似的提示,主要因為一般情況下連接器沒有去主動尋找軟浮點庫,這時使用將libgcc庫加入即可。

-mfloat-abi=softfp

-mfloat-abi=hard

這兩個參數都用來產生硬浮點指令,至于產生哪里類型的硬浮點指令,需要由

-mfpu=xxx參數來指令。這兩個參數不同的地方是:

-mfloat-abi=softfp生成的代碼采用兼容軟浮點調用接口(即使用-mfloat-abi=soft時的調用接口),這樣帶來的好處是:兼容性和靈活性。庫可以采用-mfloat-abi=soft編譯,而關鍵的應用程序可以采用-mfloat-abi=softfp來編譯。特別是在庫由第三方發布的情況下。

-mfloat-abi=hard生成的代碼采用硬浮點(FPU)調用接口。這樣要求所有庫和應用程序必須采用這同一個參數來編譯,否則連接時會出現接口不兼容錯誤。

我們對main.c文件使用硬件浮點重新編譯:

翻譯成的匯編代碼如下:

start.s:
        .global _start
        #define USER_MODE 0x10
        _start:
        @ 設置為所有模式都可以訪問協處理器,cortex-A8手冊 3.2.27
        mov r0, #0xfffffff
        mcr p15, 0, r0, c1, c0, 2
        @ 使能NEON and VFP協處理器,NEON and VFP enable bit.
        @ 設置fpexc的30位為1去使能NEON and VFP,cortex-A8 手冊 13.4.3
        ldr r0, =1<<30
        fmxr fpexc, r0
        @設置CPU為user模式
        mov r0,#USER_MODE
        msr cpsr_c,r0
        @跳到main函數
        ldr sp,=0x34000
        bl main
        stop:
        b stop
        main.c:
        int main()
        {
  nbsp;              float f1,f2,f3;
                f1 = 1.24;
                f2 = 1.22;
                f3 = f1 + f2;
                return 0;
        }
        Makefile:
        CC=arm-none-eabi-gcc
        AS=arm-none-eabi-as
        LD=arm-none-eabi-ld
        OBJDUMP=arm-none-eabi-objdump
        RM=rm -rf
        CFLAG=-g -c -mfpu=neon -mfloat-abi=softfp
        ASFLAG=-g -c -mfpu=neon -mfloat-abi=softfp
        OBJ=start.o main.o
        #設置編譯模式
        %.o:%.S
        $(CC) $(ASFLAG) $< -o $@
        %.o:%.c
        $(CC) $(CFLAG) $< -o $@
        all:$(OBJ)
        $(LD) -Ttext=0x20000 $^ -o arm.elf
        $(OBJDUMP) -D arm.elf > arm.dis
        clean:
        $(RM) *.o arm.dis arm.elf

發表評論
評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)
主站蜘蛛池模板: 成年女人喷潮毛片免费播放 | 九九热re日本精品 | 欧美大胆性生话 | aV性色在线乱叫 | 欧美乱熟人妻色情影视 | 亚洲AV综合色一区二区三区 | 久久久亚洲AV波多野结衣 | 国精产品一品二品国精品69XX | 日本免费一区二区三区在线播放 | 欧洲洲一区二区精华液 | 色综合久久中文综合网 | 久久久久久成人毛片免费看 | 好紧好湿太硬了我太爽了 | 国产莉萝无码AV在线播放 | 成人看片黄A免费看那个网址 | 日本国产在线专区 | 亚洲精品国产第一区第二区 | 丰满少妇被猛烈进入流水 | 国产成人精品综合久久久久 | 成人免费无码大片a毛片抽搐 | 拔插拔插8X8X海外华人免费视频 | 中国老太老妇xx对白 | 熟妇人妻无码中文字幕 | 大屁股熟女白浆一区二区 | 色偷偷人人澡人人添老妇人 | 免费观看钙片入口网站 | 高清一区二区欧美色视频 | 日本日本熟妇中文在线视频 | 日本二区在线 | 免费无码又爽又刺激a片 | 亚洲卡通欧美制服中文 | 亚洲精品成a人在线观看☆ 国产AV国片偷人妻麻豆郑州公司 | 无码人妻精品一二三区免费 | 在线看麻豆 | 红桃TV.欧美国产 | 欧美日韩精品在线免费观看 | 狼友AV永久网站 | 国产又粗又猛又大爽又黄 | 9草在线| 亚洲国产国语自产精品 | 男人大臿蕉香蕉大视频 |