2016-03-07 37 views
-5

我有兩個問題。第一種方法是在主程序的單獨文件中創建一箇中斷例程(在定義了其他函數的文件中)是一個好主意?通過一箇中斷例程的多個文件傳遞全局指針

第二個是,我如何傳遞來自不同文件的全局指針?爲了讓自己更容易,指針「指向」全局變量的地址。

文件1 mylib.c

unsigned char b; 
unsigned char e; //global variables used for the interrupt routine 
unsigned char *bp =&b; 
unsigned char *ep = &e; 

文件2 mylib.h

extern unsigned char e; 
extern unsigned char b; 
extern unsigned char *ep; 
extern unsigned char *bp; 

文件3的main.c

#include "mylib.h" 
use (e); 
use (b); 
use (*ep); 
use (*bp); 

它指出點當他們是沒有定義? 對於這裏提出的兩個問題,我沒有找到太多幫助,所以這就是爲什麼我發佈它,找到答案會很有趣。

編制報告:(?)

10 371 Specifier needed main.c 
10 393 'use ' Identifier redefined main.c 
11 371 Specifier needed main.c 
11 393 'use ' Identifier redefined main.c 
+4

咦?如果指針或變量或兩者都是全局的,爲什麼要將它傳遞到任何地方?按照定義,您已經可以從任何地方訪問。 – Murphy

+0

'#include mylib.h' - >'#include「mylib.h」'另外,顯示你的編譯語句。 –

+0

我已經發布了編譯報告,並在我的實際文件中,我沒有忘記把它們放在這裏,只是忘了把它們放在這裏 – bahjat

回答

0

是一個好主意,有一個單獨的文件中的中斷程序從主

這不是C的要求,但代碼的組織問題。是的,將源代碼分成邏輯組是很好的做法。

把中斷服務程序(ISR)及其相關函數和變量放在一個分隔文件中是個好主意。

我該如何傳遞來自不同文件的全局指針?

全局標識符(變量,對象,功能)是到所有文件訪問,因爲它是全球。訣竅是,一個特定的.c文件是否知道它?通過在main.c中包括#include "mylib.h",使該代碼知道標識聲明,如extern unsigned char *bp;

還認爲:

1)unsigned char b, e;不需要在全球空間等* .c文件可以通過unsigned char *bpunsigned char *ep訪問它們。請參閱information hiding

2)名稱bp,ep很短並可能與其他代碼發生衝突。推薦一個提示他們的「家」的前綴。

3)指針可能應該是不變的,並指向volition數據,因爲它們是ISR的一部分。

// mylib.h 
    extern volatile unsigned char * const mylib_ep; 
    extern volatile unsigned char * const mylib_bp; 

    // mylib.c 
    static volatile unsigned char b; 
    static volatile unsigned char e; 
    volatile unsigned char * const mylib_bp = &b; 
    volatile unsigned char * const mylib_ep = &e; 

    // main.c 
    #include "mylib.h" 
    // do not use (e); 
    // do not use (b); 
    use (*mylib_ep); 
    use (*mylib_bp); 

它指出,當他們的指針沒有定義?

的指針聲明中mylib.h。指針是,定義爲,在mylib.c


從設計的角度來看,我不會讓其他文件像上面那樣訪問數據。相反,我會創建一個得到功能。我假設這兩個變量需要以原子方式讀取/寫入:在讀取/設置期間讀取/寫入在一起而沒有機會調用ISR。

void mylib_b_e_get(char *b, char *e); 
void mylib_b_e_set(char b, char e); 

use編制報告反映了僞碼功能use()還沒有宣佈,也沒有定義。