0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

在i.MX RT飛行學習板中的軟件優(yōu)化辦法,讓C代碼在ARM Cortex-M7內核上極速飛奔

UtFs_Zlgmcu7890 ? 來源:未知 ? 作者:李倩 ? 2018-11-07 09:25 ? 次閱讀

牡丹雖好,仍需綠葉扶持;RT雖快,仍需優(yōu)化。本文將分享在i.MX RT飛行學習板中的軟件優(yōu)化辦法,讓C代碼在ARM Cortex-M7內核上極速飛奔!01

概述

i.MX RT飛行學習板,是真的會飛的處理器學習板!它的核心是恩智浦公司的跨界處理器i.MX RT1052, 基于ARM Cortex-M7內核,主頻達600 MHz!對于電機驅動,雖然速度驚人,但是這個學習板要同時運行“4無刷電機FOC驅動 + 飛控算法”,所以依然不是輕易的事情。

牡丹雖好,仍需綠葉扶持,下面將分享多種優(yōu)化手段,讓C代碼在i.MX RT上極速飛奔,實現(xiàn)這個“單芯片無人機”。先上段熱身視頻。

視頻1 熱身視頻

02

加快代碼速度的秘訣

1、選擇硬件浮點

重要而簡單的第一步是:在編譯器中選擇“硬件雙精度浮點”,圖1是在KEIL中的選擇配置。

圖1 雙精度浮點

選擇“硬件雙精度浮點”的作用是,當C代碼需要雙精度、單精度浮點運算,編譯器就選擇最優(yōu)的浮點指令,速度最快!如果選擇“硬件單精度浮點”,單精度浮點運算就用單精度浮點指令,但雙精度浮點運算只能結合多條單精度指令完成,速度較慢。如果不選擇任何硬件浮點,編譯器僅能用定點指令完成浮點運算,速度非常慢。

但要注意,不是任意處理器都支持“硬件浮點”,即便同樣是ARM Cortex-M7內核,有些半導體廠家為了降低成本,會裁掉“雙精度浮點”單元,只留下“單精度浮點”。而i.MX RT支持完整的單、雙精度浮點單元。得益于這個優(yōu)勢,飛行學習板中的ZLG-Soar飛控軟件,全部核心代碼都使用雙精度浮點指令,不單止精度高、而且速度超快,在相同主頻下,比定點指令的Cortex-M3快20倍以上!

2、關鍵代碼RAM中運行

將代碼放在ITCM相連的RAM中運行,速度最快!

Cortex-M7的中ITCM(Instruction-Tightly Coupled Memories)是專門的指令總線。我們在i.MX RT1052中分配了256Kbytes的內部RAM在ITCM上,而且和Flash相比,內部RAM沒有明顯的讀取延時,所以代碼在這段RAM中運行,速度是最快的,沒有更快!

程序清單1是飛行學習板在KEIL中的分散加載的配置,全部只讀RO數(shù)據(jù)(即代碼和CONST變量等)放在0x00000400地址開始的ITCM RAM里面。KEIL編譯后,其實全部原始數(shù)據(jù)都是存在Flash中,但 KEIL自動在main函數(shù)前插入一段Flash函數(shù),該函數(shù)將相關的代碼從Flash復制到RAM,最后將PC指針改到RAM。這樣代碼就從RAM開始運行。

程序清單1 ITCM RAM分散加載

如果代碼很大,無法全部復制到RAM中運行,那么可以修改分散加載,僅將必要的代碼放在RAM中運行,其他代碼在Flash中運行。

3、關鍵算法寫成宏定義

在ZLG-FOC電機矢量控制庫中,全部核心算法都寫成宏定義的形式,如程序清單2的Clarke變換。

程序清單2 宏定義算法

如果寫成C函數(shù),那么上層代碼調用時,一般先進行入棧操作、保護現(xiàn)場,接著跳轉到該函數(shù)運行,然后調用返回指令回到上層代碼,最后進行出棧操作、恢復現(xiàn)場。這個過程必然會延長爭分奪秒的算法執(zhí)行時間。

可能有的人會說:在函數(shù)前面聲明inline,函數(shù)不就直接嵌入到上層代碼中,省去這些啰嗦過程嗎?其實不一定,編譯器也是很無奈的,KEIL和IAR的編譯手冊都說得很明白:根據(jù)代碼調用與被調用的復雜程度,能嵌進去的,編譯器就幫忙嵌進去,不能嵌進去的,只能按普通函數(shù)那樣處理!

但如果將算法寫成宏定義,那么編譯會100%保證代碼會被直接嵌入到上層代碼中!只是對于過長的代碼,宏定義編寫不方便,這時候可以將代碼分拆成多個宏定義組合使用,或者僅把最必要的部分寫成宏定義。

