RM新时代网站-首页

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ā)燒友論壇 ? 來源:未知 ? 2023-06-13 08:15 ? 次閱讀

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

本期為大家?guī)硪黄?a href="http://hljzzgx.com/v/tag/232/" target="_blank">嵌入式開發(fā)性能優(yōu)化案例,感興趣的小伙伴可以關(guān)注作者一起學(xué)習(xí)哦~

本期推

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

介紹:本專欄介紹嵌入式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í)間比一般指令長,另外也會(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)無法對(duì)我們優(yōu)化后的代碼再進(jìn)行優(yōu)化

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

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

-哪怕是采用-ofsat編譯器優(yōu)化,我們?nèi)斯?yōu)化的代碼依然還有比編譯器優(yōu)化的代碼快15.6%,所以編譯器優(yōu)化無法替代人工優(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://hljzzgx.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)注明以上來源。如需社區(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)推薦

    如何使用 RISC-V 進(jìn)行嵌入式開發(fā)

    、準(zhǔn)備開發(fā)環(huán)境 選擇開發(fā)板 :RISC-V架構(gòu)的嵌入式開發(fā)板有多種選擇,如GD32VF103R-START、飛凌嵌入式OK113i-S等。選擇時(shí)需要考慮
    的頭像 發(fā)表于 12-11 17:32 ?461次閱讀

    基于Xilinx ZYNQ7000 FPGA嵌入式開發(fā)實(shí)戰(zhàn)指南

    電子發(fā)燒友網(wǎng)站提供《基于Xilinx ZYNQ7000 FPGA嵌入式開發(fā)實(shí)戰(zhàn)指南.pdf》資料免費(fèi)下載
    發(fā)表于 12-10 15:31 ?2次下載

    一文了解嵌入式軟件開發(fā)的對(duì)象

    以前應(yīng)用場(chǎng)景很單一,嵌入式開發(fā)可能談不上面向?qū)ο?b class='flag-5'>開發(fā)。但現(xiàn)在,做嵌入式開發(fā),沒有面向?qū)ο?b class='flag-5'>開發(fā),你就有點(diǎn)落伍了。 本文結(jié)合個(gè)人經(jīng)驗(yàn)和周立功《抽象接口技術(shù)和組件
    的頭像 發(fā)表于 11-15 10:31 ?323次閱讀
    一文了解<b class='flag-5'>嵌入式</b>軟件<b class='flag-5'>開發(fā)</b>的對(duì)象

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

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

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

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

    嵌入式linux開發(fā)的基本步驟有哪些?

    之前,首先需要選擇合適的硬件平臺(tái)。硬件選擇需要考慮以下幾個(gè)方面: 1.1 處理器 嵌入式Linux開發(fā)需要一個(gè)處理器,常見的處理器有ARM、MIPS、PowerPC等。選擇處理器時(shí),需要考慮處理器的性能、功耗、成本等因素。 1.
    的頭像 發(fā)表于 09-02 09:11 ?478次閱讀

    恩智浦加速嵌入式AI創(chuàng)新應(yīng)用開發(fā)

    在AI應(yīng)用飛速發(fā)展的今天,如何能夠?qū)I與嵌入式系統(tǒng)開發(fā)有機(jī)結(jié)合起來,營造新的開發(fā)生態(tài),打造與眾不同的創(chuàng)新用例,一直是嵌入式開發(fā)者追求的目標(biāo)。
    的頭像 發(fā)表于 08-27 09:46 ?826次閱讀

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

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

    嵌入式開發(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 ?2679次閱讀
    <b class='flag-5'>嵌入式開發(fā)</b>前景怎么樣?

    嵌入式開發(fā)者的未來

    嵌入式系統(tǒng)的就業(yè)方向非常廣泛,涵蓋了許多不同的行業(yè)和領(lǐng)域。以下是一些常見的嵌入式系統(tǒng)就業(yè)方向:消費(fèi)電子產(chǎn)品:這包括智能手機(jī)、平板電腦、智能電視、智能家居設(shè)備等。嵌入式系統(tǒng)工程師可以參與設(shè)計(jì)、
    的頭像 發(fā)表于 06-23 08:10 ?360次閱讀
    <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 ?1032次閱讀

    嵌入式軟件開發(fā)和軟件開發(fā)的區(qū)別

    之間的區(qū)別。 硬件環(huán)境和資源限制: 嵌入式系統(tǒng)通常運(yùn)行在資源有限的嵌入式設(shè)備上,如單片機(jī)、嵌入式開發(fā)板或微控制器等。這些設(shè)備通常具有有限的處理能力、存儲(chǔ)容量以及功耗要求。相比之下,計(jì)算機(jī)通常擁有更高的處理能
    的頭像 發(fā)表于 01-22 15:27 ?2267次閱讀

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

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