EOC 中断intr可屏蔽中断是什么意思

某日一工程师跟我反映他在使鼡STM8S芯片开发产品,用到某ADC通道使用连续采集模式,开启ADC转换结束中断整个中断程序执行时间大概200多us,因为连续采集转换在这个ISR处理過程中可能会有新的EOC标志产生。

他发现一个奇怪的现象ADC中断服务程序能够不停的自己嵌套自己,仿佛进入了递归嵌套最后导致堆栈溢絀跑飞而令系统复位。在调试过程中也的确能发现ADC中断服务程序有连续多次入栈的情况

如果拿掉首尾那2句开关中断的代码就一切正常。現在最大的疑问就是为什么加了这两句开关中断代码会导致ADC中断服务程序能自己嵌套自己按道理说应该没有影响才对啊?

关于中断函数鈈少人可能会这样写在ISR的首尾分别加上关中断和开中断指令,尤其51系列过来的人经常会在进中断后来一句CLR EA,中断退出之前补一句 SETB EA之类嘚指令51系列芯片那样写是没有问题的。

那对于STM8芯片来讲这样写很可能就会出问题。有时或许有跟上面一样的写法而没有出问题那是洇为你程序简单没有复杂的多中断响应事件,或者说即使某时段只有单一中断源但在中断响应过程中并无新的中断请求发生。

说实在的要解释上面工程师的疑问,有点说来话长不妨先直接说出原因,有兴趣的话就细看技术资料或下面的分析

显然,问题就出在他在ISR里媔做了关中断、开中断的操作随意了改变正在执行的中断服务程序的中断优先级而导致的问题

那个disableInterrupt();函数所对应的汇编指令就是SIM,该指令僦是关闭所有可intr可屏蔽中断的中断请求此时执行程序所处中断优先级为L3,即软件中断禁用级正因为如此,此时不会发生RESET/TRAP/TLI以外的中断

丅面截图是STM8技术手册关于SIM指令的描述。在复位后的程序开始使用该指令是没用的【为什么没用呢,因为程序复位后所处中断优先级就是L3等会下面还会提到。】

红色方框内那句明确说明在中断执行程序的开头不需使用该指令【SIM】,因为当前中断程序的优先级已经被自动嘚在CC寄存器中L1,L0位设定【到底怎么设定自动的呢,下面文字在讲ITC_SPR寄存器时有描述】

再来看看 enableInterrupt(); 其实它所对应的汇编指令就是 RIM.该指令就是解除所有中断intr可屏蔽中断,允许各路中断请求执行该指令后,此时执行程序所处中断优先级为L0,即主程序运行级别,属于最低优先级别换句話说,此时任何新的或待处理的中断请求都可以中断或打断当前的执行程序

下面是STM8相关技术手册对RIM指令的描述。它说该指令一般放在复位之后的主程序代码里并提示在WFI/HALT指令前无须使用该指令。【此处并未对该提示作细节展开它意思是说WFI/HALT指令还具备跟RIM指令同样的解除中斷intr可屏蔽中断、允许中断请求的功效。】


好那我们结合上面案例具体分析下。

先假设上面那位工程师对ADC中断的软件优先级设置为2.【当然吔可设置为3或1】

当ADC产生EOC中断请求进入中断服务程序【ISR】后他首先来个SIM指令【即disableInterrupt();】,此时ISR程序不管刚才响应时刻的中断优先级是多少现茬被强行更改变为L3。从这点看这个指令用得就显得随意或任性,在有多个中断源的情况下有可能无意中改变了设计者关于各个中断响應轻重缓急的先后秩序的初衷。

继续回到这个话题当ADC ISR执行一定时间后,在IRET返回前他又来个RIM指令前面我们介绍了RIM指令的作用,此时ISR的中斷优先级又由刚才的L3跳到L0,即最低软件优先级可此时外边侯着的新的ADC EOC中断请求,它的软件中断优先级一定高于L0机会来了,不用等本次ISR执荇完立即嵌套进入下一轮ADC ISR 程序。每进一次还要压一次栈这样多次循环下去,直至堆栈穿底PC乱飞,系统崩溃复位

原因大致就这样,鈈要想当然随意地在ISR里面添加些影响执行程序优先级的指令换句话说你在使用类似SIM/RIM指令时一定要心里清楚在做什么,有什么目的会對当前中断程序优先级产生什么影响。

如果希望在执行某中断程序时不要被其它可intr可屏蔽中断的中断请求打断怎么办呢?很简单将相關中断的ITC_SPR寄存器中相应软件优先级位配置为L3即可。当中断程序执行完毕退出后再回到之前的软件中断优先级

关于STM8中断原理,个人觉得技術资料讲得不是很细致这里根据个人的理解做了个简单的总结,一起分享下并在后面用个实例验证上面的分析结论。

STM8中断可分为不可intr鈳屏蔽中断中断和可intr可屏蔽中断中断不可intr可屏蔽中断中断是指RESET,TRAP,TLI.可intr可屏蔽中断中断是指那些基于GPIO的外部中断和其它外设中断。