4、盡量用C,少用匯編

盡量用C,少用匯編?晚上加班眼花,寫反了吧?沒寫錯,“匯編比C快”是好多年前、奔騰電腦時代的事情!現(xiàn)在是人工智能、大數(shù)據(jù)的時代,KEIL和IAR 的C編譯器經(jīng)過幾十年的發(fā)展,都變得非常聰明了(GCC筆者使用不多,不敢莽加評論)。首先,人腦能想到的最優(yōu)指令,C編譯器很多時候也能想到,可能比人腦想得更優(yōu)!再者,用匯編寫代碼,即便絞盡腦汁,頂多就單個函數(shù)速度最優(yōu),僅此而已!而C編譯器還會“綜合統(tǒng)籌”,例如,前后重復的代碼,它會合拼在一起;廢話、沒用的代碼,它會刪除;函數(shù)反復跳轉時的出入棧過程,它會想辦法減少……再配合上面提到的“算法寫成宏定義”,C代碼的運行速度將更快!

就如我們敬愛的周工教導說:豬腦不如人腦、人腦不如電腦,i.MX RT在極速飛奔下就是很好的體現(xiàn)。

5、巧妙浮點出入棧

圖2顯示了Cortex-M7的浮點寄存器,S0-S31是浮點的通用寄存器,其他是控制或狀態(tài)等寄存器。如果軟件使能了浮點單元,那么在中斷發(fā)生后,M7默認會將S0-S15、FPSCR等17個浮點寄存器硬件入棧,中斷完成后硬件出棧。雖然說是“硬件”,其實硬件也要花時間一個一個寄存器弄的,只不過比軟件處理,省了調用指令的時間。

圖2 Cortex-M7浮點寄存器

這里提出一個問題:假如有10個中斷程序輪流產(chǎn)生,處理器就自動對17個浮點寄存器出入棧操作,但如果僅只有一個中斷使用了浮點指令,其他9個都不使用,那么大部分浮點出入棧的操作都是浪費時間的!

如何解決這個問題呢?

ARM提出一種LAZY模式(其實一點都不懶),在中斷發(fā)生后,硬件只給17個浮點寄存器預留堆??臻g,但不入棧,只有中斷函數(shù)調用了第一條浮點指令前(例如浮點加、減、乘、除),硬件才補充入棧;中斷完成后,如果真的發(fā)生過硬件浮點入棧,才會相應地出棧。這樣大大提高了浮點出入棧的效率!這種LAZY模式夠聰明吧,真不知ARM怎樣起名的,可能懶的極端就是聰明吧。

6、代碼清晰、聰明

圖3中的兩條蛇在樹上互相糾纏,分不清尾巴是誰的。寫代碼也同樣道理,如果習慣性地想到一點寫一點、寫前不規(guī)劃、寫后懶修改,就像圖3左邊的代碼,一堆if/else,邏輯模糊、難懂、難改,運行速度沒保證。而右邊的代碼是經(jīng)過分析推理的聰明辦法,用switch case替代一堆if/else,邏輯清晰、易懂、易改,運行速度有保證!

圖3 清晰聰明的代碼

前面介紹了很多在i.MX RT上加快代碼速度的方法,但都是輔助的,最核心的還是:花點心思規(guī)劃代碼要怎樣寫,代碼要清晰、聰明。

03

總結

牡丹雖好,仍需綠葉扶持,RT雖快,但仍需優(yōu)化才能發(fā)揮到極致的速度,將不可能的事情變?yōu)楝F(xiàn)實!就如我們ZLG的i.MX RT飛行學習板,是業(yè)界唯一的“4無刷電機FOC +飛控算法”的無人機方案。

11月初期的廣州還是茵茵綠草,我們踏青放飛去。

視頻2 踏青放飛

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 處理器
    +關注

    關注

    68

    文章

    19038

    瀏覽量

    228465
  • 編譯器
    +關注

    關注

    1

    文章

    1608

    瀏覽量

    48979
  • C代碼
    +關注

    關注

    1

    文章

    89

    瀏覽量

    14258

原文標題:i.MX RT飛行學習板——如何讓C代碼在M7上極速飛奔?

