RM新时代网站-首页

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

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

嵌入式開發(fā)極致性能優(yōu)化案例

嵌入式USB開發(fā) ? 來源:嵌入式USB開發(fā) ? 作者:嵌入式USB開發(fā) ? 2023-06-08 11:06 ? 次閱讀

本文轉(zhuǎn)自公眾號,歡迎關(guān)注

嵌入式開發(fā)極致性能優(yōu)化案例

前言

我們之前進(jìn)行了TFT刷屏測試確認(rèn)了基本功能。刷屏速度是決定GUI顯示幀率最根本的一環(huán),只有優(yōu)化到極致的刷屏速度,才能有基礎(chǔ)實現(xiàn)更好效果的GUI。本篇就進(jìn)行刷屏的優(yōu)化,其實其思想是通用的,對于其他代碼也可以參考。

1. 減少if條件判斷

if等條件判斷會導(dǎo)致分支處理,一方面會增加指令,尤其是跳轉(zhuǎn)指令一般執(zhí)行時間比一般指令長,另外也會影響流水線和cache。

if(Data&0x80)


  LCD_SDA_SET; //輸出數(shù)據(jù)


else LCD_SDA_CLR;

改為串行操作

#define LCD_SDA_SET_VAL(val) LCD_CTRLB- >BSRR=val;LCD_CTRLB- >BRR=val^LCD_SDA

2. 使用寄存器變量

頻繁操作的局部變量盡量使用寄存器進(jìn)行緩存,避免反復(fù)從內(nèi)存去加載,寄存器直接操作速度快很多。

register unsigned int data;

3. 空間換時間 8次for循環(huán)改為 直接8次操作

其實在memcpy等處理中也是類似操作,比如連續(xù)8次讀寫組合一起,再循環(huán)。以減少for判斷次數(shù),也利于內(nèi)部cache流水線處理,有一些cpu還有burst處理,這也是有利的。

inline void SPI_WriteDataF(unsigned char Data)


{


#if 0


unsigned char i=0;


for(i=8;i >0;i--)


{


if(Data&0x80)


  LCD_SDA_SET; //輸出數(shù)據(jù)


else LCD_SDA_CLR;





LCD_SCL_CLR;       


LCD_SCL_SET;


Data< <=1;


}


#else


//LCD_SDA_LOCK;


register unsigned int data = (Data & 0x80) < < 0;


LCD_SDA_SET_VAL(data);


LCD_SCL_CLR;       


LCD_SCL_SET;




data = (Data & 0x40) < < 1;


LCD_SDA_SET_VAL(data);


LCD_SCL_CLR;       


LCD_SCL_SET;




data = (Data & 0x20) < < 2;


LCD_SDA_SET_VAL(data);


LCD_SCL_CLR;       


LCD_SCL_SET;




data = (Data & 0x10) < < 3;


LCD_SDA_SET_VAL(data);


LCD_SCL_CLR;       


LCD_SCL_SET;




data = (Data & 0x08) < < 4;


LCD_SDA_SET_VAL(data);


LCD_SCL_CLR;       


LCD_SCL_SET;




data = (Data & 0x04) < < 5;


LCD_SDA_SET_VAL(data);


LCD_SCL_CLR;       


LCD_SCL_SET;




data = (Data & 0x02) < < 6;


LCD_SDA_SET_VAL(data);


LCD_SCL_CLR;       


LCD_SCL_SET;




data = (Data & 0x01) < < 7;


LCD_SDA_SET_VAL(data);


LCD_SCL_CLR;       


LCD_SCL_SET;


//LCD_SDA_UNLOCK;


#endif


}

4. 使用內(nèi)聯(lián)函數(shù)減少函數(shù)跳轉(zhuǎn)時間

inline void SPI_WriteDataF(unsigned char Data)

函數(shù)跳轉(zhuǎn)需要時間,減少函數(shù)調(diào)用即可節(jié)約時間,尤其頻繁調(diào)用的函數(shù)效果明顯,但是可能增加存儲空間。

5. 減少for循環(huán)嵌套 雙重for嵌套改為一層for

For嵌套導(dǎo)致多重循環(huán)嵌套判斷,浪費時間,順序執(zhí)行一般是優(yōu)于分支處理的。

void Lcd_ClearF(unsigned int Color) //刷新全屏           
{


unsigned int i,m;


Lcd_SetRegion(0,0,X_MAX_PIXEL-1,Y_MAX_PIXEL-1);


Lcd_WriteIndex(0x2C);


for(i=0;i< X_MAX_PIXEL*Y_MAX_PIXEL;i++)


{


 LCD_CS_CLR;


 LCD_RS_SET;


 SPI_WriteDataF(Color >>8); //寫入高8位數(shù)據(jù)


 SPI_WriteDataF(Color); //寫入低8位數(shù)據(jù)


 LCD_CS_SET;


 }


}

