我使用C6678实现中断按照优先级嵌套功能实现,程序开了两个定时器中断,在低优先级中断中,先关闭了低优先级定时器中断使能(IER),然后打开整体的中断(CSR),在退出中断前关闭整体中断(CSR),打开低优先级定时器中断使能(IER)。
程序通过CCS调试工具在DEMO板卡上调试:如果在低优先级中断中设置断点,先运行5次,然后去掉断点,在正常运行,C6678可以运行;但是如果不在中断中设置断点,直接运行,系统会进入异常中断中(第一个中断向量的服务函数Nested_Exception_service_routine中)
如果把CSR和IER寄存器的操作去掉,两个中断都能够正常运行,计数统计正常增加,但不能互相打断。
问:1.我的做法问题在哪?开启中断嵌套功能,我除了操作IER与CSR寄存器外,还需要操作哪些寄存器。
2:C6678中断服务程序中是否需要通用寄存器的入栈出栈操作,是否有相应例程代码,在哪里可以找到?
请大侠们支援,谢谢!!
中断服务函数如下:
//当前核专业定时器中断服务函数,中断周期为100us
void interrupt Timer_ISR(void)
{
Uint32 endtime,dlttime;
endtime = TSC_get_timestamp();
if(first_int_flag==1)
{
last_timestemp = endtime;
first_int_flag = 0;
}
else if(first_int_flag==0)
{
dlttime = (endtime – last_timestemp); if(dlttime > max_period_time)max_period_time = dlttime;
if(dlttime < min_period_time)min_period_time = dlttime;
last_timestemp = endtime;
}
TSC_delay_us(3);
uiTick++;
}
//定时器8中断服务函数,中断周期500us
void interrupt Timer8_ISR(void)
{
Uint32 endtime,dlttime;
endtime = TSC_get_timestamp();
IER &= 0x7fff;
ICR= 0x8000;
CSR |=1;
if(first8_int_flag==1)
{
last8_timestemp = endtime;
first8_int_flag = 0;
}
else if(first8_int_flag==0)
{
dlttime = (endtime – last8_timestemp); if(dlttime > max_period_time8)max_period_time8 = dlttime;
if(dlttime < min_period_time8)min_period_time8 = dlttime;
last8_timestemp = endtime;
}
TSC_delay_us(30);
ui8Tick++;
CSR &=0xfffffffe;
IER = IER|0x8000;
}
中断向量如下:
;interrupt vector table .sect "vecs"
.align 1024
vectors:
VEC_RESET Nested_Exception_service_routine ;Nested exception VEC_ENTRY NMI_ISR ;NMI/Exception
VEC_DUMMY ;RSVD
VEC_DUMMY ;RSVD
VEC_DUMMY ;interrupt 4
VEC_DUMMY ;interrupt 5
VEC_DUMMY ;interrupt 6 VEC_DUMMY ;interrupt 7 VEC_DUMMY ;interrupt 8 VEC_DUMMY ;interrupt 9
VEC_DUMMY ;interrupt 10
VEC_DUMMY ;interrupt 11
VEC_DUMMY ;interrupt 12
VEC_DUMMY ;interrupt 13
VEC_ENTRY Timer_ISR ;interrupt 14
VEC_ENTRY Timer8_ISR ;interrupt 15
.end
user5850027:
回复 Shine:
例程有没有