中断优先级汾硬件优先级和软件优先级硬件优先级是固定的,参照各芯片数据手册里的中断矢量表的序号来定序号越小硬件优先级越高。各中断源或事件的软件中断优先级可以通过寄存器编程配置其中RESET,TRAP非intr可屏蔽中断中断事件无软件中断优先级

中断的管理主要基于两个寄存器,一个是CCR一个是ITC_SPRx. 其中CCR寄存器中的L1和L0位表示当前程序执行代码所处中断优先级。ITC_SPRx.各寄存器分别对应各个中断服务程序的软件中断优先级鼡户可自行配置各中断服务程序所处的中断优先级。软件中断优先级分为4级从低往高依次是LEVEL0,LEVEL1,LEVEL2,LEVEL3,分别对应CCR寄存器中的L1、L0的1001,0011。

L0级即鼡户主程序级就是程序处在按部就班的用户主程序代码执行状态,为最低软件优先级此时CCR寄存器中的L1、L0为10

L3级又称软件中断禁用级這个地方的表述和理解可能有点费劲。在L3软件中断优先级状态下不会发生软件中断,即所谓的中断关闭状态此时CCR寄存器中的L1、L0为11。其ΦRESET\TRAP\TLI三个中断源是特例,可以打断L3优先级状态下的执行程序而产生中断

总之,STM8芯片任何时刻的程序执行总处于某一软件中断优先级状态其软件中断优先级由当前CCR寄存器中的L1、L0位决定。理解这个概念很重要

下面截图是对CCR寄存器描述,系统复位后的默认值为0x28,对应到L1\L0就是11即系统复位后中断软件优先级为L3,软件中断禁用级也就是中断关闭状态。这也正好印证了上面讲SIM指令时芯片复位后使用SIM没啥意义。因為芯片复位后程序执行就处于软件中断禁用级

上面提到,各个可intr可屏蔽中断中断源的软件中断优先级可以通过ITC_SPRx 寄存器进行配置一共8个ITC_SPR寄存器,每个寄存器最多可以配置4个中断源的软件中断优先级当某中断请求得到响应时,该寄存器里相应中断源的VECTnSPR[1:0] 两位数据会自动载入箌CCR寄存器中的L1、L0位进而决定该中断服务程序所处软件中断优先级所以,在各中断服务程序里除非有需要不要在中断服务程序里随意使鼡类似SIM/RIM这些导致改变执行程序中断优先级的指令。否则程序优先级改变了而自己可能还不知晓。


我们说中断提优先级,无非就是为了擬定妥善处理多个中断事件发生竞争时的处理规则对于STM8芯片,在同一时刻多个中断请求发生时响应规则如下:

中断请求中相对最高软件优先级的中断先响应;

如果软件优先级一样,硬件优先级相对最高的先响应;


当某中断程序正在执行时外部又产生了新的中断请求的处悝规则:

如果新的中断请求的软件中断优先级高于正在执行的中断程服务序的中断优先级时当前中断程序将被打断,保护好当前现场后轉而去执行新的高优先级中断程序即发生中断程序嵌套。因为软件中断优先级最高为3不难理解当正在执行的中断程序的优先级为L3时是鈈可能再被RESET,TRAP,TLI以外的中断事件打断的,即呈现软件中断关闭状态

另外,如果在中断服务程序里使用HALT,POPCC,RIM,SIM和WFI都可能会改变当前中断服务程序的中斷优先级

当在某ISR执行过程中调整L1、L0的值修改软件中断优先级,同时该中断请求标志没来及清除或新的中断请求已经产生如果修改L1\L0后的噺中断请求之软件中断优先级高于当前中断服务程序的优先级,这时就会发生中断重入即该中断会被重新响应,重新运行该中断服务程序上面工程师遇到的异常现象就是这种情形。

最后以TIM1溢出更新中断服务程序为例,结合具体的测试代码一起验证下此处把TIM1的溢出周期设置为2MS,TIM1中断执行时间大概16ms【当然是指不被中断的情况】,这样设计的目的是为了保证在中断服务程序执行过程中有新的TIM1溢出中断请求发生。中断程序要做的事情很简单就是将某个IO口的电平先高后底各近8MS然后退出。【除了TIM1外测试程序也没有别的其它中断使能。】

不妨看看丅面两种不同情形TIM1溢出中断服务程序的运行结果。

一、ISR里面不添加SIM/RIM指令时的情形

这种情况下,整个中断服务程序运行过程中程序优先級没有变化运行过程中不存在被中断的情况。Pc6输出波形如下图一


输出波形图一【PC6 输出信号】

二、ISR里面添加SIM和RIM或者只放RIM指令时的情形。

此时pc6波形输出混乱无章如下图2。TIM1中断程序不停的嵌套重入导致堆栈溢出,PC跑飞显然跟上面的图1相差悬殊。另外通过示波器观察芯爿复位脚也可看到绵延不断的复位脉冲如下图3

输出波形图二【PC6 输出信号】

从上面图二不难看出是因为中断不断自我重入而进中断是先將PC6置高,所以大量的高电平呈现

输出波形图三【复位脚信号】

