色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

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

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

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

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

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

使用查表法

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

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

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

使用柔性數(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)存的動態(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ù)組申請空間,柔性數(shù)組的方式只需要申請一次空間,是一塊連續(xù)內(nèi)存,連續(xù)的內(nèi)存有益于提高訪問速度;而指針的方式,除了給結(jié)構(gòu)體申請空間之外,還得給結(jié)構(gòu)體里的指針成員申請空間。

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

使用位操作

1、使用位域

有些數(shù)據(jù)在存儲時(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)展開

有時(shí)候,可以犧牲一點(diǎ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

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

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

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

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

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

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

charfound=FALSE;
for(i=0;i

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

found=FALSE;
for(i=0;i

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

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

必要時(shí),手動對齊結(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)整各成員的位置來進(jìn)行空白字節(jié)填充以達(dá)到對齊的效果。如:

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

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

優(yōu)化中斷處理

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

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

利用硬件特性

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

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

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

審核編輯:黃飛

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

    關(guān)注

    5083

    文章

    19131

    瀏覽量

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

    關(guān)注

    68

    文章

    10870

    瀏覽量

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

    關(guān)注

    3

    文章

    4332

    瀏覽量

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

    關(guān)注

    1

    文章

    1634

    瀏覽量

    49139

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

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

收藏 人收藏

    評論

    相關(guān)推薦

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    嵌入式外中斷c語言代碼

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

    編程特性來構(gòu)建嵌入式系統(tǒng)您將了解如何將您的系統(tǒng)與外部外圍設(shè)備以及使用驅(qū)動程序的有效方式集成指導(dǎo)您測試和優(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 ?737次閱讀

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

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

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

    在本篇文章中,收集了很多經(jīng)驗(yàn)和方法。應(yīng)用這些經(jīng)驗(yàn)和方法,可以幫助我們從執(zhí)行速度和內(nèi)存使用等方面來優(yōu)化C語言代碼。 簡介 在最近的一個(gè)項(xiàng)目中,
    的頭像 發(fā)表于 02-09 01:21 ?631次閱讀
    主站蜘蛛池模板: 久久国产乱子伦精品免费M| 果冻传媒在线完整免费播放| 久久re热在线视频精6| 伊人久久大香线蕉综合电影 | 一区视频免费观看| 老头操美女| 俄罗斯粗大猛烈18P| 亚洲精品欧美精品中文字幕| 老头xxx| 纯肉高H放荡受BL文库| 亚洲成AV人片一区二区不卡| 久久久乱码精品亚洲日韩| 拔萝卜视频免费看高清| 亚洲AV久久久久久久无码| 快播最新电影网站| 国产精品高清在线观看93| 英国video性精品高清最新| 全是肉的高h短篇列车| 国产亚洲精品久久久久久入口| 影音先锋色av男人资源网| 日本在线免费| 久久re视频这里精品青| 成人亚洲视频在线观看| 亚洲午夜精品AV无码少妇| 青青娱乐网| 久久黄色免费| 国产成人高清精品免费观看| 在线观看国产亚洲| 兽皇VIDEO另类HD| 李丽莎与土豪50分钟在线观看| 国产精品卡1卡2卡三卡四| 97超碰在线视频 免费| 无码国产欧美日韩精品 | 欧美 另类 美腿 亚洲 无码 | 无人影院在线播放| 麻豆无人区乱码| 国产精彩视频在线| 97视频精品| 亚洲区视频在线观看| 日本免费一区二区三区四区五六区| 国产亚洲精品在浅麻豆|