MCS-51系统中断优先级的软扩展

最新更新时间:2014-05-18来源: 互联网关键字:MCS-51  系统中断 手机看文章 扫描二维码
随时随地手机看文章

鉴于MCS-51系统只提供“二级中断嵌套”,提出扩展51系统中断优先级的纯软件方法。其利用51系统内建的中断允许寄存器IE和中断优先级寄存器IP,通过屏蔽字机制来实现;以C51的形式,给出这种扩展方法的函数库实现,为该方法的使用赋予友好、简洁的用户接口。 关键词:MCS-51单片机 中断优先级 软扩展 C51 引言 众所周知,MCS-51系统只提供“二级中断嵌套”,而大多数嵌入式系统希望有多于两级的优先级别。因为一般来说,系统都有掉电中断,且应置为最高优先级,这样所有其它中断只能共用一个最低优先级,如此,往往不能满足实际的逻辑需求。为了使系统具有多于两级的中断优先级别,可以利用8259A之类的中断控制芯片实现中断优先级的硬扩展,但却增加了系统的造价和复杂性。因复杂性的提高,系统的可靠性将受到影响。本文提出一种扩展MCS-51系统中断优先级的纯软件方法,不需增加任何硬件,且所需的额外资源消耗也很小。实际应用表明这种方法是可行的和有效的。 1 MCS-51的中断系统简介 MCS-51系列单片机允许有五个中断源,提供两个中断优先级,可实现二级中断嵌套。这两级优先级遵循下述规则:仅高优先级中断源可中断嵌套低优先级中断源。为实现这一规则,中断系统内部包含两个不可寻址的优先级状态触发器。当特定优先级的某中断源被响应时,相应的触发器即被置位,直到执行了RETI指令后,这个触发器才复位。在此期间,同级和低级中断将被防止。中断源的中断请求能否得到响应,受中断允许寄存器IE的控制。每个中断源的优先级可通过对中断优先级寄存器IP编程来设定:或最低,或最高。同一优先级中的各中断源同时请求中断时,由内部查询逻辑确定响应次序。查询次序依次为:外部中断 0(X0)、定时器中断0(T0)、外部中断1(X1)、定时器中断1(T1)、串口中断(S)。如果当前指令是RETI或是对IE、IP操作的指令,将封装CPU对中断的响应,且必须再执行完一条指令之后才会响应中断。 2 中断优先级软扩展的方法 首先,给出软扩展的第一种方法,并分析其特点,指出其存在的缺陷。然后,基于对方法一的不足之处,给出不断完善的方法二、方法三。其中方法二是对方法一的完善,方法三是对方法二的完善,并最终解决了方法一、二中的缺陷,实现了真正的中断优先级的软扩展。 2.1 方法一 此法仅使用和系统的中断允许寄存器IE,通过中断屏蔽字机制,以使不同的中断源具有不同的逻辑中断优先级(下文中的“优先级”如不加说明即指“逻辑中断优先级”)。 不失一般性,不妨令8051系统的五个中断源——外中断0(X0)、定时器中断0(T0)、外中断1(X1)、定时器中断1(T1)及串口中断(S),有如表1所列的优先级。(实际应用中,视具体情况,赋予不同中断源以适当的优先级。) 其中,“0”代表最高优先级,“4”代表最低优先级。 首先,给设定了优先级的诸中断源赋以二级“物理中断优先级”:将优先级最高的中断源(X1)在中断优先级寄存器IP中的相应位(PX1)置1,而令IP中的其它相关位(PT1、PT0、PS、PX0)为0。 其次,给设定了优先级的各中断源分配适当的“中断屏蔽字”。其基本思想是屏蔽同级和低级中断。具体分配过程如下:优先级为k(0≤k≤N-1,N为中断源数量)的中断源的“中断屏蔽字”为:优先级为x(x∈[k,N-1],即同级和低级)的中断源在IE中的对应位置0,优先级为y(y∈[0,k-1],即高级)的中断源在IE中的相应位置1而得的位组字节。当然,IE的EA位(CPU中断允许标志位)始终为1. 对于表1所列的中断优先级分配情况,各中断源的“中断屏蔽字”配置如表2所列。 表1 中断源的优先级分配表 中断源 X1 T1 T0 S X0 优先级 0 1 2 3 4 最后,给各中断源的ISR(Interrupt Routine,中断服务例程)加以如下所示的外壳(Assembly形式的)。不妨以定时器0(T0)为例: CSEG AT 8%26;#215;1+3 ;定义绝对段,设置断向量 JMP T0_ISR_SHELL ?PR?TO_ISR_SHELL?XX SEGMENT CODE ;声明再定位段 T0_ISR_SHELL: PUSH IE ;保存IE MOV IE,#TO_INT_MASK ;设置当前中断屏蔽字 CALL ResetIntSys:复位中断系统 CALL T0_ISR:调用中断服务例程的主体 POP IE ;恢复IE RET 这里,T0_ISR为定时器0(T0)的ISR的主体部分。其应以一般函数的形式,用汇编或C编写。ResetIntSys为仅含一条中断返回指令(IRET)的函数,即ResetIntSys:RETI。其用于复位中断系统,以使在相应ISR执行过程中,系统仍可响应其它中端源提出的中断请求,以便实现中断嵌套。这样就达到了防止同级和低级优先级中断的目的。


