嵌入式C語言高級編程的技巧
時間:2023-10-23 來源:華清遠見
嵌入式C語言高級編程的技巧
C語言發明至今已經過去了60余年,但如今人們對它的討論依然熱度不減,C語言雖然入門簡單,但是難在精通,下文將會針對C語言在嵌入式系統中運用的編程技巧給大家做些詳解。
一:使用do{} while(0)封裝宏
#define TEST do{
//宏定義
}while(0);
把宏定義封裝起來,這樣的好處是后面加分號不容易出錯。
二:定長的類型
在C語言中,不同的操作系統,變量類型所占的字節數是不同的,我們不能一貫的用C語言的基本的變量類型去定義變量,這樣在跨平臺的時候,代碼的通用性就會出現問題。
為了跨平臺,很多系統定義了一套自己的類型,比如:
uint8_t //1個字節
uint16_t //2個字節
uint32_t //4個字節
uint64_t //8個字節
所以,我們在編程中應當多使用上述的類型,盡量少使用int 、long,這樣能夠保證我們的代碼在不同的操作系統當中的通用性。
三:if判斷的順序顛倒
在寫if判斷條件的時候,我們往往把= =的符號寫漏,導致判斷錯誤,但是在查找bug的時候全很難發現問題所在,所以在寫判斷的時候,我們可以把判斷條件反過來寫,既:
if(x == 5)
{
//假如寫漏了符號if(x = 5),編譯器依然可以執行,但意思已經改變
}
我們可以寫成:
if(5 == x)
{
//假如寫漏了符號if(5 = x),編譯器報錯
}
這樣的好處是,即便你寫漏了符號,編譯器會直接報錯,因為變量不能給常量賦值。
四:算法優化
算法優化指對程序時空復雜度的優化:
在計算機上進行程序設計時一般不必過多關注程序代碼的長短,只需考慮功能的實現,但嵌入式系統就必須考慮系統的硬件資源,在程序設計時,應盡量采用生成代碼短的算法,在不影響程序功能實現的情況下優化算法。
五:循環運行效率
提高循環體效率的基本辦法就是降低循環體的復雜性:
在嵌套循環語句中,應當把最長的循環放在最內層,最短的循環放在最外層。這樣可以減少 CPU跨切循環的次數。
六:儲存器分配
由于成本限制,嵌入式系統存儲器容量有限。程序中所有的變量,包含的庫函數以及堆棧等都使用有限的內存:全局變量在整個程序范圍內都有效。
程序執行完后才會釋放;靜態變量的作用范圍也是整個程序,只有局部變量中的動態變量在函數執行完后會釋放。因此, 在程序中應盡量使用局部變量,提高內存使用效率。
程序中堆的大小受限于所有全局數據和棧空間都分配后的剩余量,如果堆太小,程序不能夠在需要的時候分配內存。因此在使用 malloc 函數申請內存之后一定要用 free 函數進行釋放, 防止內存泄露。
七:工程管理
在一個完整的項目中,除了代碼功能的實現之外,工程的管理也尤為重要,一個好的工程項目,它的內部各項代碼的條理都非常清晰,而不會把所有的函數或者功能都放在同一個c文件當中,適當的封裝頭文件,自己定義c文件,使自己的工程模塊化,通用性有一個質的變化。
八:靈活運用extern和static關鍵字
extern是聲明讓別的文件中能夠使用,static修飾之后的函數或全局變量不能被其他文件使用。
九:靈活使用void*
void*常常用于函數地封裝比較多,當然也有用在其它地方,比如在結構體內定義void*類型的私有指針方便擴展結構體。我們平時在封裝自己的函數時,也可以多考慮看看有沒有必要使用void*使得函數地通用性更強一些。
十:使用宏給結構體初始化
如果頻繁使用一個結構體的話,使用使用宏來給結構體進行賦值是很方便的一種做法。
#define NEW_RECT(length, width) {(length), (width)}
typedef struct _Rect
{
int length;
int width;
}Rect;
int main(void)
{
Rect rect = NEW_RECT(10, 5);
printf("rect length = %d, width = %d\n", rect.length, rect.width);
return 0;
}

