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

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

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

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

電子發(fā)燒友論壇 ? 來(lái)源:未知 ? 2023-06-13 08:15 ? 次閱讀

電子發(fā)燒友技術(shù)探索官,分享你的原創(chuàng)電子行業(yè)文章!

本期為大家?guī)?lái)一篇嵌入式開發(fā)性能優(yōu)化案例,感興趣的小伙伴可以關(guān)注作者一起學(xué)習(xí)哦~

本期推

專欄作者嵌入式USB開發(fā)(點(diǎn)擊查看作者主頁(yè))

介紹:本專欄介紹嵌入式USB開發(fā),理論結(jié)合實(shí)踐,不單純講USB協(xié)議,而是以具體的實(shí)例進(jìn)行講解。

前言

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

1.減少if條件判斷

if等條件判斷會(huì)導(dǎo)致分支處理,一方面會(huì)增加指令,尤其是跳轉(zhuǎn)指令一般執(zhí)行時(shí)間比一般指令長(zhǎng),另外也會(huì)影響流水線和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.空間換時(shí)間 8次for循環(huán)改為 直接8次操作

其實(shí)在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)時(shí)間

inline void SPI_WriteDataF(unsigned char Data)

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


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

For嵌套導(dǎo)致多重循環(huán)嵌套判斷,浪費(fèi)時(shí)間,順序執(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


{


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)用層級(jí)

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

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


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

這個(gè)實(shí)際看情況建議先用其他方式進(jìn)行優(yōu)化,因?yàn)槿斯ぞ帉憛R編代碼不一定比編譯器編寫的好,除非非常熟悉匯編并且有明確的優(yōu)化方向。


8.速度測(cè)試

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


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

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



執(zhí)行時(shí)間分別是

660ms,782ms

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

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


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

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


-從上可以看出不管用什么編譯器優(yōu)化,經(jīng)過上面方式人工優(yōu)化后的代碼都不差不多,660661,說明編譯器已經(jīng)無(wú)法對(duì)我們優(yōu)化后的代碼再進(jìn)行優(yōu)化

- 說明我們?nèi)斯?yōu)化的代碼不使用編譯器優(yōu)化也有很好的速度性能。

-不同的編譯器優(yōu)化對(duì)原來(lái)的代碼影響較大-ofast執(zhí)行時(shí)間從908變?yōu)榱?82。

-哪怕是采用-ofsat編譯器優(yōu)化,我們?nèi)斯?yōu)化的代碼依然還有比編譯器優(yōu)化的代碼快15.6%,所以編譯器優(yōu)化無(wú)法替代人工優(yōu)化。

-只有從設(shè)計(jì)角度去優(yōu)化,避免依賴編譯器優(yōu)化才是根本方案。

總結(jié)

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

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

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


原文地址:http://ttokpm.com/d/2101849.html


版權(quán)說明:

本內(nèi)容為作者發(fā)布至電子發(fā)燒友平臺(tái)原創(chuàng)文章,相關(guān)創(chuàng)作版權(quán)歸原作者所有,如未經(jīng)作者授權(quán),禁止轉(zhuǎn)載!





聲明本文由電子發(fā)燒友社區(qū)發(fā)布,轉(zhuǎn)載請(qǐng)注明以上來(lái)源。如需社區(qū)合作及入群交流,請(qǐng)?zhí)砑游⑿臙EFans0806,或者發(fā)郵箱liuyong@huaqiu.com。


更多熱點(diǎn)文章閱讀

  • 采用先進(jìn)成熟工藝和自主產(chǎn)權(quán)體系結(jié)構(gòu),紫光同創(chuàng)FPGA開發(fā)板入門指導(dǎo)

  • 嵌入式Linux開發(fā)秘籍!工程師大佬親歷分享項(xiàng)目樣例

  • RK3568!四核64位ARMv8.2A架構(gòu),匯聚編譯源碼及實(shí)戰(zhàn)樣例

  • 尺寸僅有21mm*51mm,板邊采用郵票孔設(shè)計(jì),合宙 Air105 核心板開發(fā)總結(jié)

  • 基于Cortex-M3內(nèi)核的32位微控制器,STM32項(xiàng)目實(shí)戰(zhàn)分享!