高优先级的中断源可以提出中断请求,但未必会被立即响应。因为在当前策略下,尚不能实现真正的“中断嵌套”(即高优先级的中断服务例程可中断低优先级的中断服务例程而嵌套执行),而仅有最高优先级的中断(X1)才可以实现这种真正的“中断嵌套”。因为在8051系统里,中断能否嵌套仅取决于其相应的“物理中断优先级”(各中断源的物理中断优先级由中断优先级寄存器IP中的相应位决定,且仅有二级)。下面分三种情况说明方法一的特点和不足: ①当外部中断1(X1,其具有最高的逻辑中断优先级和最高的物理中断优先级)提出中断请求时,系统将立即响应,而不管系统此时忙否。如果此时 系统正在执行其它中断的ISR,X1的ISR将以嵌套形式执行,因为其它中断湖泊的物理中断优先级都为最低(51系统仅有两级物理优先级:最高或最低)。 ②当定时器0(T0,其优先级为2)的中断请求正被响应时,来自串口(S,其优先级为3)和外部中断0(X0,其优先级为4)的中断请求将被禁止;而只允许外部中断1(X1,其优先级为0)和定时器1(T1,其优先级为1)提出中断请求。如果是X1提出中断请求,则X1的ISR将立即嵌套执行;如果是T1 提出,尽管其优先级高于当前中断T0,但因其物理中断优先级与T0一样(同为最低),故而将不会像X1那样被系统立即响应,并嵌套执行,而只能等待,直到 T0的中断服务例程执行完毕。 ③如果在串口(S,其优先级为3)中断正被响应过程中,定时器1(T1,其优先级为1)与定时器0(T0,其优先级为2)分别提出中断请求。由于它们有高于S的优先级,所以系统允许它们提出中断请求;但因其物理优先级与S一样,故而直到S的中断服务例程执行完毕,系统才会受理T1与T0的中断请求。逻辑上,由于T1具有高于T0的优先级,所以T1应先为系统响应。但因物理优先级相同时,中断请求的响应次序取决于内部查询顺序,而T0先于T1,所以实际上 T0先 系统响应,即出现了“优先级反转”的问题。 可见,方法一虽然可以部分地达到“扩充中断优先级”的目的,但其存在两个问题: *某些高优先级中断不能中断嵌套低优先级中断; *会出现“优先级中反转”。 方法二和方法三是针对方法一的这两个不足而提出的,并最终实现对51系统的中断优先级的真正扩展。 2.2 方法二 该方法是在方法一基础上,为解决“优先级反转”的问题,而实施的简单策略而得。 根据方法一中对“优先级反转”问题的分析可知,出现该问题的原因是:各中断源的逻辑优先级与其内部查询顺序不一致。只要在系统设计时,兼顾中断源相关事件的紧迫程度与中断源的内部查询逻辑:将最紧迫的事件(如掉电)赋以最高的优先级0,并使其与系统中的最先被查询的中断源(外部中断0)相关联;使次紧迫的事件的优先为1,并使之与系统内第二个被查询的中断源(定时器0)相关联,即51系统内的各中断源应有表3所列的优先级。 表3 中断源的优先级分配 中断源 X0 T0 X1 T1 S 优先级 0 1 2 3 4 如此,即可解决“优先级反转”的问题。 2.3 方法三 本法是在方法一、二的基础上,针对“某些高优先级中断不能中断嵌套低优级中断”的问题,引入相应的策略,以实现对51系统中断优先级的“真正”扩展。


