2015-04-29 34 views
0

我有問題和希望,你可以幫助我。 我嘗試在兩個dsPIC30F4011之間進行CAN通信。它也可以。現在我必須製作標識符。我必須使用SID和EID。它們分爲4個部分。我想做一個位聲明並得到一個錯誤。 我做了一個新的頭文件位聲明 - 未定義的引用'變量'

#ifndef IDENTIFIER_H 
#define IDENTIFIER_H 

#ifdef __cplusplus 
extern "C" { 
#endif 




#ifdef __cplusplus 
} 
#endif 

#endif /* IDENTIFIER_H */ 


#include <p30F4011.h> 
#include "system.h" 
#include <p30fxxxx.h> 


typedef struct tagCxTXxSIDBITS{ 
    unsigned   : 11; 
    unsigned PRIO4_0 : 5; 
}CxTXxPRIOBITS; 

extern volatile unsigned int C1TX0PRIO __attribute__((__sfr__)); 
extern volatile CxTXxPRIOBITS C1TX0PRIObits __attribute__((__sfr__)); 
extern volatile unsigned int C1TX1PRIO __attribute__((__sfr__)); 
extern volatile CxTXxPRIOBITS C1TX1PRIObits __attribute__((__sfr__)); 
extern volatile unsigned int C1TX2PRIO __attribute__((__sfr__)); 
extern volatile CxTXxPRIOBITS C1TX2PRIObits __attribute__((__sfr__)); 

在代碼我想寫

... 
... 
C1TX0PRIO = 0x0000; 
... 

如果我要建立的項目中,我得到的錯誤

build/default/production/CAN_function.o(.text+0x66): In function `.LSM19': 
: undefined reference to `_C1TX0PRIO' 
make[2]: *** [dist/default/production/blink.X.production.hex] Error 255 
make[1]: *** [.build-conf] Error 2 
make: *** [.build-impl] Error 2 

我做錯了什麼? 我寫像p30F4011.h

+0

您已經編寫了C1TX0PRIO的定義,但是您沒有編寫實現。即在你的C代碼中你需要'unsigned int C1TX0PRIO;'這樣該變量就存在 –

回答

1

TL; DR - 聲明不分配內存,定義一樣。

作爲每C11標準文檔,章§6.7,聲明,

甲聲明指定一組標識符的解釋和屬性。標識符的定義是對該標識符的聲明:

- 對於一個對象,導致爲該對象保留存儲空間;

- .....

當你把extern存儲類說明,你聲明一個變量,而不是定義它。

所以,你需要定義變量才能使用它。

在源文件中添加

volatile unsigned int C1TX0PRIO; 

+0

應該不會添加*** volatile ***'unsigned int C1TX0PRIO;'。 – ryyker

+0

@ryyker是的,錯過了那部分,我會相應地更新。然而,我試圖做出的主要觀點是定義和聲明之間的區別。 –

+0

是的,我看到了,這就是爲什麼我upvoted。但後來實現了缺失修飾符。 – ryyker

1

您在頭文件中聲明爲extern的變量。

如果您想從多個源文件使用該變量,通常需要將變量作爲extern放在標題中。通過這種方式,變量將可以在包含該頭文件的所有源文件中訪問。但是,在其中一個C文件中,您將需要具有以下內容:

volatile unsigned int C1TX0PRIO __attribute__((__sfr__));