⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 μc/os—ii下中断服务程序和外设驱动的开发-文章-中国单片机在线.htm

📁 ucos下的中断事例
💻 HTM
📖 第 1 页 / 共 3 页
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0057)http://www.mcuchina.com/article/2007/1228/article_69.html -->
<HTML><HEAD><TITLE>μC/OS—II下中断服务程序和外设驱动的开发-文章-中国单片机在线</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gbk">
<META content=,,文章 name=keywords>
<META content="  在嵌入式应用中,使用RTOS的主要原因是为了提高系统的可靠性,其次是提高开发效率、缩短开发周期。 ..." 
name=description>
<META content="MSHTML 6.00.2900.3243" name=GENERATOR><LINK href="/favicon.ico" 
rel="shortcut icon"><LINK 
href="μC/OS—II下中断服务程序和外设驱动的开发-文章-中国单片机在线.files/style.css" type=text/css 
rel=stylesheet>
<SCRIPT language=javascript 
src="μC/OS—II下中断服务程序和外设驱动的开发-文章-中国单片机在线.files/config.js"></SCRIPT>

<SCRIPT language=javascript 
src="μC/OS—II下中断服务程序和外设驱动的开发-文章-中国单片机在线.files/common.js"></SCRIPT>

<SCRIPT language=javascript 
src="μC/OS—II下中断服务程序和外设驱动的开发-文章-中国单片机在线.files/prototype.js"></SCRIPT>
</HEAD>
<BODY>
<DIV class=header>
<TABLE class=bg_login cellSpacing=0 cellPadding=0 width=980>
  <TBODY>
  <TR>
    <TD align=middle width=200><!--时间-->
      <SCRIPT language=JavaScript 
      src="μC/OS—II下中断服务程序和外设驱动的开发-文章-中国单片机在线.files/time.js"></SCRIPT>
    </TD>
    <TD align=right width=38><A 
      href="http://www.mcuchina.com/article/rss.php?catid=46" target=_blank><IMG 
      src="μC/OS—II下中断服务程序和外设驱动的开发-文章-中国单片机在线.files/rss.gif" border=0></A> </TD>
    <TD align=right width=*><!--会员登录-->
      <SCRIPT language=javascript 
      src="μC/OS—II下中断服务程序和外设驱动的开发-文章-中国单片机在线.files/login.htm"></SCRIPT>
    </TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width=980 align=center>
  <TBODY>
  <TR>
    <TD align=middle width=260 height=90><A 
      href="http://www.mcuchina.com/"><IMG 
      src="μC/OS—II下中断服务程序和外设驱动的开发-文章-中国单片机在线.files/logo_top.gif"></A></TD>
    <TD align=middle width=620>
      <SCRIPT language=JavaScript 
      src="μC/OS—II下中断服务程序和外设驱动的开发-文章-中国单片机在线.files/ad.htm"></SCRIPT>
    </TD>
    <TD width=100>
      <TABLE cellSpacing=0 cellPadding=0 width="100%">
        <TBODY>
        <TR>
          <TD>【<A id=StranLink>繁体中文</A>】</TD></TR>
        <TR>
          <TD>【<A 
            onclick="this.style.behavior='url(#default#homepage)';this.setHomePage ('http://www.mcuchina.com/');" 
            href="http://www.mcuchina.com/article/2007/1228/article_69.html#">设为首页</A>】</TD></TR>
        <TR>
          <TD>【<A 
            onclick="window.external.addFavorite('http://www.mcuchina.com/','中国单片机在线')" 
            href="http://www.mcuchina.com/article/2007/1228/article_69.html#">加入收藏</A>】</TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><!--频道列表-->
<DIV id=Whatever align=center>
<UL class=TabBarLevel1 id=TabPage1>
  <LI><A href="http://www.mcuchina.com/">首页</A> </LI>
  <LI class=Selected id=Tabi><A class=white 
  href="http://www.mcuchina.com/article/">文章</A> </LI>
  <LI><A class=white href="http://www.mcuchina.com/down/">下载</A> </LI>
  <LI><A class=white href="http://www.mcuchina.com/product/">商城</A> </LI>
  <LI><A class=white href="http://www.mcuchina.com/blog/">博客</A> </LI>
  <LI><A class=white href="http://www.mcuchina.com/bbs/">论坛</A> </LI></UL></DIV><!--频道下属栏目列表-->
