Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 当输入按下on/off时,禁用/启用中断(时间)_C_Assembly_Input_Interrupt_Avr - Fatal编程技术网

C 当输入按下on/off时,禁用/启用中断(时间)

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; }

清除中断/中断环路,然后设置中断,是否会恢复ISR? 我还不熟悉格式化,所以我不确定这样做是否可行

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,你需要这样做。