6. 減少函數(shù)調(diào)用層級

函數(shù)調(diào)用影響流水線,并且需要額外的上下文處理時間

Lcd_ClearF中直接調(diào)用SPI_WriteDataF不再調(diào)用函數(shù)LCD_WriteData_16Bit

7. 使用匯編進(jìn)行優(yōu)化

這個實際看情況建議先用其他方式進(jìn)行優(yōu)化,因為人工編寫匯編代碼不一定比編譯器編寫的好,除非非常熟悉匯編并且有明確的優(yōu)化方向。

8. 速度測試

循環(huán)刷屏使用定時器記錄執(zhí)行多次刷屏的時間,代碼見附件。

9. 編譯器速度優(yōu)化選項

編譯器-Ofast優(yōu)化

圖片

執(zhí)行時間分別是

660ms,782ms

我們優(yōu)化后的代碼快15.6%

編譯器-O2優(yōu)化

圖片

執(zhí)行時間分別是661ms,908ms

我們優(yōu)化后的代碼快快27.2%

  • 從上可以看出不管用什么編譯器優(yōu)化,經(jīng)過上面方式人工優(yōu)化后的代碼都不差不多,660和661,說明編譯器已經(jīng)無法對我們優(yōu)化后的代碼再進(jìn)行優(yōu)化
  • 說明我們?nèi)斯?yōu)化的代碼不使用編譯器優(yōu)化也有很好的速度性能。
  • 不同的編譯器優(yōu)化對原來的代碼影響較大-ofast執(zhí)行時間從908變?yōu)榱?82。
  • 哪怕是采用-ofsat編譯器優(yōu)化,我們?nèi)斯?yōu)化的代碼依然還有比編譯器優(yōu)化的代碼快15.6%,所以編譯器優(yōu)化無法替代人工優(yōu)化。
  • 只有從設(shè)計角度去優(yōu)化,避免依賴編譯器優(yōu)化才是根本方案。

總結(jié)

1.優(yōu)化應(yīng)該從設(shè)計上去優(yōu)化而不是依賴編譯器,應(yīng)該先找大頭,優(yōu)先設(shè)計原理,算法上去優(yōu)化,最后采取進(jìn)行匯編等底層的優(yōu)化,后者成本大效果不明顯不具備可移植性等,前者成本小效果明顯,不依賴于編譯器。

2.建議寄存器名字和手冊對應(yīng)比如gpio的io鎖定寄存器,頭文件中是LOCK 手冊里是LCKR

2.對于IO操作最好設(shè)置LOCK ODR寄存器,這樣可以指定bit直接寫值而其他位不修改,而不需要if else判斷分別配置BRR 和BSRR,可以直接操作ODR寄存器,進(jìn)一步優(yōu)化速度。

審核編輯:湯梓紅

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

    關(guān)注

    5082

    文章

    19104

    瀏覽量

    304791
  • 嵌入式開發(fā)
    +關(guān)注

    關(guān)注

    18

    文章

    1028

    瀏覽量

    47563
  • GUI
    GUI
    +關(guān)注

    關(guān)注

    3

    文章

    659

    瀏覽量

    39654
  • 性能優(yōu)化
    +關(guān)注

    關(guān)注

    0

    文章

    18

    瀏覽量

    7429
