C 当输入按下on/off时,禁用/启用中断(时间)
清除中断/中断环路,然后设置中断,是否会恢复ISR? 我还不熟悉格式化,所以我不确定这样做是否可行C 当输入按下on/off时,禁用/启用中断(时间),c,assembly,input,interrupt,avr,C,Assembly,Input,Interrupt,Avr,清除中断/中断环路,然后设置中断,是否会恢复ISR? 我还不熟悉格式化,所以我不确定这样做是否可行 else if(serial_input == 'p' || serial_input == 'P') { while(serial_input = fgetc(stdin)) { if(serial_input == 'p' || serial_input == 'P'){ cli(); break; }
else if(serial_input == 'p' || serial_input == 'P') {
while(serial_input = fgetc(stdin)) {
if(serial_input == 'p' || serial_input == 'P'){
cli();
break;
}
sei();
}
记住sei()和cli()的作用。cli()全局设置中断掩码,有效地屏蔽所有传入的中断。所有这些都将在下一个sei()调用之前“保护”代码,使其不被中断。在此期间接收到的所有中断都不会作为中断处理。实际上,在设置掩码位时,它们被“忽略”。是一个关于AVR中断的易于阅读的参考,其中包括关于sei()和cli()的信息,以及我在下面提到的任何其他中断信息
您询问停止和恢复ISR,这本身就是一个奇怪的问题。当遇到中断时,您的当前进程将停止,使用ISR信息生成新的堆栈帧,并执行中断例程,直到遇到中断返回
reti()// In AVR-C
这将重新加载用户程序。实际上,没有(安全的)方法“暂停”ISR并返回到程序的主执行,只有更深(更高优先级)的中断。查找嵌套中断以了解此情况。对不起,您是想用此代码手动触发中断,还是这是中断当前代码的高优先级ISR?编辑:啊,没关系,我知道你在做什么!avr本机不支持嵌套中断。这只能通过在ISR中使用
sei()
(在输入ISR时,全局中断启用标志被禁用)来模拟,但不建议这样做。我只是在“我想你问的是嵌套问题,所以这是实现嵌套的方法”的上下文中回答。虽然我理解AVR编译器不喜欢嵌套,但这是可能的,有时,当你只有一个AVR,你需要这样做。