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

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

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

嵌入式工程師C語言避坑小技巧

麥辣雞腿堡 ? 來源:軒哥談芯 ? 作者:義軒 ? 2023-12-13 11:32 ? 次閱讀

為了做一個好的設(shè)計,本身在軟硬件的配合上就需要克服無數(shù)的困難和障礙,任何一名 MCU 愛好者都不希望遇到一些因為語言和工具而產(chǎn)生的困擾,我們在 MCU 這種資源受限的平臺上進(jìn)行 C語言的開發(fā)雖然被軟件界看起來不怎么高大上,但是 MCU 的開發(fā)目前 C 語言還是主流,為了更好的操控和調(diào)試我們的硬件,我們還是需要竭力的避免一些 C語言編程的陷阱,避免被一些高大上的變成語言或者架構(gòu)干擾產(chǎn)品整體的進(jìn)度和可靠性。

第1坑:不要使用“GOTO”語句

GOTO 語句最早源于匯編語言的跳轉(zhuǎn),在很多年前,計算機(jī)的變成還處于起步階段,C語言開始也是尋著匯編的思路來設(shè)計的,因此就遺留下了這么一個 GOTO 語句,允許程序員自由的在代碼間翱翔。使用GOTO語句的例子

#include
int main() { int i = 0;
// 使用goto語句的簡單示例 goto start;
loop: printf("Inside loop: %dn", i); i++;
start: if (i < 5) goto loop;
printf("Loop finished.n");
return 0;}

這種 goto 語句用起來簡單,但是整體程序如果來回跳轉(zhuǎn),讀起來會非常的困難,非常繞,并且 GOTO 語句還存在以下問題:

  1. 可讀性差: 使用goto語句的代碼通常會變得難以理解,因為它允許在程序中跳轉(zhuǎn)到不同的標(biāo)簽位置。這使得代碼流程變得不清晰,增加了理解代碼的難度。
  2. 難以維護(hù): 當(dāng)代碼包含大量goto語句時,很容易導(dǎo)致代碼的維護(hù)困難。修改代碼或添加新功能時,必須仔細(xì)考慮goto語句的影響,以防止引入錯誤。
  3. 錯誤的使用可能導(dǎo)致問題: 如果不小心使用了錯誤的標(biāo)簽,或者在不當(dāng)?shù)奈恢檬褂?code>goto,可能導(dǎo)致程序的不正確行為。這種錯誤可能難以追蹤和修復(fù)。
  4. 不利于結(jié)構(gòu)化編程: 使用goto語句可能違背結(jié)構(gòu)化編程的原則,使得代碼難以按照清晰的結(jié)構(gòu)組織。結(jié)構(gòu)化編程強(qiáng)調(diào)使用順序結(jié)構(gòu)、選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)來構(gòu)建清晰、可讀、可維護(hù)的代碼。
  5. 不利于調(diào)試: 調(diào)試時,跳轉(zhuǎn)語句會使程序的執(zhí)行路徑變得復(fù)雜,增加了調(diào)試的難度。代碼中的跳轉(zhuǎn)可能使得代碼不易于單步調(diào)試,阻礙了查找和修復(fù)錯誤的過程。

第2坑:使用完整的條件語句

在使用判斷語句的時候,我們尤其要注意判斷條件的完整性,我們許多工程師都熟悉簡單的if else 語句,然而有一些工程師卻沒有注意到,不同的寫法可能會浪費一些處理器的時間。比如:

if(value == 1U)
{


}


if(value == 0U)
{


}


if(value == 1U)
{


}
else 
{


}

在第一種寫法中,處理器會去判斷兩次,然后根據(jù)判斷結(jié)果進(jìn)行分支運行,但是如果我們寫成第二種寫法,處理器只需要判斷一次就可以了。尤其是這種判斷在一個大循環(huán)內(nèi)部,這將浪費我們很多處理器時間。

