|
有一软件,需要非常精确的定时8u的定时器0中断来进行处理,同时又有串口接收中断,由于串口接收中断的存在,发生串口中断时,定时器0的定时中断就不能保证精确,所以需要采用中断嵌套来进行处理。
F_CPU=24M
程序如下:
/******************************************************************************
功能说明: 定时器0中断处理程序
输入参数: 无
输出参数: 无
返回值: 无
******************************************************************************/
SIGNAL(SIG_OVERFLOW0)
{
unsigned char statusA;
unsigned char c_buf;
TCNT0=256-(8*F_CPU)/8/1000000;//定时8U
//以下为定时中断处理,不超10条简单的C语句,略
}
/******************************************************************************
功能说明: 串口0中断处理程序
输入参数: 无
输出参数: 无
返回值: 无
******************************************************************************/
SIGNAL(SIG_USART_RECV)
{
unsigned char c_buf;
sei(); //使能全局中断
c_buf=UDR0;
//以下为定时中断处理,运行起来不超15条简单的C语句,略
//设置收到数据标志
}
原来没有采用中断嵌套时,定时不准,有时8u,有时可能9u,10u.
但采用中断嵌套后,也能接收到数据,但接收不正确。
原来没有采用中断嵌套,看了马老师的帖子说到
B中断的服务程序应这样设计:(1)B中断的现场保护;(2)屏蔽除A以外其它的中断允许标志;(3)用指令SEI开放允许全局中断;(4)B中断服务;(5)用指令CLI禁止全局中断(6)恢复在本中断程序被屏蔽的中断允许标志;(7)B中断现场恢复;(8)B中断返回。
由于我只有这两个中断,并且是采用C进行开发,所以也就觉得只能在串口中断服务程序中加上sei(),别的好象也没什么好处理了。
串口中断服务程序最后加上cli();也试过,也不行。
请问我这么处理,错在哪?该如何改进,谢谢!!! |
|