收藏 人收藏

    評論

    相關(guān)推薦

    嵌入式開發(fā)圣經(jīng)

    嵌入式系統(tǒng)開發(fā)圣經(jīng):嵌入式開發(fā)圣經(jīng)
    發(fā)表于 03-25 13:08 ?88次下載

    基于ARM的嵌入式開發(fā)

    基于ARM的嵌入式開發(fā):華清遠(yuǎn)見/孫天澤基于ARM的嵌入式開發(fā)內(nèi)容有:ARM簡介,基于ARM的嵌入式產(chǎn)品,ARM架構(gòu),基于ARM的嵌入式開發(fā)。
    發(fā)表于 10-04 08:49 ?83次下載

    嵌入式開發(fā)

    嵌入式開發(fā)就是指在嵌入式操作系統(tǒng)下進(jìn)行開發(fā),嵌入式Linux是以Linux為基礎(chǔ)的嵌入式作業(yè)系統(tǒng)。這里提供了
    發(fā)表于 12-20 13:21
    <b class='flag-5'>嵌入式開發(fā)</b>

    嵌入式開發(fā)之旅筆記

    嵌入式開發(fā)之旅筆記
    發(fā)表于 09-08 10:01 ?10次下載
    <b class='flag-5'>嵌入式開發(fā)</b>之旅筆記

    如何簡化嵌入式開發(fā)項目

    如何簡化嵌入式開發(fā)項目
    發(fā)表于 10-24 10:16 ?13次下載
    如何簡化<b class='flag-5'>嵌入式開發(fā)</b>項目

    關(guān)于嵌入式開發(fā)雜談

    關(guān)于嵌入式開發(fā)雜談
    發(fā)表于 10-31 15:39 ?8次下載
    關(guān)于<b class='flag-5'>嵌入式開發(fā)</b>雜談

    學(xué)嵌入式開發(fā)入門_學(xué)嵌入式開發(fā)需要看哪些書籍

    現(xiàn)在嵌入式開發(fā)越來越吃香,很多人都想要學(xué)習(xí)卻不知道要從何下手。本文分析了學(xué)習(xí)嵌入式軟件開發(fā)需要具備哪些基本知識和技能,開發(fā)學(xué)習(xí)的基本步驟,并給出了各種參考資料及網(wǎng)站,同時小編還推薦了學(xué)
    的頭像 發(fā)表于 04-04 10:25 ?2.5w次閱讀

    嵌入式開發(fā)好學(xué)嗎_嵌入式開發(fā)職業(yè)發(fā)展方向是什么

    本文首先來了解一下嵌入式前景及薪資待遇,其次解答了嵌入式開發(fā)好學(xué)不好學(xué)的問題,最后闡述了嵌入式開發(fā)必會知識以及嵌入式開發(fā)職業(yè)的四大發(fā)展方向,具體的跟隨小編一起來了解一下。
    的頭像 發(fā)表于 05-18 16:41 ?9165次閱讀

    嵌入式開發(fā)的產(chǎn)品有哪些_嵌入式開發(fā)的流程

    本文主要闡述了嵌入式開發(fā)的產(chǎn)品,其次介紹了嵌入式開發(fā)的流程。
    發(fā)表于 08-31 15:38 ?1.1w次閱讀

    嵌入式開發(fā)(一):嵌入式開發(fā)新手入門

    本篇文章整理下嵌入式開發(fā)中一些入門的基礎(chǔ)技能,都是根據(jù)以往的工程經(jīng)驗整理,適用于之前沒做過嵌入式開發(fā)的新手。嵌入式開發(fā)流程一般如下,一般是在PC機(jī)的Windows系統(tǒng)下安裝Ubuntu虛擬機(jī),搭建
    發(fā)表于 10-14 10:58 ?79次下載
    <b class='flag-5'>嵌入式開發(fā)</b>(一):<b class='flag-5'>嵌入式開發(fā)</b>新手入門

    嵌入式開發(fā)資料免費分享

    嵌入式開發(fā)資料免費分享嵌入式工程師經(jīng)驗分享:如何學(xué)習(xí)嵌入式開發(fā)截取文檔部分學(xué)習(xí)嵌入式工程師經(jīng)驗分享的資料分享給大家,文檔上從、嵌入式系統(tǒng)的概
    發(fā)表于 10-21 11:07 ?47次下載
    <b class='flag-5'>嵌入式開發(fā)</b>資料免費分享

    python做嵌入式開發(fā)_Python和嵌入式的區(qū)別是什么?可以做嵌入式開發(fā)嗎?

    從概念上來說,嵌入式和Python的區(qū)別還是比較明顯的,嵌入式是一個開發(fā)領(lǐng)域,而Python則是一門編程語言。下面就來和大家說一說嵌入式和Python這兩個之間的區(qū)別。
    發(fā)表于 11-02 20:21 ?14次下載
    python做<b class='flag-5'>嵌入式開發(fā)</b>_Python和<b class='flag-5'>嵌入式</b>的區(qū)別是什么?可以做<b class='flag-5'>嵌入式開發(fā)</b>嗎?

    嵌入式開發(fā)培訓(xùn)學(xué)什么?嵌入式開發(fā)板知識講解

    嵌入式開發(fā)就是指在嵌入式操作系統(tǒng)下進(jìn)行開發(fā),一般常用的系統(tǒng)有WinCE,ucos,vxworks,linux,android等。另外,用c,c++或匯編開發(fā);用高級處理器,arm7,a
    發(fā)表于 11-02 20:21 ?16次下載
    <b class='flag-5'>嵌入式開發(fā)</b>培訓(xùn)學(xué)什么?<b class='flag-5'>嵌入式開發(fā)</b>板知識講解

    嵌入式開發(fā)蜂鳴器代碼

    嵌入式開發(fā)蜂鳴器代碼
    發(fā)表于 03-29 17:04 ?3次下載

    【專欄精選】嵌入式開發(fā)極致性能優(yōu)化案例

    做電子發(fā)燒友技術(shù)探索官,分享你的原創(chuàng)電子行業(yè)文章! 本期為大家?guī)硪黄?b class='flag-5'>嵌入式開發(fā)性能優(yōu)化案例,感興趣的小伙伴可以關(guān)注作者一起學(xué)習(xí)哦~ 本期推 薦 專欄作者 : 嵌入式USB開發(fā) (點擊
    的頭像 發(fā)表于 06-13 08:15 ?635次閱讀
    RM新时代网站-首页