找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1562|回复: 13
打印 上一主题 下一主题
收起左侧

关于单片机中断的深入探索

[复制链接]
跳转到指定楼层
楼主
ID:825202 发表于 2023-10-24 17:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在看关于中断的相关基础知识点,想请教一下各位大神,关于中断在应用,原理上的一些相对深入一些的重点知识
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:195496 发表于 2023-10-24 17:39 | 只看该作者
暂时中断循环操作,执行相应的中断请求,再返回大循环程序中
回复

使用道具 举报

板凳
ID:883242 发表于 2023-10-24 17:51 | 只看该作者
用就行了,不需要探索,事实上你也探索不出来什么。
回复

使用道具 举报

地板
ID:57657 发表于 2023-10-24 20:39 | 只看该作者
常用中断有定时器中断、外部中断、串口中断,还有硬件SPI中断、ADC、LVD、I2C等中断。
回复

使用道具 举报

5#
ID:332444 发表于 2023-10-25 07:55 | 只看该作者
这是回复题主的代码,目的是观察各中断及返回用的,可以借鉴理解中断的作用,我实践是不会这样写的.
  1. #include <REG52.H>
  2. #include "intrins.h"
  3. #define uchar unsigned char
  4. bit K1=0,K2=0;//标记逻辑组合可以替代中断优先
  5. void Delay(unsigned int i)//延时函数                                       
  6. {      
  7.   unsigned int j;
  8.         for(;i>0;i--)               
  9.         for(j=0;j<125;j++)               
  10.         {;}//空函数                                                                       
  11. }
  12. void main()//主函数https://ask.csdn.net/questions/8011758
  13. {
  14.         unsigned char display [9]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//流水灯显示数据数组
  15.         unsigned char a;
  16.         EA=1;//总中断允许
  17.         EX0=1;//允许外部中断0中断
  18.         EX1=1;//允许外部中断1中断
  19.         IT0=1;//选择外部中断0为跳沿触发方式
  20.         IT1=1;//选择外部中断1为跳沿触发方式
  21.         PX0=0;//外部中断0为低优先级
  22.         PX1=1;//外部中断1为高优先级  
  23.         for(;;)               
  24.         {     
  25.                 for(a=0;a<9;a++)               
  26.                 {                                               
  27.                         Delay(400);//延时,切换会延时阻塞设定时间
  28.                         P1=display[a];//已定义的流水灯显示数据送到P1口
  29.                 }
  30.         }
  31. }
  32. void int0_isr() interrupt 0      //删除using 0否则无法返回主函数外中断0的中断服务函数
  33. {
  34.         unsigned char m=0;
  35.   for(m=0;m<10;m++)//标号为偶数的LED和奇数LED交替闪烁10次
  36.   {
  37.     P1=0x55;//标号为偶数的LED灯点亮
  38.     Delay(500);//延时
  39.         P1=0xaa;//标号为奇数的LED灯点亮
  40.         Delay(500);//延时
  41.   }
  42. }
  43. void int1_isr() interrupt 2      //using 1外中断1的中断服务函数,体现了中断优先和返回
  44. {
  45.     unsigned char n=0;
  46.   for(n=0;n<5;n++)//8位LED全亮全灭5次
  47.   {
  48.     P1=0;//8位LED全亮
  49.         Delay(500);//延时
  50.         P1=0xff;//8位LED全灭
  51.         Delay(500);//延时
  52.   }
  53. }
复制代码



回复

使用道具 举报

6#
ID:155507 发表于 2023-10-25 16:17 | 只看该作者
有免费教学视频

免费教学视频《STC USB型 真1T 8051 单片机原理及应用-STC8H8K64U》

第十三集 中断原理及工作机制一

第十四集 中断原理及工作机制二
回复

使用道具 举报

7#
ID:397054 发表于 2023-10-25 16:31 | 只看该作者
xianfajushi 发表于 2023-10-25 07:55
这是回复题主的代码,目的是观察各中断及返回用的,可以借鉴理解中断的作用,我实践是不会这样写的.

【删除using 0否则无法返回主函数外中断0的中断服务函数】
——实际上不必删除,只要不使用0且不使用另外一个using号就行,即两个中断都不能using 0,且不能相同,原理是明了的,main肯定使用的是0区,中断函数再使用0区肯定破坏了现场,返回是反回了,但现场变了。两个中断函数using号相同时只要不嵌套,运行是正常的,一嵌套也不行,原理相同。所以using确实是不必要的,可以都删除。
回复

使用道具 举报

8#
ID:624769 发表于 2023-10-26 20:09 | 只看该作者
鹈鹕 发表于 2023-10-25 16:31
【删除using 0否则无法返回主函数外中断0的中断服务函数】
——实际上不必删除,只要不使用0且不使用另 ...

Main 函数不一定是 0 区, 要看你Startup 如何设置。

