是否可以在不激活中断的情况下模仿中断的动作。

我问的原因是因为我使用的微控制器在任何给定时间只允许一个中断激活。在创建时间触发系统时,我已经为计时器设置了中断。

基本上,我必须创建一个TT系统(时间触发),以便定期部署功能。我正在创建一个数据记录系统,因此字符来自UART,并被存储和记录。我需要对串行端口进行中断,这将在用户输入字符时发生。因此,我需要设计一个具有两个中断的系统,一个中断用于计时器,一个中断用于串行端口。但是,控制器不允许同时激活两个中断。

如果真令人困惑,我真的很抱歉,我已经发布了到控制器数据表的链接,这是我的界面代码

void Menu_Update(void)
{
    uint8_t x=010;
    char i;
    i= (char)x;
    // Perform an appropriate action based on the current state.
    //Disable_Interrupt();
    //Enable_System_Interrupt(UART1);
    timer_count++;
    switch (menu_state)
    {
    case MAIN_MENU :
        // Output the initial menu choices and move to the wait state.
        Serial_UART_Write_String("Waiting for character input.......\r\n");
        Serial_UART_Write_String("To view data, enter 'a' \r\n");
        menu_state = MENU_WAIT ;
        break;
    case MENU_2:
        Serial_UART_Write_String("\r\nWould you also like to store this character as well?\r\n");
        Serial_UART_Write_String("Yes Enter 'y' \r\n");
        Serial_UART_Write_String("No Enter 'n' \r\n");
        menu_state = MENU_WAIT ;
        break;
    case MENU_WAIT :
        // Do nothing unless user input was detected.
    default:
        if (Serial_UART_Received_Data())
        {
            const char value = Serial_UART_Read();
            temp = value;
            Serial_UART_Write_String("\r\n***Character: ");
            Serial_UART_Write_Char(value);
            Serial_UART_Write_String(" has been received***\r\n");
            if (value == 'a'||menu_check==1)
            {
                menu_check =1;
                if (value == 'y')
                {
                    menu_check =0;
                    menu_state = WRITE_CHAR;
                }
                if (value == 'n')
                {
                    Serial_UART_Write_String("\r\nSegment format -> ");
                    Serial_UART_Write_String("Character count.Time\r\n");
                    menu_check =0;
                    menu_state = DISPLAY;
                }
                if (menu_check==1)
                {
                menu_state = MENU_2;
                }
            }
            else
            {
                menu_state = WRITE_CHAR;
            }
        }
        break;
    case WRITE_CHAR:
        character_array_storage[character_count]=temp;
        charac_time = timer_count - ref_timer;
        timer_interval_array[character_count]=charac_time;
        character_count++;
        Serial_UART_Write_String("\r\n***Character Stored***\r\n");
        menu_state = MAIN_MENU;
        break;
    case DISPLAY:
        assign_value(character_count,charac_time);
        Serial_UART_Write_String("\r\n***Segments Updated***\r\n");
        menu_state = MAIN_MENU;
        break;
    }
    //Disable_Interrupt();
    //Enable_System_Interrupt(TIMER0);
}
void Enable_System_Interrupt(const uint32_t int_source)
{
    Status_Reg_Set((Status_Reg_Get()& 0xFFFFF8FF) | (int_source << 8));
}
void Status_Reg_Set(uint32_t value)
{
    __asm volatile("mtc0 %0, $12" :: "d" ((unsigned long)(value)));

}


Datasheet
谢谢

最佳答案

如果您足够了解微处理器的汇编程序,则可以执行此操作。检查您的文档,但是对于90%的CPU,在调用中断处理程序之前,只需将其压入堆栈当前状态字即可。在这种情况下,它将使用其iret指令成功返回。

在一天结束时,中断处理程序具有相同的功能,只不过它保留了更多的寄存器,并最终执行了iret而不是普通的ret

10-08 02:59