您的位置 首页 汽车

51内核单片机中止优先级的了解

由于项目的需要,这两天正好在研究应用层协议的格式与规范,参考了吴老师给的ZLG的RS-485_Guide。RS-485标准是基于PC的UART芯片上的处

因为项目的需求,这两天正好在研讨使用层协议的格局与标准,参阅了吴教师给的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次判别出是前导字节后才会持续往下履行。可是在作第2次前导字节的判别时,Receive_Data()事实上是在当时中止程序中等候下一个接纳到的数据,而当接纳到下一个数据时,是否会再次产生中止呢?这个问题困惑了我一晚上。依照程序逻辑推理,即假定本程序是无误的基础上(过后证明应该是正确的),第2次中止是不应该产生的,否则将程序无限中止嵌套下去,也得不到帧数据的处理结果。可是在Receive_Data()中的 while(!RI),需求等候的是接纳中止标志方位位,也便是说,第2次接纳数据完今后串口接纳中止标志将被置位,可是中止不嵌套。
以下是我从百度文库里找到的一片关于51系列单片机中止嵌套的文章,给出了比较详细的解说,现将首要的内容摘抄如下:
“老的51单片机(80C51系列)有5个中止源,2个优先级,能够完成二级中止服务嵌套。现在许多扩展的51单片机已经有4个优先级(或更多)和更多的中止源了。老的51单片机(80C51系列)有5个中止源,2个优先级,能够完成二级中止服务嵌套。现在许多扩展的51单片机已经有4个优先级(或更多)和更多的中止源了。”
“中止的优先级有两个:查询优先级和履行优先级。”
咱们一般所说的中止优先级一般指的是履行优先级,但同一履行优先级的中止也有比较,那便是查询优先级。所谓查询优先级是指在两个同一优先级的中止同时产生时(严格来说应该是在单片机能分辩的同一细小时段内),处理器会依照默许的次第进行中止查询,查询优先级高的中止先运转中止处理程序,而查询优先级低的则中止标志置位,假如高查询优先级的中止运转进程中没有对该标志位作康复处理,那么在运转完该高查询优先级中止使命后,依然会履行低的优先级使命;可是,假如在运转进程中低查询优先级的中止标志被康复,那么对应的中止程序应该不会被处理。同理,关于同一中止,比方串口中止,在运转当时串口接纳中止程序的时分又有数据被接纳,则对应的中止标志会被置位,可是不会产生嵌套中止,而只要等候当时中止完毕后才持续履行对应的中止程序。在上述程序傍边,能够看到,在第2次产生中止后,对应的中止标志已被铲除,所以不会履行第2次中止程序,第2次中止的首要作用是满意函数Receive_Data()中的 while(!RI),即供给了中止标志位,这样,就既能接纳到第二个字节的数据,又能不产生中止,也便是该手册中完成中止程序一次接纳多个字节数据(帧)的办法!
与查询优先级对应的还有便是履行优先级,这个是需求用户对单片机做设定的,在这种情况下,中止才会产生嵌套,细节不叙。当然不同单片机或处理器关于中止的界说有必定的收支,详细的使用依然要参照对应的数据手册。
(转载请注明出处,谢谢!http://blog.sina.com.cn/s/blog_49d4de8a0100w0f4.html)
参阅文献:
1. ZLG公司.《RS-485_Guide》,2004
2. 《DL/T645-1997通讯规约通讯规约》
3. 《关于51系列单片机中止嵌套》

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

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

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

微信扫一扫关注我们

返回顶部