using 号是可以相同的。
在C中 using 号相同 仅仅是降低了效率而已。
在A中 using 号相同 会考验你保护现场的能力。
回复

使用道具 举报

9#
ID:73992 发表于 2023-10-26 21:11 | 只看该作者
中断的普通用法的确太过于平庸,在中断程序中修改栈内容,并且修改中断返回地址是高级用法。我记得在《权威指南》这本书上说艺高人胆大的人会用这种方法。我想那种乐趣应该是可以追求一下的。等手头这个项目做完,我也要感受那种乐趣
回复

使用道具 举报

10#
ID:397054 发表于 2023-10-27 22:02 | 只看该作者
188610329 发表于 2023-10-26 20:09
Main 函数不一定是 0 区, 要看你Startup 如何设置。

using 号是可以相同的。

如果不设置呢?我上面不是说了【两个中断函数using号相同时只要不嵌套,运行是正常的】,但发生了嵌套会怎样?——基本上可以肯定不正常。
回复

使用道具 举报

11#
ID:397054 发表于 2023-10-27 22:43 | 只看该作者
188610329 发表于 2023-10-26 20:09
Main 函数不一定是 0 区, 要看你Startup 如何设置。

using 号是可以相同的。

“在A中 using 号相同 会考验你保护现场的能力。”

——“A”是指的什么?,“C”指的是C语言吧,用C编程,两个不同级别的中断使用同一个using号多半不行,5楼程序就是个实例,中断0用的是using 0,这肯定是和主函数冲突,所以“无法返回”,改成using 2或using 3完全就正常了。所谓的“无法返回”是表面现象,实际上返回了,因为根本没有理由不返回,只是返回后环境变了,CPU进入半死机状态,看着像没返回。

“在C中 using 号相同 仅仅是降低了效率而已。”
这句话怎么理解?“降低了效率”指的是什么?原理是什么?

using 号相同可能可以,这恐怕要看编译程序了,keil是不行的,至少我用的这个版本不行,其他的也没用过。
在keil环境中using 号相同只要懂得这个原理,符合一定的规则也可以,即:同优先级的中断可以使用相同的using号,不同优先级的中断,只要能保证不发生中断嵌套也没问题——原理是很清楚的。
回复

使用道具 举报

12#
ID:401564 发表于 2023-10-27 23:58 | 只看该作者
中断:就是暂停当前的事件,去处理中断事件,处理完中断事件,再回来执行刚才正在执行的"当前事件"
你只要知道这个就可以了,其它的就在这个基础之上出来的,会用就行,没什么所谓的"探索"
很多东西都是要结合你所用的单片机的资源来搭配使用的
像STM32这种复杂的中断系统,你能折腾好几天
但是,像有低端单片机,它就一个中断源,两层硬件堆栈,有什么能探索的?
回复

使用道具 举报

13#
ID:624769 发表于 2023-10-28 19:42 | 只看该作者
鹈鹕 发表于 2023-10-27 22:43
“在A中 using 号相同 会考验你保护现场的能力。”

——“A”是指的什么?,“C”指的是C语言吧, ...

我前文中的 C指 C51, A指 A51
C51 编程时,中断函数后面跟的 using x 主要是用来分配 RS0~RS3 这4个通用寄存器组的。
如果你主程序 用的默认RS0,  而中断函数 用的 RS1 (USING 1指定),则编译后,会直接利用 PSW = 0x08, 把寄存器组切换到 RS1 组,退出中断时,通过 POP PSW 来还原寄存器组,恢复部分现场。来实现高效率中断。
而,如果你主程序用的 RS0, 中断也使用 RS0 (USING 0), 那么,编译时,KEIL会 很聪明的 把通用寄存器组的 R0~R7  依次 PUSH 的堆栈里,确保可以返回时恢复现场,当然,这样的操作会降低中断的效率。
然后,到了不同优先级的中断了。由于KEIL无法判断 嵌套中断,因此,如果低优先级中断,和高优先级中断使用相同的寄存器组,的确会产生低优先级中断的现场被破坏的情况。如果自己在这方面没有把握的的话,不建议使用 using 参数,可以在 设置中 用 ONEREGBANK 来屏蔽代码中的 Using发生作用。毕竟using 的最初设计的应用场景是 基于A51的应用场景。所以在C51中,还是有不少缺陷的。
回复

使用道具 举报

14#
ID:883242 发表于 2023-10-29 02:49 | 只看该作者
汇编有两种写法,教科书里面讲的是absolute location,这种写法所有变量都是作者自己指定的绝对地址,using这个关键字毫无意义。另一种是relocatable,变量地址都是用ds这样的关键字定义的,在汇编期间变量地址都不确定,只有连接期间才会确定,using这个关键字是让linker回避已经使用过的register bank用的,但是这种写法没见过中文书籍讲解,只能查C51的帮助文件,讲汇编的那个。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表