【求助】MSP430看门狗定时器的一个奇怪问题请教[急]
[复制链接]
我想用看门狗定时器来实现一个实时时钟日历,,,采用C与汇编混合编程.C调用汇编的函数,在C中用extern声明.
在IAR上调试:
单独编译(compile)汇编代码及C代码时,没有任务的编译错误及警告,但是综合编译时(rebuild all)出现了奇怪的错误.
错误如下:
Linking
Error[e46]: Undefined external "?cstart_init_zero" referred in RTC_Calendar_test ( C:\study\RTC_Calendar\Debug\Obj\RTC_Calendar_test.r43 )
我试过把
WDT_ISR(void)中的代码全部删掉,这样编译通过,我想是不是我的代码有什么问题?
请高手指点一下.
以下我的C程序
==================================================
RTC_Calendar_test.c
==================================================
// ACLK = LFXT1 = 32768Hz
// mafaqing
// 2007-1-11
#include <msp430x44x.h>
#define EVENT_RTC 0x04 // RTC event flag
unsigned char EVENT = 0;
//
// defined extern varia××e
//
extern unsigned char second;
extern unsigned char minute;
extern unsigned char hour;
extern unsigned char day;
extern unsigned char dayOfWeek;
extern unsigned char month;
extern unsigned int year;
extern unsigned char PM;
extern unsigned char FebDays; // !!!!you must note it
//
// defined extern functions
//
extern void incrementSeconds(void);
extern void incrementMinutes(void);
extern void incrementHours(void);
extern void incrementDays(void);
extern void incrementMonths(void);
extern void incrementYears(void);
extern void testLeap(void);
extern void setDate(unsigned int year, unsigned char month, unsigned char day); //encoded as integers with Jan = 1 and 1st day = 1
extern void setTime(unsigned char hour,unsigned char minute,unsigned char second);
void configWDT(void);
__interrupt void WDT_ISR(void);
//
// config watchdog timer
//
void configWDT(void)
{
WDTCTL = WDT_ADLY_250; // clk source is ACLK,
// inter××l timer mode,
// clear,divide by 8192
IE1 = WDTIE; // ena××e WDT interrupt
}
//
//
//
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // stop wdt
setDate(2007,1,10); // set date
setTime(10,30,00); // set time
configWDT(); // config watch dog
_BIS_SR(GIE); // ena××e global interrupt
while(1)
{
if(EVENT & EVENT_RTC)
{
EVENT &= ~EVENT_RTC; // clear RTC event flag
incrementSeconds(); // increment one second
}
}
}
//
// watchdog timer interrupt service routine
//
// interrupt once every 250 ms
// interrupt 4 times equal to 1 second
//
#pragma vector = WDT_VECTOR
__interrupt void WDT_ISR(void)
{
static unsigned char cnt;
if(( cnt & 0x03) == 0)
{
EVENT |= EVENT_RTC; // set RTC event flag
}
}
===================================================
RTC_Calendar.s43
===================================================
;Varia××es
MODULE RTC
PU××IC second
PU××IC minute
PU××IC hour
PU××IC day
PU××IC month
PU××IC year
PU××IC PM
PU××IC FebDays
PU××IC dayOfWeek
;Functions
PU××IC incrementSeconds
PU××IC incrementMinutes
PU××IC incrementHours
PU××IC incrementDays
PU××IC incrementMonths
PU××IC incrementYears
PU××IC testLeap
PU××IC setDate
PU××IC setTime
以下略
END