3 优先级软扩展的函数库实现 为了真正扩展51系统的优先级,各中断源的优先级、优先级屏蔽字、中断屏蔽字应是确定的,如表3、4所列。C51编写断服务例程时,应给出相应的中断源编号(中断号)。特定中断源有特定的中断号,而此中断号恰与各中断应有的优先级一致。 本文用C51,以函数库的形式实现方法三所述的策略,其包含两个文件:ExtIntPri.H、ExtIntPri.C。须要指出,为使优先级的设置和恢复具有原子性以防出现混乱,应对SetPriority()和ResetPriority()作临界处理,以使其不被“再入”访问。另外,应对系统栈作调整。如图1所示,其中“1”代表SetPriority()所作的调整,其将IP、IE保存于系统栈中;“2”代表ResetPriority()所作的调整,其从系统栈中恢复IE、IP;“HAddr”、“LAddr”分别代表当前函数返回地址的高位字节和低字节(栈中的地址是以小端字节序方式存储,这是C51中唯一的例外,而所有其它多字节数据则皆以大端字节序方式存储)。如果不这样做,而是定义两个全局变量来保存IE、IP,由于SetPriority()和ResetPriority()都要访问这两个全局变量,而这两个函数又应在ISR的开关和结尾处被分别调用,从而使ISR成为临界区,而不可被其它ISR中断,这将使优先级的存在失去意义。 //ExtIntPri.H extern void SetPriority(unsigned char); extern void SetPriority(unsigned char); extern void ResetPriority(void); //ExtIntPri.C #pragma src #include "ExtIntPri.H" #include //静态(局部)函数声明 static void ResetIntSys(void);//仅含一条指令:RETI //宽两个宏用作“临界区”的进入区和退出区 #define ENTER_CRITICAL()EA=0//关中断,以防临界再入 #define EXIT_CRITICAL() EA=1 //中断屏蔽字和优先级屏蔽字的宏定义,如表3所列。 #define S_INT_MASK 0x8F//;1-01111B //… #define S_PRI_MASK 0x0F//;---01111B //… //先调整系统栈以保存IP、IE,其过程如图1所示,再为给定中断 //(prio也是中断号)设置优先级 void SetPriority(unsigned char prio){ ENTER_CRITICAL();//关中断 #pragma asm POP ACC //弹出返回地址的高位字节HAddr POP B //弹出返回地址的低位字节Laddr PUSH IP


