保存桌面快捷方式 - - 设为首页 - 手机版
凹丫丫旗下网站:四字成语大全 - 故事大全 - 范文大全
您现在的位置: 范文大全 >> 理工论文 >> 电子通信论文 >> 正文

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


件赋以最低的优先级N-1(N为中断源个数),并使之与系统中最后被查询的中断源(串口中断<S>)相关联,即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”分别代表当前函数返回地址的高位字节和低字节(栈中的地址是以小端字节序<Little Endian>方式存储,这是C51中唯一的例外,而所有其它多字节数据则皆以大端字节序<Big Endian>方式存储)。如果不这样做,而是定义两个全局变量来保存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<reg51.h>

//静态(局部)函数声明

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

《MCS-51系统中断优先级的软扩展(第3页)》
本文链接地址:http://www.oyaya.net/fanwen/view/167048.html

★温馨提示:你可以返回到 电子通信论文 也可以利用本站页顶的站内搜索功能查找你想要的文章。