我正在EFM32 Cortex M3處理器上開發嵌入式C代碼,幾個月後代碼開始變得瘋狂......通過這個,我的意思是我們改變了硬件我們得到了不同的版本,在其中我們改變了一些組件,移動在某些iOS,有不同的狀態在啓動時的論文......相當於嵌入式C /代碼組織中的接口
所以我試圖把它清理乾淨一點:
在那裏我有一些非常大的文件像這樣組織:
/*============================================================================*/
/* File : BSP_gpio.h */
/* Processor : EFM32GG980F1024 */
/*----------------------------------------------------------------------------*/
/* Description : gpio driver */
/*----------------------------------------------------------------------------*/
#ifndef BSP_GPIO_H
#define BSP_GPIO_H
#ifdef EXTERN
#undef EXTERN
#endif
#ifdef BSP_GPIO_C
#define EXTERN
#else
#define EXTERN extern
#endif
typedef enum
{
GPIO_INIT = 0,
GPIO_WAKEUP = 1,
GPIO_SLEEP = 2,
} GPIO_MODE;
/* Definition/conts */
#define PIO_PIN_HIGH 1
#define PIO_PIN_LOW 0
#ifdef HW_v1
... hundreds of lines...
#elif defined HW_v2
... hundreds of lines...
#endif
#endif
我嘗試分開不同版本分隔的文件,並嘗試這樣的事:
#ifdef HW_v1
#include "BSP_gpio_HW1.h"
#elif defined HW_v2
#include "BSP_gpio_HW2.h"
#endif
爲每個「子文件」同一類型頭(直到枚舉)。目標是在其他所有「.c」文件中包含「BSP_gpio.h」,並且它會自動包含與所用硬件相對應的文件。
第一個問題是編譯取決於我在哪裏包含子文件。例如,我有一個函數「void BSP_GPIO_set(GPIO_MODE mode)」,它使用枚舉「GPIO_MODE」並且在兩個硬件版本中不同(因爲兩個硬件上IO的狀態不同)。如果我在聲明之前包含子文件,它不知道類型「GPIO_MODE」,併發生編譯錯誤,即使我在子文件中包含「BSP_gpio.h」。 所以,我只是把這個文件的末尾,它的工作原理,即使我不喜歡它...
第二個問題出現時,我有一個變量聲明爲extern,我想用在兩個子文件和其他C文件。比方說,我把這個線之前「的#ifdef HW_v1」:
EXTERN int numberOfToggles;
的「外部」這個詞是什麼在我的「BSP_gpio.c」文件,因爲我在它開始定義BSP_GPIO_C,是關鍵詞extern在包含「BSP_gpio.h」的每個其他文件中。當我構建我的項目時,它會編譯但我有一個鏈接器錯誤:「BSP_gpio.o和BSP_gpio_HW2.o中numberOfToggles的重複定義」,我找不到解決方案。
如果任何人有適當的解決方案,我已經準備好改變我的項目的體系結構!
聽起來像你應該考慮爲不同版本的電路板建立一些BSL(電路板支持庫)。 – user3528438
看看[如何使用'extern'在C源文件之間共享變量?](http://stackoverflow.com/questions/1433204/how-do-i-use-extern-to-share-變量之間 - 源文件-在-C/1433387#1433387)。很明顯,你知道那裏的大部分內容,但它可能會給你一些新的東西,特別是討論「extern」與「extern」和初始化變量等的末尾部分。 –