1

我有一个关于外部中断程序的问题要问。如果我使用 DS89C450 的 INT1(外部中断 1 设置为下降沿)并且我的外部中断程序很长,它会正常工作吗?或者会有什么问题吗?我正在使用 Keil 嵌入式 C。

4

2 回答 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 回答