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

[求助]关于实时中断响应的问题

[求助]关于实时中断响应的问题

大家好,我现在遇到一个问题,搞了好几天了还是一头雾水,请各位帮帮忙,尤其是斑竹,
一定要给看看阿:我用的是DP256B、Multilink仿真器以及P&E的开发板,我在开发板上调
试实时中断的时候,不知道为什么,实时中断只执行了一次,主程序就跳出了。按我的理解,
设置了实时中断溢出周期(比如16.392ms)、使能实时中断,在定时器溢出时触发实时中断服务例程;
实时中断服务例程执行完之后(我的那个例程里就作了个加法,应该不会超过实时中断溢出周期的时间)
,返回主程序的for无限循环,直到下一次实时中断服务例程被触发,那么实时中断的执行应该是无限
的,可我的那个怎么进去一次就跳出来了呢?实在是不明白,请各大侠帮忙给看看,谢谢了
把你的程序贴出来看看。
海纳百川  有容乃大
好的,其实程序很简单,
主程序:
void main(void) {
/* put your own code here */
// TaskFlag=1;

Initial();

for(;;) {

EnableInterrupts;
// wait(5000) ;

// RtiCntttt++;

// while (!TaskFlag){}
// TaskFlag=0;

} /* wait forever */
/* please make sure that you never leave this function */
}
中断服务例程:
#pragma CODE_SEG NON_BANKED
void RealTime_INT(void){
//清实时中断标志位
// CRGFLG&=CRGFLG_RTIF_MASK;
CRGFLG_RTIF=1;

//读取TCNT计数值
RTITCNT=TCNT;


//关闭实时中断
// CRGINT&=0xFF-CRGINT_RTIE_MASK;
// CRGINT_RTIE=0;

// TaskFlag=1;
// RtiCntttt= RtiCntttt+1;

// for(;;){
MLCNTR++;

// Test_IO();
// }


//使能实时中断
// CRGINT|=CRGINT_RTIE_MASK;
// CRGINT_RTIE= 1;


// EnableInterrupts;

// DisableInterrupts;

}

程序跳出之后,dbug显示程序停在
#ifndef __ONLY_INIT_SP
Init(); /* zero out, copy down, call constructors */
#endif
中的Init()这个位置,这是不是因为我在中断服务例程中没有初始化堆栈指针造成的,如果是这样,能不能给说一下堆栈指针如何初始化,帮帮忙啊斑竹,谢谢了
还是看不大明白。把整个project打包贴出来,或是发到我的信箱:
strongchen_free@yahoo.com.cn
海纳百川  有容乃大
呵呵,斑竹,我可能已经找到问题出在什么地方了,我再收拾一下,等解决问题了,我就写点东西出来,免得大家再和我一样走弯路
问题解决了,程序是这样:
主程序:
void main(void) {
/* put your own code here */
DDRB=0xFF;

absoluteTime=0;
RTICTL=0x1F;
CRGINT=0x80;

EnableInterrupts;
for (;;){

while(!TaskFlag){}
TaskFlag=0;

}


}
中断服务历程:
#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt void RTI_ISR(void) {
absoluteTime++;
Test_IO();
TaskFlag=1;
/* clear RTIF bit */
CRGFLG = 0x80;

}
TestIO()的功能是完成PORTB端口的LED闪烁,在开发板上可以运行
返回列表