学51单片机,卡在了中断这一节
困惑就在于,运行,发生中断时,主程序此时正运行到哪个位置了?按对教程的理解,不用关心这点,哪个位置都有可能发生,有中断信号主程就暂停,跳转执行中断函数,最后又跳回主程继续可是,很多同一变量同时存在于中断程序与主程序代码段中。中断函数先于主程计算该变量。与主程先于中断函数计算该变量,感觉这变量值不可控啊。
戓者说,一段代码,需要插入一个函数。这个函数插入的位置未知(哪儿都有可能),这段代码最后运算结果也是不可控的嘛。 本帖最后由 爱咋咋地了 于 2020-9-25 15:45 编辑
大白话倒听的明白:正在看电视,有人敲门(有中断信号),去开门,开完门,继续看电视。
可一拿起书看到中断这一节就发蒙:lol 你当然要考虑中断对对主程序的影响了。要保存状态值。 中断程序中定义的变量与主函数程序中定义的变量都是局部变量;如果是在主程序前定义了全局变量并在主程序和中断程序中使用,则首先要看主程序中开启中断的位置 中断函数里面尽量不用“全局变量”,除非你“很自信”;
程序小还好,很大的话,程序中多处“读”或“写”全局变量,会“失控”的;只读就无所谓了; 无法理解为什么不可控 本帖最后由 martian618 于 2020-9-25 17:54 编辑
好好看看堆栈的内容吧,中断时用它来暂存需要保护的寄存器或变量的值! 如果你用C语言的话,编译器会自动为你处理好中断的现场保护和恢复过程,你只需要确保你在中断里不能随意干扰主函数内部使用的变量,这就涉及到如何进行同步。最简单的办法是,中断程序使用一组独立的全局变量,其中一个作为标志,进入中断以后留下标志,主函数反复查询标志来确认是否进入过中断,以及应该怎么处理中断函数产生的数据。处理完了清空标志。 本帖最后由 iffi123 于 2020-9-25 21:07 编辑
中断是非常好用的特性, 中断有并发的效果,你在主程序循环,不用担心漏掉其他的事情,它来了就在中断程序再去处理。
中断还有一个嵌套的功能,不同优先级的中断,优先级高的可以抢占低的中断,中断里再发生中断,象套娃一样
中断+DMA就更强大了;P 事件触发->自动启动DMA->数据传输->完成产生中断,整个过程你可以做别的事,中断出现后再去慢悠悠处理。如果是轮询,你得不停地查询标志,发送接收每一个字节都要你参加,这期间,无法做别的事 壹法拉 发表于 2020-9-25 16:51
中断函数里面尽量不用“全局变量”,除非你“很自信”;
程序小还好,很大的话,程序中多处“读”或“写” ...
不需要“很自信”,中断里设置全局标志,回到主程序再处理,也很常见的做法 版主的疑惑, 在正规的编匯语言或者编写操作系统教程中, 会有触及,多线程 必需要处理的问题。
单片机的中断比较简单, 但是, 仍要视乎编程语言和有没有操作係统, 使用除错器。
我的做法是,全局变量,只在中断中修改,主程序只能读。 中断不是越多越好,也要考虑重入因素、中断需要压栈出栈操作也是一种负荷。 用汇编语言就不会有这个困惑了。
页:
[1]
2