我有问题和希望,你可以帮助我。 我尝试在两个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 :(得分:1)
TL; DR - 声明不分配内存,定义确实如此。
根据C11
标准文件,章节§6.7,声明,
声明指定一组标识符的解释和属性。标识符的定义是该标识符的声明:
- 对于一个对象,导致为该对象保留存储;
- .....
当您放置extern
存储类说明符时,您声明变量,而不是定义。
因此,在使用变量之前,您需要定义变量。
添加
volatile unsigned int C1TX0PRIO;
在源文件中。
答案 1 :(得分:1)
标题中声明为extern的变量。
如果要从多个源文件中使用该变量,通常需要将变量作为extern放在标题中。通过这种方式,可以在包含此标头的所有源文件中访问该变量。但是,在其中一个C文件中,您需要具有以下内容:
volatile unsigned int C1TX0PRIO __attribute__((__sfr__));