在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

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

嵌入式C代碼優(yōu)化:實用技巧與經(jīng)驗分享

電子電路開發(fā)學(xué)習(xí) ? 來源:電子電路開發(fā)學(xué)習(xí) ? 2024-03-28 10:53 ? 次閱讀

嵌入式代碼優(yōu)化是一個復(fù)雜的過程,它不僅取決于代碼本身,還取決于目標(biāo)硬件平臺、編譯器以及優(yōu)化的目標(biāo)(例如速度、內(nèi)存使用、功耗等)。

不過,有一些通用的技巧可以在編寫嵌入式代碼時考慮到:

使用查表法

在內(nèi)存空間較為充足的情況下,有時候可以犧牲一些空間來換取程序的運行速度。查表法就是 以空間換取時間 的典型例子。

比如:編寫程序統(tǒng)計一個4bit(0x0~0xF)數(shù)據(jù)中1的個數(shù)。

使用查表法:

staticinttable[16]={0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4};
intget_digits_1_num(unsignedchardata)
{
intcnt=0;
unsignedchartemp=data&0xf;

cnt=table[temp];

returncnt;
}

優(yōu)于:

intget_digits_1_num(unsignedchardata)
{
intcnt=0;
unsignedchartemp=data&0xf;

for(inti=0;i>=1;
}

returncnt;
}

查表法把0x0~0xF中的所有數(shù)據(jù)中每個數(shù)據(jù)的1的個數(shù)都記錄下來,存放到一個表中。這樣一來,數(shù)據(jù)數(shù)據(jù)中1的個數(shù)就建立起了一一對應(yīng)關(guān)系,就可以通過數(shù)組索引來獲取得到結(jié)果。常規(guī)法使用for循環(huán)的方式來實現(xiàn),缺點是占用了不少處理器的時間。

特別地,對于越復(fù)雜地運算,查表法較常規(guī)法更有優(yōu)勢。另一方面,查表法的代碼往往比常規(guī)法要簡潔些。

使用柔性數(shù)組

C99中,結(jié)構(gòu)體中的最后一個元素允許是未知大小的數(shù)組,這就叫作 柔性數(shù)組

254de50c-ec37-11ee-a297-92fbcf53809c.png

柔性數(shù)組的特點:

結(jié)構(gòu)體中柔性數(shù)組成員前面必須至少有一個其他成員。

sizeof返回的這種結(jié)構(gòu)大小不包括柔性數(shù)組的內(nèi)存。

包含柔性數(shù)組成員的結(jié)構(gòu)用malloc()函數(shù)進行內(nèi)存的動態(tài)分配。

在C99標(biāo)準(zhǔn)環(huán)境中,使用柔性數(shù)組:

typedefstruct_protocol_format
{
uint16_thead;
uint8_tid;
uint8_ttype;
uint8_tlength;
uint8_tvalue[];
}protocol_format_t;

優(yōu)于使用指針:

typedefstruct_protocol_format
{
uint16_thead;
uint8_tid;
uint8_ttype;
uint8_tlength;
uint8_t*value;
}protocol_format_t;

柔性數(shù)組的方式結(jié)構(gòu)體占用較指針的方式少。

柔性數(shù)組的方式相對與指針的方式更為簡潔,給結(jié)構(gòu)體申請空間的同時也給柔性數(shù)組申請空間,柔性數(shù)組的方式只需要申請一次空間,是一塊連續(xù)內(nèi)存,連續(xù)的內(nèi)存有益于提高訪問速度;而指針的方式,除了給結(jié)構(gòu)體申請空間之外,還得給結(jié)構(gòu)體里的指針成員申請空間。

使用指針的方式寫代碼會比柔性數(shù)組的方式會繁瑣一些,特別地,如果在釋放內(nèi)存的時候把順序弄反了,則結(jié)構(gòu)體里的指針成員所指向的內(nèi)存就釋放不掉,會造成內(nèi)存泄露。

使用位操作

1、使用位域

有些數(shù)據(jù)在存儲時并不需要占用一個完整的字節(jié),只需要占用一個或幾個二進制位即可。

2558021c-ec37-11ee-a297-92fbcf53809c.png

比如:管理一些標(biāo)志位。

使用位域:

struct{
unsignedcharflag1:1;
unsignedcharflag2:1;
unsignedcharflag3:1;
unsignedcharflag4:1;
unsignedcharflag5:1;
unsignedcharflag6:1;
unsignedcharflag7:1;
unsignedcharflag8:1;
}flags;

優(yōu)于:

struct{
unsignedcharflag1;
unsignedcharflag2;
unsignedcharflag3;
unsignedcharflag4;
unsignedcharflag5;
unsignedcharflag6;
unsignedcharflag7;
unsignedcharflag8;
}flags;

2、使用位操作代替除法和乘法

使用位操作:

uint32_tval=1024;
uint32_tdoubled=val<>1;

優(yōu)于:

uint32_tval=1024;
uint32_tdoubled=val*2
uint32_thalved=val/2

循環(huán)展開

有時候,可以犧牲一點代碼的簡潔度、減少循環(huán)控制語句的執(zhí)行頻率以提高性能。

無依賴的循環(huán)展開:

process(array[0]);
process(array[1]);
process(array[2]);
process(array[3]);

優(yōu)于:

for(inti=0;i

有依賴的循環(huán)展開:

longcalc_sum(int*a,int*b)
{
longsum0=0;
longsum1=0;
longsum2=0;
longsum3=0;

for(inti=0;i

優(yōu)于:

longcalc_sum(int*a,int*b)
{
longsum=0;

for(inti=0;i

盡可能把長的有依賴的代碼鏈分解成幾個可以在流水線執(zhí)行單元中并行執(zhí)行的沒有依賴的代碼鏈,提高流水線的連續(xù)性。通常4次展開為最佳方式。

使用內(nèi)聯(lián)函數(shù)

使用內(nèi)聯(lián)函數(shù)替換重復(fù)的短代碼,一方面,可以避免函數(shù)的回調(diào),加速了程序的執(zhí)行,利用指令緩存,增強局部訪問性;另一方面,可以方便代碼管理。

如:翻轉(zhuǎn)led的操作。

staticinlinevoidtoggle_led(uint8_tpin)
{
PORT^=1<

使用合適的數(shù)據(jù)類型

首先使用合適的數(shù)據(jù)類型。

比如幾種數(shù)據(jù)類型都滿足需求的情況下,更小的可能并不是最合適的。

比如:素組索引的變量類型。

數(shù)組索引應(yīng)盡量采用int類型。

inti;
for(i=0;i

優(yōu)于:

chari;
for(i=0;i

定義為char類型,一般會有溢出的風(fēng)險,因此編譯器需要使用多余的指令判斷是否溢出;而使用int類型,一般編譯器默認不會超過這么大的循環(huán)次數(shù),從而減少了不必要的指令。

其它情況下,在滿足數(shù)據(jù)范圍的情況下,能夠使用字符型(char)定義的變量,就不要使用整型(int)變量來定義;能夠使用整型變量定義的變量就不要用長整型(long int),能不使用浮點型(float)變量就不要使用浮點型變量。

多重循環(huán)優(yōu)化

長循環(huán)在最內(nèi)層:

for(col=0;col

優(yōu)于長循環(huán)在最外層:

for(row=0;row

在多重循環(huán)中,應(yīng)當(dāng)將最長的循環(huán)放在最內(nèi)層, 最短的循環(huán)放在最外層,以減少 CPU 跨切循環(huán)層的次數(shù)。

盡早退出循環(huán)

通常,循環(huán)并不需要全部都執(zhí)行。

例如,如果我們在從數(shù)組中查找一個特殊的值,一經(jīng)找到,我們應(yīng)該盡可能早的斷開循環(huán)。例如:如下循環(huán)從10000個整數(shù)中查找是否存在-99。

charfound=FALSE;
for(i=0;i

這段代碼無論我們是否查找得到,循環(huán)都會全部執(zhí)行完。更好的方法是一旦找到我們查找的數(shù)字就終止繼續(xù)查詢。把程序修改為:

found=FALSE;
for(i=0;i

假如待查數(shù)據(jù)位于第23個位置上,程序便會執(zhí)行23次,從而節(jié)省9977次循環(huán)。

結(jié)構(gòu)體內(nèi)存對齊

必要時,手動對齊結(jié)構(gòu)體的內(nèi)存排列。

比如:

typedefstructtest_struct
{
chara;
shortb;
charc;
intd;
chare;
}test_struct;

該結(jié)構(gòu)體在32bit環(huán)境中,該結(jié)構(gòu)體所占的字節(jié)數(shù)為16。

可以手動調(diào)整各成員的位置來進行空白字節(jié)填充以達到對齊的效果。如:

typedefstructtest_struct
{
chara;
charc;
shortb;
intd;
chare;
}test_struct;

則結(jié)構(gòu)體變量test_s所占的字節(jié)數(shù)變?yōu)?2字節(jié),比原來的16字節(jié)省下了4個字節(jié)。

優(yōu)化中斷處理

確保中斷處理快速且盡可能短。

//中斷例程應(yīng)該盡量簡短
voidISR()
{
flag=true;
}

利用硬件特性

使用硬件模塊或特有指令來減輕CPU負擔(dān)。

//比如,直接使用DMA傳輸而不經(jīng)由CPU
DMA_Config(&src,&dest,length);
DMA_Start();

以上就是本次的分享。一些優(yōu)化可能會增加代碼的復(fù)雜性或降低可讀性或其它方面的影響,因此在決定應(yīng)用優(yōu)化時,需權(quán)衡不同方面的影響。

審核編輯:黃飛

聲明:本文內(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

    文章

    19126

    瀏覽量

    305201
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10863

    瀏覽量

    211765
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4331

    瀏覽量

    62618
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1634

    瀏覽量

    49132

原文標(biāo)題:實用的嵌入式C代碼優(yōu)化技巧與經(jīng)驗

文章出處:【微信號:mcu149,微信公眾號:電子電路開發(fā)學(xué)習(xí)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    嵌入式C語言代碼優(yōu)化經(jīng)驗與方法

    在本篇文章中,收集了很多經(jīng)驗和方法。應(yīng)用這些經(jīng)驗和方法,可以幫助我們從執(zhí)行速度和內(nèi)存使用等方面來優(yōu)化C語言代碼
    發(fā)表于 02-02 09:17 ?371次閱讀

    嵌入式C語言代碼優(yōu)化經(jīng)驗與方法

    在本篇文章中,收集了很多經(jīng)驗和方法。應(yīng)用這些經(jīng)驗和方法,可以幫助我們從執(zhí)行速度和內(nèi)存使用等方面來優(yōu)化C語言代碼
    發(fā)表于 03-08 13:27 ?294次閱讀

    嵌入式系統(tǒng)編程中代碼優(yōu)化

    System)的廣泛使用,高級語言編程已是嵌入式系統(tǒng)設(shè)計的必然趨勢。但是 不排除一些軟件模塊仍用匯編語言來寫,這可以使程序更加有效。雖然C/C++編譯器對代碼進行了
    發(fā)表于 02-23 10:47

    嵌入式C語言優(yōu)化小技巧是什么

    嵌入式C語言優(yōu)化小技巧
    發(fā)表于 12-15 07:23

    嵌入式實時程序設(shè)計中C/C++代碼優(yōu)化

    本文簡單介紹了嵌入式實時程序設(shè)計的特點和嵌入式系統(tǒng)設(shè)計中語言的選擇,著重介紹了以下幾種在嵌入式實時程序設(shè)計中優(yōu)化 C/
    發(fā)表于 08-07 08:47 ?15次下載

    嵌入式程序設(shè)計中C/C++代碼優(yōu)化

    本文介紹了在嵌入式程序設(shè)計中幾種提高C/C++代碼效率的方法,通過對例子的分析,探討了影響程序效率的原因。關(guān)鍵詞:c語言,
    發(fā)表于 08-14 08:53 ?25次下載

    大神教你:嵌入式系統(tǒng)C++代碼的變成技巧

    嵌入式軟件技術(shù)中,C++語言具有較高的編程效率。但是,要實現(xiàn)高效率,還有許多問題需要特別注意。首先,應(yīng)該正確理解C++的工作原理,逐步利用它的各種強大功能,把專業(yè)經(jīng)驗集成到對象中,并
    發(fā)表于 05-25 09:20 ?3600次閱讀

    如何將嵌入式代碼優(yōu)化

    嵌入式代碼優(yōu)化,除了最基本的函數(shù)實現(xiàn)細節(jié)算法優(yōu)化外,還有一些細節(jié)的處理。
    發(fā)表于 09-25 09:34 ?1397次閱讀

    嵌入式系統(tǒng)C語言的特點及程序設(shè)計中代碼優(yōu)化的技巧

    目前,在嵌入式系統(tǒng)開發(fā)中可使用的語言很多,其中 C語言應(yīng)用得最廣泛。雖然用 C 語言編程具有許多優(yōu)點,但基于嵌入式系統(tǒng)的C語言和標(biāo)準(zhǔn)
    的頭像 發(fā)表于 09-02 09:14 ?2950次閱讀

    嵌入式外中斷c語言代碼

    嵌入式外中斷c語言代碼(arm嵌入式開發(fā)實例)-嵌入式外中斷c語言
    發(fā)表于 07-30 11:29 ?4次下載
    <b class='flag-5'>嵌入式</b>外中斷<b class='flag-5'>c</b>語言<b class='flag-5'>代碼</b>

    嵌入式項目實戰(zhàn)經(jīng)驗

    嵌入式項目實戰(zhàn)經(jīng)驗分享,C/C++、Linux、STM32、51單片機、FPGA、IoT、OpenCV、數(shù)字圖像處理、通信、算法!
    發(fā)表于 11-03 12:36 ?23次下載
    <b class='flag-5'>嵌入式</b>項目實戰(zhàn)<b class='flag-5'>經(jīng)驗</b>

    嵌入式C++編程

    編程特性來構(gòu)建嵌入式系統(tǒng)您將了解如何將您的系統(tǒng)與外部外圍設(shè)備以及使用驅(qū)動程序的有效方式集成指導(dǎo)您測試和優(yōu)化代碼以獲得更好的性能并實現(xiàn)有用的設(shè)計模式將了解如何使用 Qt,這是用于構(gòu)建嵌入式
    發(fā)表于 11-04 10:36 ?10次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>C</b>++編程

    嵌入式系統(tǒng)安全實用技巧

    嵌入式系統(tǒng)安全實用技巧
    的頭像 發(fā)表于 12-28 09:51 ?732次閱讀

    嵌入式代碼高效運行指南

    嵌入式C語言之所以經(jīng)久不衰,在于它的運行效率很高,想要高效運行代碼,除了編譯器幫忙優(yōu)化,關(guān)鍵還要靠自己“優(yōu)化
    的頭像 發(fā)表于 01-06 15:32 ?895次閱讀

    嵌入式C語言代碼優(yōu)化經(jīng)驗與方法

    在本篇文章中,收集了很多經(jīng)驗和方法。應(yīng)用這些經(jīng)驗和方法,可以幫助我們從執(zhí)行速度和內(nèi)存使用等方面來優(yōu)化C語言代碼。 簡介 在最近的一個項目中,
    的頭像 發(fā)表于 02-09 01:21 ?627次閱讀
    主站蜘蛛池模板: 午夜网站视频| 综合网伊人| 天堂在线国产| 国产婷婷综合丁香亚洲欧洲| 天天爱天天干天天操| 亚洲欧美日韩一区| 日日噜噜噜噜人人爽亚洲精品| 成人欧美一区二区三区小说| 成人午夜免费剧场| 性videofree极品另类| 国产码一区二区三区| 国产免费午夜高清| 亚洲成人高清在线| 国产精品视频你懂的| 400部大量精品情侣网站| 亚洲29p| 波多久久夜色精品国产| 在线播放免费人成毛片乱码| 天堂黄网| 午夜精品久视频在线观看| 婷婷性| 久久99精品一级毛片| 国产中文99视频在线观看| 性中国videosex国产孕妇| 操女人网| 亚洲一区二区三区免费| 免费观看黄色网页| 国产又爽又黄又粗又大| 亚色图| 午夜快播| 中文字幕有码视频| 不良视频在线观看| 国产在线h| 免费黄色网址网站| 爱综合网| 欧美综合一区二区三区| 老司机狠狠k免费毛片| 五月婷六月婷婷| 天天色啪| 熊出没之环球大冒险旧版免费观看| 80s国产成年女人毛片|