<TABLE cellSpacing=0 cellPadding=0 width="100%">
  <TBODY>
  <TR>
    <TD class=submenu><A class=white 
      href="http://www.mcuchina.com/article/">文章首页</A> | <A class=white 
      href="http://www.mcuchina.com/article/mcu/">单片机技术</A> | <A class=white 
      href="http://www.mcuchina.com/article/program/">编程语言</A> | <A class=white 
      href="http://www.mcuchina.com/article/elebase/">电子基础</A> | <A class=white 
      href="http://www.mcuchina.com/article/Interface/">接口技术</A> | <A 
      class=white href="http://www.mcuchina.com/article/Communication/">通讯技术</A> 
      | <A class=white href="http://www.mcuchina.com/article/EDA/">EDA技术</A> | 
      <A class=white href="http://www.mcuchina.com/article/Power/">电源技术</A> | <A 
      class=white href="http://www.mcuchina.com/article/Polytechnic/">综合技术</A> | 
      <A class=white href="http://www.mcuchina.com/article/type.php">分类</A> | <A 
      class=white href="http://www.mcuchina.com/article/special/">专题</A> | <A 
      class=white 
      href="http://www.mcuchina.com/guestbook/index.php?keyid=1">留言本</A> | <A 
      class=white href="http://www.mcuchina.com/article/contribute.php">投稿</A> | 
      <A class=white href="http://www.mcuchina.com/article/search.php">搜索</A> 
  </TD></TR></TBODY></TABLE></DIV>
<DIV class=main>
<TABLE cellSpacing=0 cellPadding=0 width=980>
  <TBODY>
  <TR>
    <TD height=10></TD></TR></TBODY></TABLE>
<SCRIPT type=text/javascript>
function fontZoom(size)
{
   $('content').style.fontSize=size+'px';
}
</SCRIPT>

