我有一个关于外部中断程序的问题要问。如果我使用 DS89C450 的 INT1(外部中断 1 设置为下降沿)并且我的外部中断程序很长,它会正常工作吗?或者会有什么问题吗?我正在使用 Keil 嵌入式 C。
问问题
587 次
2 回答
3
在没有 RTOS 的情况下执行此操作的另一种方法是使用事件标志和状态机。您的程序可以用图表表示为在调用特定事件时转换的离散状态。例如,在这张图中,我使用 google 发现:
按钮单击是一个事件;例如,可以从您的 INT1 中断触发的东西。然后,您可以将以下循环置于前台:
#define STATE_POWER_OFF 1
#define STATE_POWER_ON 2
#define EVENT_BUTTON_CLICK 0x01
volatile unsigned char bEventFlags = 0;
unsigned char bState = STATE_POWER_OFF;
unsigned char getEventFlags( void ) ;
int main(void)
{
for(;;)
{
unsigned char flags = getEventflags() ;
if (flags != 0)
{
switch (bState)
{
case STATE_POWER_OFF:
if (flags & EVENT_BUTTON_CLICK)
{
// Do something
bState = STATE_POWER_ON;
}
break;
case STATE_POWER_ON:
if (flags & EVENT_BUTTON_CLICK)
{
// Do something
bState = STATE_POWER_OFF;
}
break;
}
}
}
}
unsigned char getEventFlags( void )
{
unsigned char flags = 0 ;
// Get copy of flags in critical section and clear down
_disable_interrupts() ;
flags = bEventFlags ;
bEventFlags = 0 ;
_enable_interrupts ;
return flags ;
}
然后你的 ISR 会很短:
void INT1_ISR(void)
{
bEventFlags |= EVENT_BUTTON_CLICK;
}
于 2012-05-31T16:56:32.503 回答
1
从某种意义上说,中断处理程序无论如何都会运行完成,不,它不能“太长”。然而,在处理中断时,根据中断架构,要么不运行其他任何东西,要么只运行更高优先级的中断。这样做的后果是您可能会错过实时截止日期。
您甚至可能会错过正在处理的中断源的后续中断。在某些架构上,如果在处理期间未禁用中断,则可能会导致重入,如果处理程序无法重入或堆栈不足,则可能会导致问题。
因此,它能否工作的问题的答案将完全取决于您的应用程序、它有哪些实时截止日期以及可能发生的其他中断源。这样的中断处理程序是否是好的设计的答案当然是否定的。即使它现在可以工作,它在其他应用程序中通常也不会有用,并且可能会在维护时中断。
更好的解决方案是在部件上部署一个简单的 RTOS 调度程序内核,并让中断处理程序以适当的优先级发出任务信号。MCS-51 架构可以有效地实现调度器,因为它有 8 个重复的寄存器组 - 对于多达 8 个任务,上下文切换可以非常快。
于 2012-05-31T16:44:09.440 回答