您的位置 首页 知识

MCS-51体系中止优先级的软扩展

摘要:鉴于MCS-51系统只提供“二级中断嵌套”,提出扩展51系统中断优先级的纯软件方法。其利用51系统内建的中断允许寄存器IE和中断优先级寄存器IP,通过屏蔽字机制来实现;以

摘要:鉴于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履行进程中,体系仍可呼应其它中端源提出的中止恳求,以便完成中止嵌套。这样就到达了避免同级和初级优先级中止的意图。

1.jpg

高优先级的中止源能够提出中止恳求,但未必会被当即呼应。因为在当时战略下,尚不能完成真实的“中止嵌套”(即高优先级的中止服务例程可中止低优先级的中止服务例程而嵌套履行),而仅有最高优先级的中止(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体系中止优先级的“真实”扩展。

2.jpg

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

3.jpg

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_CRIT%&&&&&%AL();//开中止 } //仅含一条指令: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级。该办法不需添加任何硬件,且所需的额定资源耗费很小,运用也十分简略,不会给用户添加编程担负。实践运用标明,这种办法是可行的和有用的。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/291975.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部