另外為了代碼具備更清晰的可讀性,我們應(yīng)該讓 if else 成對出現(xiàn),并且都是用{}把程序分割開來,這樣也避免我們在調(diào)試的時候復(fù)制粘貼出現(xiàn)一些錯誤,從而影響我們調(diào)試和解決問題的進(jìn)度。

#include
int main() { int choice;
// 提示用戶輸入數(shù)字 printf("Enter a number (1-3): "); scanf("%d", &choice);
// 使用 switch 語句根據(jù)用戶輸入執(zhí)行不同的操作 switch (choice) { case 1: printf("You chose option 1.n"); // 執(zhí)行操作1的代碼 break;
case 2: printf("You chose option 2.n"); // 執(zhí)行操作2的代碼 break;
case 3: printf("You chose option 3.n"); // 執(zhí)行操作3的代碼 break;
default: printf("Invalid choice. Please enter a number between 1 and 3.n"); // 處理無效選擇的代碼 break; }
return 0;}

如果判斷分支比較多,一定是用 swich case 語句來代替 if else。道理是相同的,一定要完整且用{}將程序段分隔好。同時要注意,如果我們對分支的命中率有一定的前瞻性,那么我們最好把命中率比較高的分支放在前面。

對于 case 比較多的情況,有些編譯器會主動優(yōu)化,這時候就不必考慮命中率的問題了。

第3坑:使用FOR(;;)還是 While(1)?

MCU 的開發(fā)過程中,我們絕大部分情況下還是在使用前后臺系統(tǒng),當(dāng)然即便我們跑了一些實時性的操作系統(tǒng),也避免不了使用一些無限循環(huán)的處理。

那么處理無限循環(huán)的語句目前有兩種寫法,我??吹揭恍┏跫壒こ處煏褂?while(1),而在一些操作系統(tǒng)源碼中看到的更多的是 for(;;)。

如果在 C99 的版本下,我們使用 for 來寫循環(huán)看起來更緊湊。

// while 循環(huán)的初始化int i = 0;while (i < 5) {    // ...    i++;}
// for 循環(huán)的初始化for (int i = 0; i < 5; i++) { // ...}


另外,我十幾年前在賽普拉斯單片機(jī)上開發(fā),因為 flash 空間很小,需要極致優(yōu)化代碼來進(jìn)行空間壓縮,這里我選擇了 for 循環(huán)的寫法可以讓空間多出一個字節(jié)來,不過現(xiàn)在的很多編譯器都已經(jīng)更新了很多年了,至少在主流的 arm 平臺上他們的匯編代碼都是一樣的了。

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

    關(guān)注

    146

    文章

    16802

    瀏覽量

    349359
  • 嵌入式
    +關(guān)注

    關(guān)注

    5052

    文章

    18912

    瀏覽量

    300798
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7581

    瀏覽量

    135582
  • 編程
    +關(guān)注

    關(guān)注

    88

    文章

    3544

    瀏覽量

    93470
