IT培训机构|91免费精品视频|专注编程培训|91免费精品|软件开发培训_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

發表評論
評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)
主站蜘蛛池模板: 球墨井盖厂家-铸铁井盖批发-雨水篦子生产厂家-安徽含山县林头新华铸造厂 | 全自动贴标机厂家-深圳市优斯迪自动贴标机官网 | 钕铁硼-强力磁铁-永磁铁「聚盛磁铁」10年定制加工生产厂家 | 七评-爱美儿信息科技有限公司〖官网〗? | 齐东汽车-提供抑尘车|洒水车|压缩垃圾车|餐厨垃圾车|垃圾转运车|清洗吸污车|扫路车价格,图片及视频 | 中科盛世酒窖 - 酒窖设计_酒窖工程_酒窖空调设备_恒温酒柜定制_私人别墅家庭酒窖_不锈钢红酒柜_实木雪茄柜 | 微机继电保护测试仪,单相继电保护测试仪,三相继电保护测试仪,六相继电保护测试仪,介质损耗测试仪,氧化锌避雷器测试仪,无线核相仪-扬州豪泰电力科技有限公司 | 新东方大学考试官网_考研/英语/雅思/托福/四六级/日语/韩语/教资在线网课官网 | 泰安兴润建材有限公司,泰安井盖定做,泰安警示桩定做,泰安雨水篦子定做,泰安操场篦子定做,泰安标志牌定做 | 深圳市佳顺优印印刷有限公司,佳顺优印,画册印刷,海报印刷,封套印刷,手提袋印刷,包装盒印刷,彩盒印刷,无碳纸印刷,不干胶印刷,信封印刷,便笺印刷,笔记本印刷,台历印刷,挂历印刷,国际会展中心附近印刷厂,宝安印刷厂,宝安教材印刷厂 | 液压尾管悬挂器,机械式尾管悬挂器价格,石油套管扶正器厂家,连续油管悬挂器,高压双塞水泥头,免钻塞注水泥分级箍,单塞套管水泥头价格,弹性套管扶正器,铸铝钢性扶正器,钢性套管扶正器厂家 | 抛丸机-通过式抛丸机-履带吊钩式抛丸机厂家-青岛泓霖智能设备公司 | 苏州不锈钢_江苏不锈钢_江苏不锈钢板_苏州模具钢_苏州合金钢_苏州特种合金_苏州不锈钢板_304不锈钢棒_苏州塞硒五金制品有限公司 苏州ERP定制|苏州CRM|苏州OA|苏州BPM|进销存管理系统-苏州中尚信息科技有限公司 | 消防栓保温罩,玻璃钢灭火器箱,玻璃钢消防沙箱-潍坊辰阳玻璃钢有限公司 | 上海浩斌信息科技有限公司RFID读写器,IC卡读卡器,手持机,数据采集终端,电力仓库管理软件开发,固定资产软件,纱管标签,试剂管理,RFID试剂柜,档案管理,档案柜,智能货架 | 网咖网址导航,网咖分类目录,网址目录,免费收录国内外、各行业优秀网站网站。 | 泊头市特种油泵阀制造有限公司&nbsp;-&nbsp;渣油泵,重油泵,沥青泵,高压齿轮泵,煤焦油泵,导热油泵,三螺杆泵,圆弧齿轮泵,不锈钢齿轮泵, | 三机一体除湿干燥机,色母机,称重式拌料机,工业冻水机,中央集中供料-东莞市瑞达机械科技有限公司(瑞达国际) | 无石棉纤维增强水泥板厂家_水泥纤维装饰板_河北埃尔佳建材科技有限公司 | 河北安润防腐管业股份有限公司-远程供液管路_远程供液_远程供液系统 | 液体灌装机-酱料灌装机-全自动灌装机-旋盖机-铝箔封口机-贴标机厂家-迈特威自动化设备(天津)有限公司" | 上海熙隆光电科技有限公司-半导体激光器,一字线激光器,光纤耦合激光器,拉曼激光器 | 廊坊保安公司_廊坊市万帮保安服务有限公司 | 破碎机设备-锤式颚式反击式圆锥移动冲击式破碎机厂家-成都大宏立机器公司 | 江苏成人高考网-江苏省成人高考报名 | 开关柜无线测温_电缆接头测温系统_六氟化硫sf6气体泄漏报警监测_卫星同步时钟-山东正瑞电子有限公司 | 自动隔油提升设备,消防稳压一体设备,苏州不锈钢消防水箱,污水提升设备厂家,无负压变频供水设备厂家-苏州脉泉供水设备有限公司 | 室内去除甲醛检测治理十大品牌_去除甲醛公司加盟-优吸环保科技有限公司集团总部官网 | 橡胶粉碎机_轮胎粉碎机_橡胶切条机_橡胶粉碎机价格_河南鑫世昌机械制造有限公司 | 液晶拼接屏_三星46寸/55寸/LG液晶拼接屏_深圳拼接墙厂家_电视大屏幕液晶拼接_高清工业级液晶监视器 | 潍坊志扬机械有限公司_扫地机-抓蔗机-履带运输机-自上料搅拌车 | 聚丙烯酰胺,聚合氯化铝,重金属捕捉剂,污泥调理剂,活性氧化铝,生石灰,反渗透阻垢剂,工业葡萄糖,硫酸铝,果壳活性炭,柱状活性炭,蜂窝活性炭,石英砂,锰砂-北京雁归来环保科技有限公司-以真诚为立足之本,以质量为生存之本,愿与海内外同仁共创双赢。雁归来人一路走来,气贯长虹,勇锐盖过怯弱,进取压倒苟安!我们紧扣时代脉搏,专注水处理、继往开来! | 拉力试验机|电子万能试验机|液压万能试验机|摩擦磨损试验机|济南试验机厂家-济南思达测试技术有限公司 | 深圳喜运达物流官网_东南亚物流|海运|专线|海外仓_泰国菲律宾马来西亚海运|物流专线|海外仓 | 水暖空调厂家|山东水暖空调厂家|泰安燃气壁挂炉-泰安市鸿雁科贸有限公司 | 七评-爱美儿信息科技有限公司〖官网〗?| 男装加盟,男装加盟店,男装代理,男装品牌加盟,品牌男装加盟-虎豹男装品牌加盟 | 医疗器械,理化实验室设备,微生物,培养基,一站式采购 - 杭州润泽仪器商城 | 立式加工中心_龙门加工中心_卧式加工中心-山东威达重工股份有限公司 | 指纹锁_智能锁_指纹密码锁_智能锁十大品牌_智能门锁厂家-深圳市豪力士智能科技有限公司 | 连云港物流,连云港物流公司就选连云港华美物流有限公司 |