PUSH IE //EA= =0 PUSH B //LAddr进栈 PUSH ACC //HAddr进制 #pragma endasm switch(prio){ case 0:IP=X0_PRI_MASK;IE=X0_INT_MASK; break; //… case4:IP=S_PRI_MASK;IE=S_INT_MASK;break; } ENTER_CRITICAL();//这里中断被打开,故再关中断 ResetIntSys(); EXIT_CRITICAL();//开中断 } //从系统栈中恢复IE、IP,其过程如图1所示。该函数应在退出ISP时调用 void ResetPriority(void){ ENTER_CRITICAL(); #pragma asm POP ACC //弹出返回地址的高位字节HAddr POP B //弹出返回地址的低位字节LAddr POP IE //EA= =0 POP IP PUSH B //LAddr进栈 PUSH ACC //Haddr进栈 #pragma endasm EXIT_CRITICAL();//开中断 } //仅含一条指令:RETI,用以复位中断系统,以便系统在ISR执行过程中可响应其它中断 void ResetIntSys(void){ char code reti=0x32; //32H为RETI的机器码 (((void)(code*)(void))(%26;amp;reti))();//将reti的地址强制转化为函数指针 } 使用时,只需将ExtIntPri.H头文件用#include加入相应源文件(当然,应将ExtIntPri.C的目标文件<*.Obj>、库文件<*.lib>或汇编源文件<*.src>加入当前工程)。不妨以定时器0(T0)为例,其中断号为1,故优先级亦应为1,如下所示: ////Test.C #include "ExtIntPri.H" //… void T0_ISR(void)interrupt 1 using 2{ SetPriority(1); //… ResetPriority(); } 如此,T0即有了次最高优先级——1。 

结语 使用本文所述的“软扩展”方法,可以将MCS-51系统的中断优先级扩展到5级。如果所用51系统的中断源个数为N(N≤8),只须对上述方法稍作修改即可将其优先级扩展到N级。该方法不需增加任何硬件,且所需的额外资源消耗很小,使用也非常简单,不会给用户增加编程负担。实际应用表明,这种方法是可行的和有效的。

关键字:MCS-51  系统中断 编辑:探路者 引用地址:MCS-51系统中断优先级的软扩展

上一篇:基于AD9911频率源的设计与实现
下一篇:I2C串行芯片X1288及其在电子电能表中的应用

推荐阅读最新更新时间:2023-10-12 22:40