收藏 人收藏

    評論

    相關(guān)推薦

    嵌入式工程師怎么寫出效率高的C語言程序

    作為嵌入式工程師,怎么寫出效率高、思路清晰的C語言程序呢?
    發(fā)表于 07-03 09:34 ?314次閱讀

    嵌入式軟件工程師和硬件工程師的區(qū)別?

    。他們之間的緊密合作對于成功開發(fā)出高效的嵌入式系統(tǒng)至關(guān)重要。 嵌入式軟件工程師嵌入式硬件工程師在工作中有著不同的技能要求和專業(yè)知識。
    發(fā)表于 05-16 11:00

    嵌入式工程師比普通軟件工程師好在哪里?

    ,其中包括硬件系統(tǒng)的建立和相關(guān)軟件開發(fā)、移植、調(diào)試等工作。被認(rèn)可的嵌入式工程師必須具備C/C++語言、匯編
    發(fā)表于 11-20 15:37

    嵌入式工程師的具體工作是什么?

    ,其中包括硬件系統(tǒng)的建立和相關(guān)軟件開發(fā)、移植、調(diào)試等工作。被認(rèn)可的嵌入式工程師必須具備C/C++語言、匯編
    發(fā)表于 04-21 15:23

    嵌入式軟件工程師嵌入式硬件工程師有什么不同,區(qū)別在哪里?

    對于初學(xué)者來說,一些概念總是容易搞不清楚,容易混淆。比如:“嵌入式硬件工程師嵌入式軟件工程師有什么不同?”,“嵌入式硬件
    發(fā)表于 07-15 16:01

    嵌入式工程師是如何煉成的

    的,現(xiàn)在好多非嵌入式科班出身的求職者都投入到了嵌入式這個行業(yè)的學(xué)習(xí)當(dāng)中,那么現(xiàn)在由小編簡單的為您分析一下嵌入式工程師是如何煉成的呢。 入門嵌入式
    發(fā)表于 04-17 09:31

    嵌入式工程師是做什么的?

    嵌入式工程師要具有C/C++語言、匯編語言、操作系統(tǒng)等基礎(chǔ);熟悉模擬電子技術(shù)和數(shù)字電子技術(shù)等硬
    發(fā)表于 08-08 14:59

    嵌入式工程師需要哪些技能書/技能加點

    嵌入式硬件工程師通用技能樹軟件C/C++語言編程經(jīng)驗、編程能力、應(yīng)用開發(fā)、OOP面向?qū)ο缶幊谭绞?、軟件框架?/div>
    發(fā)表于 08-06 09:46

    嵌入式軟件開發(fā)工程師與FPGA開發(fā)工程師 精選資料分享

    我是一名初入職場的萌新,工作不久從嵌入式軟件工程師轉(zhuǎn)到了FPGA工程師,這篇文章簡單講講兩者的區(qū)別。嵌入式軟件工程師無非分為兩大類,在Win
    發(fā)表于 08-18 06:37

    如何才能成為嵌入式Linux開發(fā)工程師

    嵌入式操作系統(tǒng)領(lǐng)域內(nèi)也獲得了飛速發(fā)展和廣泛應(yīng)用。面對如此火熱的行業(yè),如何才能成為嵌入式Linux開發(fā)工程師?成為一名合格的嵌入式Linux開發(fā)工程
    發(fā)表于 11-04 08:30

    嵌入式軟件工程師的相關(guān)資料推薦

    在2000年前后,嵌入式軟件工程師有著一套非常具體的技能,他們通常是電氣工程師,不僅了解底層硬件的工作原理,還可以再底層編寫匯編代碼或者C語言
    發(fā)表于 12-15 07:48

    什么是嵌入式硬件工程師?什么是嵌入式軟件工程師

    什么是嵌入式硬件工程師?什么是嵌入式軟件工程師?嵌入式軟件工程師
    發(fā)表于 12-24 06:41

    嵌入式軟件工程師是什么?

    系統(tǒng)的工程師。2.嵌入式軟件工程師需具備哪些能力? a.最重要的是C語言編程,以及C++,這個與
    發(fā)表于 12-24 06:35

    嵌入式工程師有發(fā)展前途嗎?

    軟件開發(fā)工作。涉及應(yīng)用層以及底層軟件開發(fā)和設(shè)計工作。應(yīng)具備哪些能力最直接的方法,就是去根據(jù)各公司,招聘網(wǎng)站的嵌入式軟件工程師的應(yīng)聘要求來分析我?guī)湍憧偨Y(jié)下:1.最重要的是C語言編程,以及
    發(fā)表于 12-29 09:45

    嵌入式軟件工程師培養(yǎng)步驟

    嵌入式軟件工程師培養(yǎng),七大階段全面系統(tǒng)的掌握嵌入式技術(shù) 第一階段:編程語言強(qiáng)化,包含C語言,Li
    發(fā)表于 12-27 16:02 ?172次下載