gpt4 book ai didi

c - 模拟中断而不激活中断

转载 作者:行者123 更新时间:2023-11-30 14:23:24 25 4
gpt4 key购买 nike

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

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

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

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

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

关于c - 模拟中断而不激活中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12893243/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com