2014-01-19 21 views
3

希望有人可以提供幫助 - 對於這個非常基本的問題表示歉意,但我使用標準C來編寫代碼,用於PIC微控制器的一些實驗,而且我對C語言很陌生。如何組織代碼.h文件中的聲明和函數,幷包含最佳代碼重用

我有各種邏輯的代碼組,例如控制LCD顯示器的功能,我希望使其可以重用於基於PIC的項目,並想知道如何最好地分解這些邏輯代碼可再利用性組。

在LCD函數的例子中,我假設我將聲明拆分爲一個名爲'lcd.h'的頭(包括在我的IDE的'頭文件'項目目錄中)和函數定義在一個include'lcd中。 c'(包括在我的IDE的'源文件'項目目錄中) - 這是正確的嗎?

以這種方式分解代碼的命名約定是什麼?例如,所有全局聲明都應該放在名爲'main.h'的頭文件中?

非常感謝, 亞歷

回答

4

這是很好的,你的重點是模塊化。它不僅會帶給你可重用性,而且還會使調試變得更容易。

命名約定

你是對的。對於LCD功能,請創建文件lcd.clcd.h。有沒有通用的函數的命名慣例,但在這裏我用什麼:

lcd.h

void LCD_PublicFunction(void); 

lcd.c

static void PrivateFunction(void); 

void LCD_PublicFunction(void) 
{ 
    // Function goes here 
} 

static void PrivateFunction(void) 
{ 
    // Function goes here 
} 

我把一個LCD_前綴在我所有的公共職能前,爲了以防止命名空間衝突,並幫助我在任何時候找到函數的位置。 static鍵盤可防止lcd.c以外的任何功能看到PrivateFunction,並且我放棄前綴以表示專用。

全局變量

請避免全局變量。隨着項目的增長,追蹤邏輯將變得更加困難。相反,使用getter和setter函數。

static int brightness; 

void LCD_SetBrightness(int var) 
{ 
    brightness = var; 
} 

int LCD_GetBrightness(void) 
{ 
    return brightness; 
} 

這給你更多的靈活性。也許每次設置亮度時都需要添加一些邏輯。也許你希望變量是隻讀的,所以你可以放下setter。

細度

儘量打破您的項目儘可能。我假設你將使用某種串口與LCD進行通信。分解LCD顯示屏固件中的通訊固件。

例如,如果它使用SPI,那麼您應該創建一個spi.c和一個spi.h

我見過這種做法太過分了。我已經看到人們圍繞所有I/O端口封裝功能,以便他們具有將數字引腳設置爲高和低的功能。

錯誤的例子:

void IO_PortA7 (char val) 
{ 
    LATAbits.LATA7 = val; 
} 

我還沒有真正得到任何東西在這裏除了增加了一些語法糖。在代碼中只需使用LATAbits.LATA7,因爲它是在PIC上打開和關閉I/O的標準方式。

很好的例子:

void FX_SetBuzzer (char is_active) 
{ 
    LATAbits.LATA7 = is_active; 
} 

僅僅通過閱讀代碼,你可以告訴我已經連接的蜂鳴器引線A7。此外,其餘的代碼並不在乎我如何連接蜂鳴器,而且如果必須將蜂鳴器移動到不同的引腳上,則必須進行一次更改。最後,通過使用變量名稱is_active,我記錄了蜂鳴器處於高電平狀態的事實。我嘗試使用所有布爾變量的問題來記住真實情況下會發生什麼。

測試

最後一條建議。在您的每個.c文件中,創建一個測試工具。

#ifdef LCD_TEST 

int main(void) 
{ 
    // Enable LCD communication. 
    LCD_Init(); 

    // Display friendly greeting. 
    LCD_Display("Hello, world!"); 

    // Wait for power-down. 
    for(;;); 
} 

#endif 

這樣,您可以構建一個測試您的LCD本身的小程序。它有幾個目的。

  • 它遵循Test-driven_development,這是一件好事。
  • 它通過顯示一個功能示例提供了基本的文檔形式。
  • 將來,您的LCD可能會突然停止工作。只需調用這段代碼,看看會發生什麼。如果測試有效,您知道您的最新更改以某種方式打破了LCD功能。如果沒有,你知道問題出在LCD本身或者它與PIC之間的連接上。

祝你好運!

+0

感謝您花時間提供這種優秀的回覆,將採取您的方法。亞歷克斯問候 – Alex2134