欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

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

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

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

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

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

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

不過(guò),有一些通用的技巧可以在編寫(xiě)嵌入式代碼時(shí)考慮到:

使用查表法

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

比如:編寫(xiě)程序統(tǒng)計(jì)一個(gè)4bit(0x0~0xF)數(shù)據(jù)中1的個(gè)數(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ù)中每個(gè)數(shù)據(jù)的1的個(gè)數(shù)都記錄下來(lái),存放到一個(gè)表中。這樣一來(lái),數(shù)據(jù)數(shù)據(jù)中1的個(gè)數(shù)就建立起了一一對(duì)應(yīng)關(guān)系,就可以通過(guò)數(shù)組索引來(lái)獲取得到結(jié)果。常規(guī)法使用for循環(huán)的方式來(lái)實(shí)現(xiàn),缺點(diǎn)是占用了不少處理器的時(shí)間。

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

使用柔性數(shù)組

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

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

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

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

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

包含柔性數(shù)組成員的結(jié)構(gòu)用malloc()函數(shù)進(jìn)行內(nèi)存的動(dòng)態(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ù)組的方式相對(duì)與指針的方式更為簡(jiǎn)潔,給結(jié)構(gòu)體申請(qǐng)空間的同時(shí)也給柔性數(shù)組申請(qǐng)空間,柔性數(shù)組的方式只需要申請(qǐng)一次空間,是一塊連續(xù)內(nèi)存,連續(xù)的內(nèi)存有益于提高訪問(wèn)速度;而指針的方式,除了給結(jié)構(gòu)體申請(qǐng)空間之外,還得給結(jié)構(gòu)體里的指針成員申請(qǐng)空間。

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

使用位操作

1、使用位域

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

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)展開(kāi)

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

無(wú)依賴的循環(huán)展開(kāi):

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

優(yōu)于:

for(inti=0;i

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

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ǎng)的有依賴的代碼鏈分解成幾個(gè)可以在流水線執(zhí)行單元中并行執(zhí)行的沒(méi)有依賴的代碼鏈,提高流水線的連續(xù)性。通常4次展開(kāi)為最佳方式。

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

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

如:翻轉(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類型,一般會(huì)有溢出的風(fēng)險(xiǎn),因此編譯器需要使用多余的指令判斷是否溢出;而使用int類型,一般編譯器默認(rèn)不會(huì)超過(guò)這么大的循環(huán)次數(shù),從而減少了不必要的指令。

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

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

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

for(col=0;col

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

for(row=0;row

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

盡早退出循環(huán)

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

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

charfound=FALSE;
for(i=0;i

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

found=FALSE;
for(i=0;i

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

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

必要時(shí),手動(dòng)對(duì)齊結(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。

可以手動(dòng)調(diào)整各成員的位置來(lái)進(jìn)行空白字節(jié)填充以達(dá)到對(duì)齊的效果。如:

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

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

優(yōu)化中斷處理

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

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

利用硬件特性

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

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

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

審核編輯:黃飛

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

    關(guān)注

    5096

    文章

    19192

    瀏覽量

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

    關(guān)注

    68

    文章

    10918

    瀏覽量

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

    關(guān)注

    3

    文章

    4349

    瀏覽量

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

    關(guān)注

    1

    文章

    1642

    瀏覽量

    49318

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

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    嵌入式外中斷c語(yǔ)言代碼

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

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

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

    嵌入式C++編程

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

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

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

    嵌入式代碼高效運(yùn)行指南

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

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

    在本篇文章中,收集了很多經(jīng)驗(yàn)和方法。應(yīng)用這些經(jīng)驗(yàn)和方法,可以幫助我們從執(zhí)行速度和內(nèi)存使用等方面來(lái)優(yōu)化C語(yǔ)言代碼。 簡(jiǎn)介 在最近的一個(gè)項(xiàng)目中,
    的頭像 發(fā)表于 02-09 01:21 ?699次閱讀