原文標(biāo)題:【專欄精選】嵌入式開發(fā)極致性能優(yōu)化案例

文章出處:【微信公眾號(hào):電子發(fā)燒友論壇】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

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

原文標(biāo)題:【專欄精選】嵌入式開發(fā)極致性能優(yōu)化案例

文章出處:【微信號(hào):gh_9b9470648b3c,微信公眾號(hào):電子發(fā)燒友論壇】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    零基礎(chǔ)嵌入式開發(fā)學(xué)習(xí)路線

    嵌入式開發(fā)”沒有接觸過的同學(xué)可能會(huì)不明覺厲,但是只要你了解了,感興趣并且有一個(gè)正確的學(xué)習(xí)路線的話,零基礎(chǔ)也能入門。給大家介紹一個(gè)簡(jiǎn)單易懂的學(xué)習(xí)路線,讓你能夠從零開始學(xué)習(xí)嵌入式開發(fā)。 第一步:掌握
    發(fā)表于 10-25 15:55

    嵌入式開發(fā)常見問題排查

    嵌入式開發(fā)問題排查很多人認(rèn)為嵌入式開發(fā)很難,主要是因?yàn)樵谶@個(gè)過程中常常會(huì)遇到各式各樣的問題。這些問題的復(fù)雜性和多樣性使得許多人感到困惑和無(wú)所適從。然而,如果將這些問題逐一拆解,實(shí)際上大部分都可以
    的頭像 發(fā)表于 09-22 08:04 ?240次閱讀
    <b class='flag-5'>嵌入式開發(fā)</b>常見問題排查

    聚焦嵌入式開發(fā)中的合規(guī)性工具、項(xiàng)目管理工具、版本迭代工具應(yīng)用

    日前,龍智攜嵌入式開發(fā)及管理解決方案亮相2024上海國(guó)際嵌入式展(embedded world China 2024)。展會(huì)期間,我們對(duì)話了多位龍智資深DevSecOps顧問及技術(shù)支持專家
    的頭像 發(fā)表于 07-29 15:15 ?434次閱讀

    嵌入式開發(fā)前景怎么樣?

    嵌入式開發(fā)前景非常廣闊,這主要得益于物聯(lián)網(wǎng)、人工智能、大數(shù)據(jù)等技術(shù)的快速發(fā)展,以及嵌入式系統(tǒng)在各個(gè)領(lǐng)域的廣泛應(yīng)用。以下是對(duì)嵌入式開發(fā)前景的詳細(xì)分析
    的頭像 發(fā)表于 07-10 09:00 ?2352次閱讀
    <b class='flag-5'>嵌入式開發(fā)</b>前景怎么樣?

    嵌入式開發(fā)就業(yè)前景怎么樣?

    和醫(yī)療器械使用經(jīng)驗(yàn)。 3)工業(yè)控制 工業(yè)控制是指通過各種控制設(shè)備和系統(tǒng),對(duì)工業(yè)生產(chǎn)過程進(jìn)行監(jiān)測(cè)、控制和優(yōu)化。隨著工業(yè)自動(dòng)化和智能化的發(fā)展,工業(yè)控制領(lǐng)域?qū)?b class='flag-5'>嵌入式開發(fā)的需求也在不斷增加。在工業(yè)控制領(lǐng)域
    發(fā)表于 06-07 14:51

    ARM Cortex-A53嵌入式開發(fā)平臺(tái)Android手冊(cè)

    電子發(fā)燒友網(wǎng)站提供《ARM Cortex-A53嵌入式開發(fā)平臺(tái)Android手冊(cè).pdf》資料免費(fèi)下載
    發(fā)表于 04-28 15:10 ?0次下載

    fpga是嵌入式開發(fā)

    FPGA(現(xiàn)場(chǎng)可編程門陣列)與嵌入式開發(fā)之間確實(shí)存在一定的關(guān)聯(lián),但它們?cè)诒举|(zhì)上是兩個(gè)不同的領(lǐng)域。
    的頭像 發(fā)表于 03-15 14:18 ?941次閱讀

    嵌入式開發(fā)常見的C語(yǔ)言技巧與方法分享

    嵌入式開發(fā)中,常常要操作寄存器,對(duì)寄存器進(jìn)行寫入,讀出等等操作。每個(gè)寄存器都有自己固有的地址,通過C語(yǔ)言訪問這些地址就變得尤為重要。
    的頭像 發(fā)表于 12-26 09:55 ?1029次閱讀

    嵌入式開發(fā)學(xué)習(xí)的十三法則分享

    嵌入式開發(fā)學(xué)習(xí)是一個(gè)不斷積累和總結(jié)的過程,來(lái)自一個(gè)嵌入式開發(fā)高級(jí)工程師為我們總結(jié)的關(guān)于嵌入式開發(fā)學(xué)習(xí)的十三法則,大家不妨參考一下: 一、冗余度法則 在嵌入式系統(tǒng)具有足夠的冗余度
    發(fā)表于 12-21 06:32

    嵌入式開發(fā)為什么需要輸出調(diào)試信息?

    嵌入式開發(fā)為什么需要輸出調(diào)試信息? 因?yàn)檩敵稣{(diào)試信息是嵌入式開發(fā)中一項(xiàng)非常重要的實(shí)踐,它有助于保證軟件的可靠性、穩(wěn)定性和性能,也是故障排查的關(guān)鍵工具之一。 嵌入式開發(fā)輸出調(diào)試信息主要
    發(fā)表于 11-28 16:46

    嵌入式開發(fā)測(cè)試秘訣

    。 多年前,一位工程師為了對(duì)嵌入式擁有更深層次理解的追求,曾發(fā)出這樣的疑問:“我怎么才能知道并懂得我的系統(tǒng)到底在干些什么呢?”。同時(shí)代的嵌入式開發(fā)人員問得最多的問題大都圍繞“我怎么才能使程序跑得更快”、“什么編譯器最
    的頭像 發(fā)表于 11-24 16:18 ?484次閱讀

    c語(yǔ)言嵌入式開發(fā)

    電子發(fā)燒友網(wǎng)站提供《c語(yǔ)言嵌入式開發(fā).zip》資料免費(fèi)下載
    發(fā)表于 11-17 14:11 ?2次下載
    c語(yǔ)言<b class='flag-5'>嵌入式開發(fā)</b>

    嵌入式開發(fā)系統(tǒng)基礎(chǔ)知識(shí)

    電子發(fā)燒友網(wǎng)站提供《嵌入式開發(fā)系統(tǒng)基礎(chǔ)知識(shí).pdf》資料免費(fèi)下載
    發(fā)表于 11-17 10:59 ?11次下載
    <b class='flag-5'>嵌入式開發(fā)</b>系統(tǒng)基礎(chǔ)知識(shí)

    嵌入式開發(fā)學(xué)習(xí)路線

    電子發(fā)燒友網(wǎng)站提供《嵌入式開發(fā)學(xué)習(xí)路線.doc》資料免費(fèi)下載
    發(fā)表于 11-17 10:13 ?13次下載
    <b class='flag-5'>嵌入式開發(fā)</b>學(xué)習(xí)路線

    嵌入式開發(fā)學(xué)習(xí)路線分享

    的實(shí)際應(yīng)用范疇,可以說目前市場(chǎng)上對(duì)嵌入式開發(fā)人才的需求越來(lái)越大,很多小伙伴都想通過培訓(xùn)學(xué)習(xí)的方式走向嵌入式開發(fā)相關(guān)的崗位。下面,小編就給各位小伙伴介紹一個(gè)簡(jiǎn)單易懂的學(xué)
    的頭像 發(fā)表于 11-15 11:51 ?1276次閱讀
    <b class='flag-5'>嵌入式開發(fā)</b>學(xué)習(xí)路線分享