微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 51内核单片机中断优先级的理解

51内核单片机中断优先级的理解

时间:11-23 来源:互联网 点击:
由于项目的需要,这两天正好在研究应用层协议的格式与规范,参考了吴老师给的ZLG的RS-485_Guide。
RS-485标准是基于PC的UART芯片上的处理方式(8-N-1格式),只涉及到电气特性规定,而没有对上层协议作出规定,因此,需要用户自己设计网络应用层协议。大部分用户都自行定义自己的应用层协议,或者直接取自部分ModBus协议。国内根据不同的设备类型也颁布了各类通讯协议,如CDT、SC-1801、u4F、DNP3.0 规约和1995年的IEC60870-5-101 传输规约、1997 年的国际101 规约的国内版本DL/T634-1997规约;在电表应用中,国内大多数地区的厂商采用多功能电能表通讯规约(DL/T645-1997)。
主要研究多功能电能表通讯规约(DL/T645-1997),这是江浙沪地区电表厂商的行业标准,利用飞利浦公司的P89LPC931单片机对RS-485的应用层协议进行实现。LPC900 系列单片机是一个基于 80C51内核的增强型单片机。手册里给出了整个通讯程序的实现,程序主要分为三个部分:数据接收部分、命令执行部分、数据发送部分。
通常在串口通信的程序实现中,发送数据一般采用查询模式,接收数据一般采用中断方式。关于接收数据的程序大部分实现是这样的:每次接收中断中只是将接收缓冲区的数据读出,而数据帧协议则交由前台大循环做。但是在ZLG的手册中给出了接收中断程序直接处理数据帧的方式。

图1接收程序流程图(ZLG RS-485_Guide)
接收一个字节通讯函数
原型:uchar Receive_Data();
功能:接收一个字节通讯
入口参数:无
出口参数:返回接收值
********************************************************************/
uchar Receive_Data()
{
RI=0;
while(!RI);
RI=0;
ACC=SBUF;
if(P!=RB8)
{
SP--;SP--;CY=0;return CY;
}
return (ACC);
}


bit Receive_One(uchar *s)
{
uchar CS=0x00,Serial_data;
char i,j;
RI=0;
Serial_data=SBUF;
while(Serial_data!=0xfe)
return 0;
do
Serial_data=Receive_Data();
while(Serial_data==0xfe);
if(Serial_data!=0x68)
return 0;
CS+=0x68;
for(i=0;i<=5;i++)
{
*(s+i)=Receive_Data();
CS+=*(s+i);
}
if(Receive_Data()!=0x68)
return 0;
CS+=0x68;
CS+=(*(s+6)=Receive_Data());
j=*(s+7)=Receive_Data();
CS+=j;
for(i=0;i<=(j-1);i++)
{
CS+=(*(s+i+8)=Receive_Data());
*(s+i+8)-=0x33;
}
if(CS!=Receive_Data())
return 0;
if(Receive_Data()!=0x16)
return 0;
ESR=0;
return 1;
}

串口接收中断服务程序
功能:接收数据
********************************************************************/
void RXD_Int(void) interrupt 4
{
CY=Receive_One(Serial_buf);
if(CY)
Command_status1|=0x04;
}
/********************************************************************

图1是中断处理函数中的接收流程,中断程序如上述。程序在判断出第一个字节是前导字节以后,需要继续判断前导字节,当连续2-4次判断出是前导字节后才会继续往下执行。但是在作第二次前导字节的判断时,Receive_Data()事实上是在当前中断程序中等待下一个接收到的数据,而当接收到下一个数据时,是否会再次发生中断呢?这个问题困惑了我一晚上。按照程序逻辑推理,即假设本程序是无误的基础上(事后证明应该是正确的),第二次中断是不应该发生的,否则将程序无限中断嵌套下去,也得不到帧数据的处理结果。但是在Receive_Data()中的 while(!RI),需要等待的是接收中断标志位置位,也就是说,第二次接收数据完以后串口接收中断标志将被置位,但是中断不嵌套。
以下是我从百度文库里找到的一片关于51系列单片机中断嵌套的文章,给出了比较详细的解释,现将主要的内容摘录如下:
“老的51单片机(80C51系列)有5个中断源,2个优先级,可以实现二级中断服务嵌套。现在很多扩展的51单片机已经有4个优先级(或更多)和更多的中断源了。老的51单片机(80C51系列)有5个中断源,2个优先级,可以实现二级中断服务嵌套。现在很多扩展的51单片机已经有4个优先级(或更多)和更多的中断源了。”
“中断的优先级有两个:查询优先级和执行优先级。”
我们通常所说的中断优先级一般指的是执行优先级,但同一执行优先级的中断也有比较,那就是查询优先级。所谓查询优先级是指在两个同一优先级的中断同时发生时(严格来说应该是在单片机能分辨的同一微小时段内),处理器会按照默认的次序进行中断查询,查询优先级高的中断先运行中断处理程序,而查询优先级低的则中断标志置位,如果高查询优先级的中断运行过程中没有对该标志位作恢复处理,那

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top