MCS-51系列单片机寻找操作数存放单元的地址的方式
寻找操作数存放单元的地址的方式,共6种方式。 1.立即数寻址 所要找的操作数是一二进制数或十进制数,出现在指令中,用“#”作前缀 MOV A,#20H 2.寄存器寻址 操作数存放在工作寄存器R0 ~ R7中,或寄存器B中。 MOV A,R2 3.直接寻址 指令中直接给出操作数的地址。 MOV A,30H MOV 30H,DPH 4.寄存器间接寻址 指令中寄存器的内容作为操作数存放的地址,指令中间接寻址寄存器前用“@”表示前缀。 MOV R0,#30H MOV A,@R0 MOV A,#20H MOV R1,#40H MOV @R1,A 5.变址寻址 操作数地址 = 变地
[单片机]
C51-关于中断系统
中断系统
[单片机]
C51-关于<font color='red'>中断</font><font color='red'>系统</font>
STM32系统中断
关于中断分组: STM32有多种中断分组,各系列可能分组方式不一样。但是,分组一般就是规定了本组有几个抢占优先级,几个子优先级。在组设置寄存器中设置好组号后,所有的中断都要按照这个来设置。如果更改了组号,那么其他的中断也都要按照这个组号来配置了。所以,设置好组号后不要再随便改了,如果要改,就要看看已经配置好的中断是否满足设置需求,是否优先级数值超出了规定值。 另外:一个组的抢占优先级和子优先级之积是16.因为一共是4个位。抢占优先级0位(1个),子优先级就4位(16个);抢占优先级1位(2个),子优先级就3位(8个),以此类推。 抢占优先级 代表的优先级最高,高优先级可以嵌套低优先级的中断。子优先级不能嵌套,需要等上一个中断完成后
[单片机]
单片机(AT89C51)中断系统详解和中断系统应用实验
什么叫做单片机的中断? CPU暂时中止其正在执行的程序,转去执行请求中断的那个外设或事件的服务程序,等处理完毕后再返回执行原来中止的程序, 叫做中断。 为什么要设置中断? ⑴ 提高CPU工作效率 ⑵ 具有实时处理功能 ⑶ 具有故障处理功能 ⑷ 实现分时操作 中断源 中断源是指能发出中断请求,引起中断的装置或事件。 80C51单片机的中断源共有5个,其中2个为外部中断源,3个为内部中断源: ⑴ INT0:外部中断0,中断请求信号由P3.2输入。 ⑵ INT1:外部中断1,中断请求信号由P3.3输入。 ⑶ T0:定时/计数器0溢出中断,对外部脉冲计数由P3.4输入。 ⑷ T1:定时/计数器1
[单片机]
单片机(AT89C51)<font color='red'>中断</font><font color='red'>系统</font>详解和<font color='red'>中断</font><font color='red'>系统</font>应用实验
STM32的嵌套中断系统NVIC和RCC详细整理
STM32的嵌套中断系统NVIC和RCC详细整理 用的是stm32f103的最新3.5的库。 一、综述: 1、STM32 (Cortex-M3) 中的优先级概念 STM32(Cortex-M3)中有两个优先级的概念:抢占式优先级和响应优先级,也把响应优先级称作 亚优先级 或 副优先级 ,每个中断源都需要被指定这两种优先级。 1. 何为占先式优先级(pre-emption priority) 高占先式优先级的中断事件会打断当前的主程序/中断程序运行 抢断式优先响应,俗称中断嵌套。 2. 何为副优先级(subpriority) 在占先式优先级相同的情况下,高副优先级的中断优先被响应
[单片机]
MCS-51系列单片机在SDH系统中的应用
  摘 要: 介绍了一种采用MCS-51系列兼容的Dallas半导体公司的高速DS80C320作为核心器件实现对复杂SDH系统的管理监控方案,以及系统的软硬件设计和实现。     关键词: 单片机 同步数字序列(SDH) 准同步数字序列(SDH) 同步传递模块(STM) 分插复用器(ADM)     同步数字序列SDH(Synchronous Digital Hierarchy)是一种全新的传输网体制,自从90年代初出现以来,SDH以其各方面的优越性迅速成为通信网络的骨干网络。目前世界各国大多以SDH作为通信的骨干网络。在我国,干线网络也基本采用了SDH网络。     SDH系统与原有PDH(Plesinc
[网络通信]
MSP430F5529 番外(三)一些问题解答及中断系统说明
(1)CCSV5中变量长度。 不同的芯片或者不同的编译环境下,变量长度的定义也是不同的。一般情况下,大家对变量长度也都不是很在意。但是,在做测量或者节约内存的时候,就有必要了,否则很可能造成变量溢出或者浪费空间。下表给出常用的几个变量类型的长度:默认值请看下表: (2)大家新建工程的时候,有时候会在工程里面一个个添加很多头文件以及相应的源文件。如液晶显示头文件HAL_Dogs102x6.h,这个头文件很坑爹,想要用它,那么就不得不一个个添加十几个相关联的文件。于是,问题就来了,但你头文件添加太多的时候,编译很可能就会报错: program will not fit into ,意思大概就是内存不够。
[单片机]
MSP430F5529 番外(三)一些问题解答及<font color='red'>中断</font><font color='red'>系统</font>说明
如何利用MCS-51单片机对周期波频率进行测量
对于周期波频率的测量方法很多,但大多是通过测量间接计算频率。本文介绍了用目前应用比较广泛的MCS-51系列单片机对周期波频率进行测量,并通过LED以数字形式直观地示出频率,实现测量的智能化,省去间接对频率计算的麻烦与错误。文章对其测量原理,设计和实现作了说明,介绍了主要程序,并进行了误差分析。 目前单片机广泛应用到国民经济建设和日常生活的许多领域,成为测控技术现代化不可缺少的重要工具。而本文适应这一发展趋势,把MCS-51系列单片机应用于对周期波频率的测量,并通过LED显示器自动显示出来,这对于频率的测量带来了极大的方便。 设计思想 利用施密特触发器将边缘缓慢变化的周期性信号如正弦波、三角波或任意形状的模拟信号变换成同频率
[单片机]
如何利用<font color='red'>MCS-51</font>单片机对周期波频率进行测量
小广播
最新电源管理文章
换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved