首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

[求助]XD2566编译时出错

[求助]XD2566编译时出错

在一个头文件main.h中仿照CW自带头文件定义了一些变量:

typedef union {
byte Byte;
struct {
byte BITR0 :1;
byte BITR1 :1;
byte BITR2 :1;
byte BITR3 :1;
byte BITR4 :1;
byte BITR5 :1;
byte BITR6 :1;
byte BITR7 :1;
} Bits;
} Myflag;

extern volatile Myflag _MYFLAG0,_MYFLAG1,_MYFLAG2,_MYFLAG3,_MYFLAG4,_MYFLAG5,_MYFLAG6;

#define FLAG0 _MYFLAG0.Byte
#define FLAG0_B0 _MYFLAG0.Bits.BITR0
#define FLAG0_B1 _MYFLAG0.Bits.BITR1
#define FLAG0_B2 _MYFLAG0.Bits.BITR2
#define FLAG0_B3 _MYFLAG0.Bits.BITR3
#define FLAG0_B4 _MYFLAG0.Bits.BITR4
#define FLAG0_B5 _MYFLAG0.Bits.BITR5
#define FLAG0_B6 _MYFLAG0.Bits.BITR6
#define FLAG0_B7 _MYFLAG0.Bits.BITR7

#define FLAG0_B0_MASK 1
#define FLAG0_B1_MASK 2
#define FLAG0_B2_MASK 4
#define FLAG0_B3_MASK 8
#define FLAG0_B4_MASK 16
#define FLAG0_B5_MASK 32
#define FLAG0_B6_MASK 64
#define FLAG0_B7_MASK 128
------------------------------------------------------------------------------------------------------------------------------------

而后在源文件ECT.c中包含该头文件,并且使用定义的变量

#include <mc9s12xd256.h> /* derivative information */
#include "main.h"
FLAG0_B2=0; //UOUT_R=0
------------------------------------------------------------------------------

编译时提示:

External object _MYFLAG0 in ECT.c.o created by default

看帮助内容如下:

Unresolved external. The specified symbol is referenced in the file specified, but is not defined anywhere in the application, but an external declaration for this object is available in at least one of the binary file. The object is supposed to be defined in the first binary file where it is externally defined. This is only valid for ANSI-C applications

似乎是说我定义的变量被引用了,但是没有在程序中定义(define),但是这个变量又被申明(declaration)为全局变量。

我不太理解定义与申明的区别啊,我不是在main.h中定义了变量吗?在使用之前也通过include加入了该头文件啊?怎么还要重新定义?我看使用自带头文件的变量时好像只要include就OK啊,编译也没问题。比如直接用PTH_PTH0=1;则不会出现问题

另外在用FCS仿真时还发现个问题。

void CRG_init(){
/* CLKSEL: PLLSEL=1,PSTP=0,??=0,??=0,PLLWAI=0,??=0,RTIWAI=0,COPWAI=0 */
/* Sys clk are derived from PLLCLK (Bus Clock=PLLCLK/2)
PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1)
OSCCLK=10M,BUSCLK=PLLCLK/2=10M */
CLKSEL=0x80;

/* ECLKCTL: NECLK=0,NCLKX2=1,??=0,??=0,??=0,??=0,EDIV1=1,EDIV0=1
ECLK=BUSCLK/4=2.5M,ECLKX2=0 */
ECLKCTL=0x4F;

/* MMCCTL1: ??=0,??=0,??=0,??=0,??=0,EROMON=0,ROMHM=0,ROMON=1
Enable FLASH or ROM in the memory map */
MMCCTL1=0x01;
}

上面程序在FCS里面仿真时,提示:

FCS Warning (ID 25): writing to reserved register at pc = 0xfe801d'L. Value: 0x4F, Memory Address: 0x1C.
这是为什么啊???

你既然要用extern声明,那么它所声明的变量就应该是此文件外部定义的。你可以在ECT.C中加入变量定义:

volatile Myflag _MYFLAG0;

就可以了。

海纳百川  有容乃大

谢谢!加入版主说的这个确实可以,不理解的是我的变量定义方法和自带头文件是一样的啊?为什么引用自带头文件定义的变量(内部寄存器)时,不需要在源文件中再次声明呢?比如说我在ECT.c文件中使用PTM时,就不需要重新声明啊!!!

另外,我二楼提的问题怎么回事呢?不解!!!

你仔细看一下就可以发现,头文件中的变量也是在另一个文件中定义的。

至于FCS仿真,它的提示有时是错的。只要硬件仿真正确就可以了。

海纳百川  有容乃大
QUOTE:
以下是引用strongchen在2008-5-22 14:09:00的发言:

你仔细看一下就可以发现,头文件中的变量也是在另一个文件中定义的。

至于FCS仿真,它的提示有时是错的。只要硬件仿真正确就可以了。

啊,怎么我没发现呢?斑竹能不能举个例子啊???

俺的pcb拿去做了,还没回来,只好用FCS先顶着。希望板子回来FCS的问题能解决!
你查找一下变量的定义处就看到了(有右键)。
海纳百川  有容乃大
返回列表