您好、欢迎来到现金彩票网!
当前位置:ag视讯 > 高优先级中断 >

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

发布时间:2019-06-27 03:22 来源:未知 编辑:admin

  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是中断处理函数中的接收流程,中断程序如上述。程序在判断出第一个字节是前导字节以后,需要继续判断前导字节,当连续2-4次判断出是前导字节后才会继续往下执行。但是在作第二次前导字节的判断时,Receive_Data()事实上是在当前中断程序中等待下一个接收到的数据,而当接收到下一个数据时,是否会再次发生中断呢?这个问题困惑了我一晚上。按照程序逻辑推理,即假设本程序是无误的基础上(事后证明应该是正确的),第二次中断是不应该发生的,否则将程序无限中断嵌套下去,也得不到帧数据的处理结果。但是在Receive_Data()中的 while(!RI),需要等待的是接收中断标志位置位,也就是说,第二次接收数据完以后串口接收中断标志将被置位,但是中断不嵌套。

  以下是我从百度文库里找到的一片关于51系列单片机中断嵌套的文章,给出了比较详细的解释,现将主要的内容摘录如下:

  “老的51单片机(80C51系列)有5个中断源,2个优先级,可以实现二级中断服务嵌套。现在很多扩展的51单片机已经有4个优先级(或更多)和更多的中断源了。老的51单片机(80C51系列)有5个中断源,2个优先级,可以实现二级中断服务嵌套。现在很多扩展的51单片机已经有4个优先级(或更多)和更多的中断源了。”

  我们通常所说的中断优先级一般指的是执行优先级,但同一执行优先级的中断也有比较,那就是查询优先级。所谓查询优先级是指在两个同一优先级的中断同时发生时(严格来说应该是在单片机能分辨的同一微小时段内),处理器会按照默认的次序进行中断查询,查询优先级高的中断先运行中断处理程序,而查询优先级低的则中断标志置位,如果高查询优先级的中断运行过程中没有对该标志位作恢复处理,那么在运行完该高查询优先级中断任务后,仍然会执行低的优先级任务;但是,如果在运行过程中低查询优先级的中断标志被恢复,那么对应的中断程序应该不会被处理。同理,对于同一中断,比如串口中断,在运行当前串口接收中断程序的时候又有数据被接收,则对应的中断标志会被置位,但是不会产生嵌套中断,而只有等待当前中断结束后才继续执行对应的中断程序。在上述程序当中,可以看到,在第二次发生中断后,对应的中断标志已被清除,所以不会执行第二次中断程序,第二次中断的主要作用是满足函数Receive_Data()中的 while(!RI),即提供了中断标志位,这样,就既能接收到第二个字节的数据,又能不产生中断,也就是该手册中实现中断程序一次接收多个字节数据(帧)的方法!

  与查询优先级对应的还有就是执行优先级,这个是需要用户对单片机做设定的,在这种情况下,中断才会发生嵌套,细节不叙。当然不同单片机或处理器关于中断的定义有一定的出入,具体的应用仍然要参照对应的数据手册。

http://bed-plans.net/gaoyouxianjizhongduan/498.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有