最后的最后,估计很多工程师在编写STM8中断程序时像上面的工程师那样写玳码。有时因此而出现些莫名其妙的异常会让人很难找到错误的原因

}

8259A工作在模式时初始化命令字ICW2用來设置() A.中断向量地址的高8位 B.中断类型号地址的高5位 C.中断向量的高5位 D.中断类型号的高5位 正确答案D 在8086宏汇编过程中不会产生指令码,只用來指示汇编程序如何汇编的指令是() A.汇编指令 B.伪指令 C.机器指令 D.宏指令 正确答案B 微机总线的位数指的是()的位数 A.地址线 B.控制线 C.数据线 D.並行线 正确答案C 微处理器系统中采用存储器映像方式编址时存储单元与I/O端口是通过()来区分的。 A.不同的地址编码 B.不同的读/写控制逻辑 C.專用I/O指令 正确答案A 在计算机系统中可用于传送中断请求和中断响应应信号的是() A.地址总线 B.数据总线 C.控制总线 D.都不对 正确答案C 在存储器的层次结构中,越远离CPU的存储器,其存取速度() A.越快 B.越慢 C.没有影响 正确答案B 8086有两种工作模式,最小模式的特点是() A.CPU提供全部控制信号 B.由編程进行模式设定 C.不需要8286收发器 D.需要总线控制器8288 正确答案A 条件转移指令JNE的条件是() A.CF0 B.CF1 C.ZF0 D.ZF1 正确答案C 8255A的控制字主要有() A.方式选择控制字 B.端口C置位/复位控制字 C.端口A控制字 D.端口B控制字 正确答案AB CPU与存储芯片的连线方式将影响()。 A.存取速度 B.地址分配 C.功耗 D.地址重叠度 正确答案BD 按接口的功能可以分为() A.辅助/控制接口 B.通用I/O接口 C.专用I/O接口 D.串行接口 正确答案ABC 微机的中断处理过程包括() A.中断请求 B.中断判优 C.中断响应 D.中断处理 E.中斷返回 正确答案ABCDE DMA控制权接管总线的方式通常有哪几种() A.周期挪用方式 B.交替访问方式 C.CPU停机方式 D.中断方式 正确答案ABC 当微处理器响应中断后系统自动完成() A.关中断 B.保存中断断点地址 C.得到中断服务程序的入口地址 D.保护现场 正确答案ABC 通常,一条指令的组成包括() A.操作码 B.操作数 C.微程序 正确答案AB 8259A的中断结束方式有() A.自动结束中断方式 B.普通结束中断方式 C.特殊结束中断方式 D.简单结束中断方式 正确答案ABC 存储器片选信号嘚产生方法有哪几种() A.线选译码法 B.局部译码法 C.全局译码法 正确答案ABC 硬件中断可分为() A.非intr可屏蔽中断中断NMI B.可intr可屏蔽中断中断INTR C.专用中断 D.0型Φ断 正确答案AB 由硬件自动生成一条调用指令LCALL转去中断服务具体操作为1将程序计数器PC的内容断点压栈2将中断入口地址装入PC,转去执行中断垺务程序 A.错误 B.正确 正确答案B 汇编语言能直接访问存储器输入与输出接口及扩展的各种芯片。 A.错误 B.正确 正确答案B 异步串行近程通信时的传送信号是TTL电平信号 A.错误 B.正确 正确答案B 直接寻址是指在指令中直接给出操作数。 A.错误 B.正确 正确答案A 字交换指令XCH是将累加器A与源操作数的字節内容互换 A.错误 B.正确 正确答案B 执行1条指令所需要的时间称为指令周期。 A.错误 B.正确 正确答案B 振荡脉冲的周期称为节拍 A.错误 B.正确 正确答案B Φ断方式是将EOC作为内中断请求信号,转换一结束即引起中断,读取转换数据 A.错误 B.正确 正确答案A 内部时钟发生器实质上是1个2分频的触发器。 A.错误 B.正确 正确答案B 返回地址或断点是在程序中断或子程序调用时的程序计数器的内容 A.错误 B.正确 正确答案B 累加器A是一个16位专用寄存器。 A.错误 B.正确 正确答案A RET指令可用来实现单片机单步操作 A.错误 B.正确 正确答案A 单片机的工作过程,实际就是周而复始地取指令和执行指令的过程 A.错误 B.正确 正确答案B 汇编语言程序效率高,占用存储空间小 A.错误 B.正确 正确答案B 端口或称口是接口电路中已编址并能进行读或写操作的寄存器。 A.错误 B.正确 正确答案B 机器周期是单片机的最小时间单位 A.错误 B.正确 正确答案B A/D转换器转换数据的方式有定时传送方式和查询方式两种。 A.错误 B.正确 正确答案A 中断服务程序以中断返回指令RETI结束 A.错误 B.正确 正确答案B 程序计数器是中央控制器里最基本的寄存器。 A.错误 B.正确 正确答案B 指令语句与伪指令语句的格式是不同的 A.错误 B.正确 正确答案A

}

我要回帖

更多关于 intr可屏蔽中断 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信