<TABLE cellSpacing=0 cellPadding=0 width=980>
  <TBODY>
  <TR>
    <TD class=content vAlign=top width=760><!--位置导航-->
      <DIV class=position_1>当前位置:<A 
      href="http://www.mcuchina.com/article/">文章首页</A> &gt;&gt; <A 
      href="http://www.mcuchina.com/article/program/">编程语言</A> &gt;&gt; <A 
      href="http://www.mcuchina.com/article/program/OS/">实时操作系统</A> &gt;&gt; 
      μC/OS—II下中断服务程序和外设驱动的开发</DIV><!--主标题-->
      <H1>μC/OS—II下中断服务程序和外设驱动的开发 </H1><!--副标题--><!--文章属性-->
      <DIV id=property>2007-12-28 15:49:45&nbsp;&nbsp;作者:<A class=member_url 
      href="http://www.mcuchina.com/member/member.php?username=admin"></A>&nbsp;&nbsp;来源:<A 
      href="http://www.mcuchina.com/article/2007/1228/" 
      target=_blank>电子设计信息网</A>&nbsp;&nbsp;浏览次数:<SPAN 
      id=hits>7</SPAN>&nbsp;&nbsp;文字大小:【<A 
      href="javascript:fontZoom(16)">大</A>】【<A 
      href="javascript:fontZoom(14)">中</A>】【<A 
      href="javascript:fontZoom(12)">小</A>】</DIV><!--引用地址-->
      <DIV 
      class=introduce><STRONG>简介:</STRONG>  在嵌入式应用中,使用RTOS的主要原因是为了提高系统的可靠性,其次是提高开发效率、缩短开发周期。  μC/OS-II是一个占先式实时多任务内核,使用对象是嵌入式系统,对源代码适当裁减,很容易移植到8~32位 
      ...</DIV>
      <DIV class=content_text 
      id=content>  在嵌入式应用中,使用RTOS的主要原因是为了提高系统的可靠性,其次是提高开发效率、缩短开发周期。<BR><BR>  μC/OS-II是一个占先式实时多任务内核,使用对象是嵌入式系统,对源代码适当裁减,很容易移植到8~32位不同框架的微处理器上。但μC/OS-II仅是一个实时内核,它不像其他实时操作系统(如嵌入式Linux)那样提供给用户一些API函数接口。在μC/OS-II实时内核下,对外设的访问接口没有统一完善,有很多工作需要用户自己去完成。串口通信是单片机测控系统的重要组成部分,异步串行口是一个比较简单又很具代表性的中断驱动外设。本文以单片机中的串口为例,介绍μC/OS—II下编写中断服务程序以及外设驅动程序的一般思路。 
      <BR><BR>1 μC/OS-II的中断处理及51系列单片机中断系统分析 
      <BR><BR>  μC/OS-II中断服务程序(ISR)一般用汇编语言编写。以下是中断服务程序的步骤。 
      <BR><BR>  保存全部CPU寄存器;调用OSIntEnter()或OSIntNesting(全局变量)直接加1; 
      <BR><BR>  执行用户代码做中断服务;<BR><BR>  调用0SIntExit(); <BR><BR>  恢复所有CPU寄存器; 
      <BR><BR>  执行中断返回指令。<BR><BR>  μC/OS-II提供两个ISR与内核接口函数;OSIntEnter()和OSIntExit()。OSIntEnter()通知μC/OS—II核,中断 
      服务程序开始了。事实上,此函数做的工作是把一个全局变量OSIntNesting加1,此中断嵌套计数器可以确保所有中断处理完成后再做任务调度。另一个接口函数OSIntExit()则通知内核,中断服务已结束。根据相应情况,退回被中断点(可能是一个任务或者是被嵌套的中断服务程序)或由内核作任务调度。 
      <BR><BR>  用户编写的ISR必须被安装到某一位置,以便中断发生后,CPU根据相应的中断号运行准确的服务程序。许多实时操作系统都提供了安装和卸载中断服务程序的API接口函数,但μC/OS—II内核没有提供类似的接口函数,需要用户在对CPU的移植中自己实现。这些接口函数与具体的硬件环境有关,接下来以51单片机下的中断处理对此详细说明。 
      <BR><BR>  51单片机的中断基本过程如下:CPU在每个机器周期的S5P2时刻采样中断标志,而在下一指令周期将对采样的中断进行查询。如果有中断请求,则按照优先级高低的原则进行处理。响应中断时,先置相应的优先级激活触发器于相应位,封锁同级或低级中断,然后根据中断源类别,在硬件控制下,将中断地址压入堆栈,并转向相应的中断向量入口单元。通常在入口单元处放一跳转指令,转向执行中断服务程序.当执行中断返回指令RETI时,把响应中断时所置位的优先级激活触发器清零后,从堆栈中弹出被保护的断点地址,装入程序计数器PC,CPU返回原来被中断处继续执行程序。 
      <BR><BR>  在移植的过程中,采用Keil 
      C51作为编译环境。KeilC5l集成C编译和汇编器。中断子程序用汇编语言编写,放到移植μC/0S—II后的OS_CPU_A.ASM汇编文件中。下面是以串行口中断为例的移植中断服务子程序代码。 
      <BR><BR>CSEGAT0023H ;串口中断响应入口地址 <BR>LJMPSerialISR;转移到串口中断子程序入口地址 
      <BR>RSEG PR SeriallSR OS_CPU_A <BR>SerialISR: <BR>USINGO <BR>CLR EA 
      ;先关中断,以防中断嵌套 <BR>PUSHALL ;已定义的压栈宏,用于将 <BR>;CPU寄存器的值压入堆栈 
      <BR>LCALL_OSIntEnter ;监视中断嵌套 <BR>LCALL_Serial ;串口中断服务程序 
      <BR>LCALL_OSintExlt <BR>SETBEA <BR>POPALL;已定义的出栈宏,将CPU寄存器的值出栈 <BR>RETI 
      <BR><BR>2 串口驱动程序 
      <BR><BR>  笔者已在5l单片机上成功移植了μC/0S-II内核,移植过程在此不再讨论。这里重点分析μC/0S—II内核下串口驱动程序编写。 
      <BR><BR>  由于串行设备存在外设处理速度和CPU速度不匹配的问题,所以需要一个缓冲区.向串口发送数据时,只要把数据写到缓冲区中,然后由串口逐个取出往外发。从串口接收数据时,往往等收到若干个字节后才需要CPU进行处理,所以这些预收的数据可以先存于缓冲区中。实际上,单片机的异步串口中只有两个相互独立、地址相同的接收、发送缓冲寄存器SBUF。在实际应用中,需要从内存中开辟两个缓冲区,分别为接收缓冲区和发送缓冲区。这里把缓冲区定义为环形队列的数据结构。 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -