第一范文网 - 专业文章范例文档资料分享平台

软中断在51单片机中的实现及其应用

来源:用户分享 时间:2025/5/31 12:48:10 本文由loading 分享 下载这篇文档手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

FunctionNum=a; Func_CallBack = (void *)b; SWI_IRQ(); _nop_(); void SWI_ISR(void) interrupt SWI_NUM {//测试传入的参数 CLEAR_SWI();//清除可能需要清除的标志 Func_CallBack();//执行指定的功能函数 FunctionNum = 0;//清除申请功能号 } \\ \\ \\

5、软中断和硬件中断共享一个中断源的实现的方法

前面所描述的软中断实现方法,是利用系统中不使用的中断源,将其分配给软中断来使用,在大多数情况下这都是适的方法。然而有的应用系统确实已经使用的全部的中断资源,还想要软中断功能,这该怎么办?下面就来讨论这个题目:如何共享硬件中断和软中断。

解决这个问题的关键在于正确区分硬件触发与软件触发的中断,既要保证没有多余的触发,又要保证不漏掉任何一个触发。由于中断标志只有一个,若软中断触发时硬中断也触发,就不能分辨了。仅仅加软件标志通常不能解决这个问题,这时需要寻求其他的实现方法。必要时需要附加硬件来帮助实现软中断功能。 选择共享中断源的依据是能够准确区分硬件中断和软中断。比较容易成功的方法是通过附加硬件措施来改造两个外部中断中的一个。

对于用低电平触发的外部中断申请,如果中断的撤销是由CPU来完成的,则CPU在中断服务程序中就能通过查询外部中断线的电平状态来判断是否同时发生了硬件中断的申请,这时软中断的申请标志和硬中断的申请电平就是两个相互独立的标志,也就能够准确区分硬件中断和软中断了。

具有一般性的做法是将外部中断0或外部中断1的中断申请改为利用一个D触发器来进行电平方式的中断申请,并将中断申请的撤销交给CPU来控制,以便系统能够准确识别每一个中断申请。图1是将边沿触发中断改为电平触发的一种实现方式。图2是将主动撤销信号电平申请改为由CPU控制信号撤销电平申请的一种实现方式。

对于其他的应用于系统之间通讯的通讯端口,不推荐用于共享方式实现软中断。这是因为通讯的数据流可能很大,在没有FIFO缓冲的51兼容单片机中,很有可能造成接收溢出。在51兼容单片机中,串口UART即使在不使用发送中断的情况下,也不推荐应用于软中断服务,因为每一个数据发送完成都会自动置位TI标志,会干扰软中断的执行。

D触发起 中断申请 CLR# (74HC74) Q INT0# CPU (51兼容单片机) P1.0 SET#

图1 边沿触发中断申请改为低电平触发中断申请

INT0# CPU (51兼容单片机) P1.0 中断申请 CLK D D触发起 (74HC74) Q SET#

图2低电平触发中断申请改为CPU撤销信号的低电平触发中断申请

6、软中断在实时操作系统环境下的应用

在基于51单片机的嵌入式系统中,数据采集处理、程序控制和数据通讯是三个主要的应用方面,以下三小节分别描述数据采集处理任务、程序控制任务和数据通讯任务中软中断的使用,以帮助读者加深对软中断的理解。

6.1软中断服务在数据采集处理任务中的应用

实时操作系统下,中断处理占用的时间越短,系统的实时性越好。在一些应用中,数据处理的实时性要求很高,系统的响应时间在0.5毫秒以内。如果数据处理的时间在最坏情况下超过0.3毫秒,系统的软件设计就受到挑战。如果将数据处理全部放入中断中进行处理,系统中其它任务的实时性会受到严重影响。解决的办法通常是以下两种:1)不使用51单片机,改用其它处理速度更快的处理器(如ARM处理器);2)不使用操作系统。这两种解决办法要受到产品成本和开发效率的约束。

软中断的应用可以成为上述问题的第3种解决方法,并且是最优的解决方法。 使用一个最低优先级的中断源来实现软中断,将数据处理放入软中断中完成。这样,软中断就可以随时剥夺任何一个正在运行的任务而优先执行,执行完成后可以回到正在执行的任务,也可以切换到已就绪的更高优先级的任务。如此,系统的实时性就提高了,同时,软件开发效率也提高了。具体的办法是,在数据采集中断中,只完成数据的获取,将数据存放到队列中,然后申请软中断服务后退

出中断服务程序。只要系统中没有其它中断事务等待处理,软中断就可以开始处理,并且在软中断处理过程中可以响应其它的硬件中断,从而保证系统的实时性。由于软中断总是优先于任务执行,所以能够保证数据处理的实时性。当队列中没有数据时,软中断退出,执行其它任务。在这样的机制下,没有频繁的上下文切换,因此CPU的使用效率得到提高,以保证整个系统的实时性。

以下代码片断是一种车辆检测器的代码,使用了软中断来处理数据。可以看出,找外部中断0中将数据放入队列,然后申请软中断。在软中断中,只要队列中还有数据,就循环处理直到队列为空才退出软中断。

?? void int0_int(void) interrupt IE0_VECTOR {//外部中断0 TR0 = 0; //读计数器 NewNode = QMalloc();//申请分配内存 if(NewNode < Q_MAX_LEN) {//内存分配成功 LoopQ[NewNode].LoopChannel = LoopCounter; // TH2,TH1,TH0,TL7,TL6,TL5,TL4,TL3,TL2,TL1,TL0,P2.7,P2.6,P2.5,P2.4,P2.3 // 读取21位计数值拼成2字节,组成16位计数值 LoopQ[NewNode].LoopNv = ((TH0 & 0x03) * 8192) + (TL0 * 32) + ((P2>>3) & 0x1F); LoopQ[NewNode].TimeStamp = 0;//没有测速,不需要时间戳 AddLoopNode(NewNode); SWI_IRQ();//申请软件中断,以便处理数据 } LoopSet();//计算并设置下一个通道 LoopProcTimer = 0; } ?? //软中断服务函数 void SWI_ISR(void) interrupt SWI_NUM {// while(1) { ProcNode = GetLoopNode();//从队列中取待处理的数据 if(ProcNode == 0xFF) break;//队列中没有数据,退出 lopcout = LoopQ[ProcNode].LoopChannel;//取通道号 nv[lopcout] = LoopQ[ProcNode].LoopNv;//取测量数据 QFree(ProcNode);//释放内存以便循环使用 LoopProc();//通道计算 } CLEAR_SWI();//清除可能需要清除的标志 }

6.2 软中断在程序控制任务中的应用

在操作系统中的程序控制任务,其运行受系统内核支配。如果程序控制任务

在逻辑上有严格的时间安排,很可能被高优先级任务剥夺运行而导致逻辑失败。 这种任务如果全部安排在中断中完成处理,会影响系统中其它任务的实时性。这时比较好的方法就是利用软中断来处理时间要求很严格部分。通过软中断,申请在指定时刻执行指定的代码。

以下的代码是程序控制任务计算出来的控制序列,通过申请软中断服务,将待执行的程序控制交给系统,系统在定时器的严格同步下,将非常准确地完成控制过程。代码中,35毫秒后,功能1和功能4将“同时”启动执行,实际上功能1先于功能4执行,时间上相差大约10uS左右。

?? SWI_REQ(20,func1,data1);//申请20ms后执行功能1,其所需的参数在data1 SWI_REQ(25,func2,data2);//申请25ms后执行功能2,其所需的参数在data2 SWI_REQ(26,func3,data3);//申请26ms后执行功能3,其所需的参数在data3 SWI_REQ(35,func1,data4);//申请35ms后执行功能1,其所需的参数在data4 SWI_REQ(35,func4,data5);//申请35ms后执行功能4,其所需的参数在data5 SWI_REQ(36,func3,data6);//申请36ms后执行功能3,其所需的参数在data6 ??

6.3 软中断在数据通讯任务中的应用

在数据通讯中,有些通讯协议对系统的响应时间有严格的要求,两个数据包之间的空闲时间有严格的限制,超过一定时间就认为超时。

这种情况下,数据通讯任务如果全部安排在中断中完成处理,则会影响系统其它任务的实时性,如果放在任务中运行,运行的时间又不可控制。当然可以在任务中关闭中断来处理实时性要求较强的代码,可是这样做会影响其他部分的实时性。

比较好的方法,就是利用软中断,将需要提供的实时服务通过软中断申请将目标代码和数据在不影响系统实时性的条件下优先执行。

首先,在系统中建立一个软中断函数执行的链表,将等待执行代码入口地址和数据入口地址放在这个链表中。一旦内核运行完毕,就自动来检测这个链表中是否存在待执行的软中断代码。如果有软中断代码,立即按照优先顺序执行。当所有的软中断代码执行完成后,就检查是否有高优先级的任务已经就绪等待执行,若有,进行任务调度。当然,申请软中断服务本身就可能引发任务调度。这得看软中断服务完成后,是否有更高优先级任务进入就绪态。

比如,有一个任务在发送完成一个数据包后,有严格的时间要求在20ms后准确启动第二个数据包的发送。如果利用OSWait()或OSTimeDly()的方式,则完全不可能在20ms后准确开始。如果关闭中断等待20ms,系统的效率将十分低下。用软中断的方法是,向系统申请一个软中断服务,将服务要求的启动时刻、提供服务函数入口地址以及数据的存储地址提供给系统,就可以在指定的时刻运行这段代码,完成数据的发送工作。即使当前任务在申请完软中断服务后被剥夺,也能保证指定的数据在20ms后发送出去。

软中断函数执行链表的结构:

搜索更多关于: 软中断在51单片机中的实现及其应用 的文档
软中断在51单片机中的实现及其应用.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/c4xdr41q7dj7k6x46aj54_2.html(转载请注明文章来源)
热门推荐
Copyright © 2012-2023 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top