文章出處:【微信號:Zlgmcu7890,微信公眾號:周立功單片機】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    深入淺出Cortex-M7——i.MX RT1050

    深入淺出Cortex-M7——i.MX RT1050
    發(fā)表于 03-06 08:39

    初識Layerscape和I.MX系列處理器

    視頻會議、可視門鈴、圖像分析、機器視覺檢查、語音助手等。圖2 EdgeScale軟件框架說起輕量型的網(wǎng)關,不得不提的還有是跨界處理器i.MX RT 10501060系列?;?b class='flag-5'>Cortex-M7
    發(fā)表于 12-10 18:14

    【大聯(lián)大品佳 NXP i.MX RT1050試用體驗】芯林至尊,寶刀RT1050,初識i.MX RT系列跨界處理器 (之一)

    ,它們通常采用ARMCortex-M 系列內核,相對來說該內核對中斷響應更快,所以具有良好的實時性,但其芯片架構特別是集成片內閃存帶來了生產(chǎn)技術限制和成本負擔,從而限制了其性能。
    發(fā)表于 08-19 11:44

    i.MX RT處理器系列

    我對i.MX RT處理器系列很感興趣,因為它是機器學習研究項目中有吸引力的解決方案。機器學習需要大量的計算能力,而且由于i.MX
    發(fā)表于 07-22 07:53

    Cortex-M7 + M4內核的MCU資料大合集

    在前不久,恩智浦推出了Cortex-M7 + M4內核的MCU(i.MX RT1170),主頻高達1GHz,打破MCU低頻的傳統(tǒng)。今天,我們
    發(fā)表于 11-03 08:05

    Cortex-M7 + M4內核的MCU性能及特點是什么

    恩智浦推出了Cortex-M7 + M4內核的MCU(i.MX RT1170),主頻高達1GHz,打破MCU低頻的傳統(tǒng)。今天,我們來了解一下
    發(fā)表于 11-03 09:10

    ZLG攜手NXP舉行i.MX RT 跨界處理器全國巡回研討會

    2018年3月20號—4月3號,ZLG將攜手NXP全國6大城市(廣州、深圳、上海、杭州、南京、北京)舉辦i.MX RT 跨界處理器全國巡回研討會,屆時將為您呈現(xiàn)NXP最新推出的i.MX
    的頭像 發(fā)表于 03-09 15:24 ?6082次閱讀

    高達600MHz主頻的Cortex-M7 MCU

    一顆強力的大腦是系統(tǒng)的靈魂,i.MX RT系列高實時微處理器,集成Cortex-M7內核,最高600MHz主頻。
    的頭像 發(fā)表于 03-17 10:53 ?1.9w次閱讀
    高達600MHz主頻的<b class='flag-5'>Cortex-M7</b> MCU

    基于i.MX RT1061處理器的OK1061-S開發(fā)介紹

    OK1061-S開發(fā)采用“底板+核心”結構設計,搭載NXP公司 i.MX RT1061跨界處理器,ARM
    的頭像 發(fā)表于 11-21 09:30 ?1.1w次閱讀
    基于<b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>1061處理器的OK1061-S開發(fā)<b class='flag-5'>板</b>介紹

    支持高級語音命令和人臉識別應用的NXP i.MX RT106L和RT106F處理器

    NXP Semiconductors的i.MX RT106L和i.MX RT106F跨界處理器是兩款專門針對特定解決方案設計的EdgeReady器件,搭載
    的頭像 發(fā)表于 05-29 15:18 ?4369次閱讀

    恩智浦i.MX RT1170開創(chuàng)GHz MCU時代

    的運算能力和多媒體功能與易用性和實時處理相結合。i.MX RT1170雙核MCU集成主頻高達1 GHz的Arm Cortex -M7
    的頭像 發(fā)表于 03-22 11:14 ?3386次閱讀

    恩智浦i.MX RT1170將該系列帶上了更高的層面

    的運算能力和多媒體功能與易用性和實時處理相結合。i.MX RT1170雙核MCU集成主頻高達1 GHz的Arm Cortex -M7
    的頭像 發(fā)表于 05-18 11:15 ?3686次閱讀

    恩智浦推出核跨界MCU的第二款產(chǎn)品i.MX RT1160

    作為雙核i.MX RT的第二個產(chǎn)品系列,i.MX RT1160系列跨界MCU集成主頻600MHz的Arm
    的頭像 發(fā)表于 06-22 16:32 ?3232次閱讀

    NXP推出基于i.MX RT117H的智能人機界面解決方案

    i.MX RT117H屬于RT1170系列 (Arm Cortex-M7 1GHz,Cortex-M
    發(fā)表于 11-29 12:33 ?1062次閱讀

    基于 NXP i.MX RT1050 的 3D 打印機方案

    MCU-Healer 是基于 NXP i.MX RT1050 做的 3D 打印機方案,該方案主控 MCU i.MX RT1050是一顆 Cortex
    的頭像 發(fā)表于 04-06 15:06 ?1046次閱讀
    基于 NXP <b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>1050 的 3D 打印機方案