5331|5

70

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

【求助】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

最新回复

因为那时实在没办法了啊,在代码上找不到任何的错误,当然也是突然之间想到重建工程的啊. 我用的是free 4K版的IAR,不知道与这个有没有关系呢?嘻嘻  详情 回复 发表于 2007-1-12 11:15
 
点赞 关注

回复
举报

66

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
我试过把看门狗中断函数中"EVENT |= EVENT_RTC; // set RTC event flag",这个语句去掉,换成一个空操作,这样编译就通过.
这是为什么啊?是不是我的这句代码EVENT |= EVENT_RTC;有问题?
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
即在看门狗中断函数中的if语句里面不要有任何代码就编译OK,我一直搞不明白,在网上没有查到此类的错误.
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

4
 
问题已经解决.
后来我在无奈一下,重新另建一个工程,再次编译又OK了,
真是奇怪,搞不明白.
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用:

重新另建一个工程,再次编译又OK了
其实这也是一种解决的方法,有时候一个工程反复使用有可能会出现这种问题(以前有人碰到过)
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

6
 
因为那时实在没办法了啊,在代码上找不到任何的错误,当然也是突然之间想到重建工程的啊.
我用的是free 4K版的IAR,不知道与这个有没有关系呢?嘻嘻
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表