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

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

📁 ucos下的中断事例
💻 HTM
📖 第 1 页 / 共 3 页
字号:
      <BR><BR>  μC/OS-II内核提供了信号量作为通信和同步的机制,引入数据接收信号量、数据发送信号量分别对缓冲区两端的操作进行同步。串口的操作模式如下:用户任务想写,但缓冲区满时,在信号量上睡眠,让CPU运行别的任务,待ISR从缓冲区读走数据后唤醒此睡眠的任务;同样,用户任务想读,但缓冲区空时,也可以在信号量上睡眠,待外部设备有数据来了再唤醒。由于μC/OS-II的信号量提供了超时等待机制,串口当然也具有超时读写能力。 
      <BR><BR>  数据接收信号量初始化为0,表示在环形缓冲区中无数据。 
      <BR><BR>  接收中断到来后,ISR从UART的接收缓冲器SBUF中读入接收的字节(②),放入接收缓冲区(③),然后通过接收信号量唤醒用户任务端的读操作(④、①)。在整个过程中,可以查询记录缓冲区中 
      当前字节数的变量值,此变量表明接收缓冲区是否已满。UART收到数据并触发了接收中断,但如果此时缓冲区是满的,那么放弃收到的字符。缓冲区的大小应合理设置,降低数据丢失的可能性,又要避免存储空间的浪费。 
      <BR><BR>  发送信号量初始值设为发送缓冲区的大小,表示缓冲区已空,并且关闭发送中断。发送数据时,用户任务在信号量上等待(①)。如果发送缓冲区未满,用户任务向发送缓冲区中写入数据(②)。如果写入的是发送缓冲区中的第一个字节,则允许发送中断(②)。然后,发送ISR从发送缓冲区中取出最早写入的字节输出至UART(④),这个操作又触发了下一次的发送中断,如此循环直到发送缓冲区中最后一个字节被取走,重新关闭发送中断。在ISR向UART输出的同时,给信号量发信号(⑤),发送任务据此信号量计数值来了解发送缓冲区中是否有空间。 
      <BR><BR>3 串口通信模块的设计 
      <BR><BR>  每个串行端口有两个环状队列缓冲区,同时有两个信号量:一个用来指示接收字节,另一个用来指示发送字节。每个环状缓冲区有以下四个要素: 
      <BR><BR>  存储数据(INT8U数组);<BR><BR>  包含环状缓冲区字节数的计数器; 
      <BR><BR>  环状缓冲区中指向将被放置的下一字节的指针; <BR><BR>  环状缓冲区中指向被取出的下一字节的指针。 
      <BR><BR>  SerialGetehar()用来获取接收到的数据,如果缓冲区已空时将任务挂起,接收到字节时,任务将被唤醒,同时从串行口接收字节。SerialPutRxChar()用来将接收的字节放到缓冲区中,如果接收缓冲区已满,则该字节被丢弃。当字节插入到缓冲区中,SerialPutRxChar()通知数据接收信号量,使之将数据己到的消息传达给所有等待的任务。为防止挂起应用任务,可以通过调用SceiallsEmPty()去发现环状队列中是否有字节。 
      <BR><BR>  当需要发送数据给串行端口时,SerialPurChar()等待信号量在初始化发送信号量时应该初始为缓冲区的大小。因此,当缓冲区中没有更多空间时,SerialPutChar()就挂起任务,只要UART再次发送字节,挂起任务就将恢复。SerialGctChar()被中断服务程序调用,如果发送缓冲区至少还有一个字节,Seri-a1GetChar()就返回一个从缓冲区发送的字节。如果缓冲区己空,则SerialGetChar()返回Null,这将使调用停止进一步的发送中断,一直到有数据发送为止。 
      <BR><BR>4 异步串行通信的接口函数 
      <BR><BR>  应用任务可以通过如下的几个函数来控制和访问UART:SerialCfgPort()、SerialGetChar()、SerialInit()、SerialIsEmpty()、SerialIsFull()和SerialPutChar()。 
      <BR><BR>  SerialCfgPort()用于建立串行端口的特征,在为指定端口调用其他服务前,必须先调用该函数,包括确定波特率、比特数、奇偶校验和停止位等。 
      <BR><BR>  SerialGetChar()使应用程序从接收数据的环状缓冲区中取出数据。<BR><BR>  SerialInit()用于初始化整个串口软件模块,且必须在该模块提供的其他任何服务前调用。SeriallInit()将环状缓冲区计数器的字节数清零,并初始化每个环状缓冲区的IN和OUT指针,指向数据存储区的开始处。数据接收信号量初始化为0,表示在环状缓冲区无数据。用传送缓冲区大小初始化数据传送信号量,表示缓冲区已空。 
      <BR><BR>  SerialIsEmpty()允许应用程序确定是否有字节从串口接收进来。本函数允许在无数据时避免将任务挂起。 
      <BR><BR>  SerialIsFull()允许应用程序确定传送环状缓冲区的状态,本函数可以在缓冲区已满时避免将任务挂起。<BR><BR>  SerialPutChar()允许应用程序向一个串行端口发送数据。 
      <BR><BR>结 语 
      <BR><BR>  该串口通信模块充分利用了实时内核的任务调度功能和信号量机制,系统软件模块化,可读性增强,便于修改和移植,其设计思路和方法可以很好的应用在多种情况下的测控系统中,系统的扩展方便,具有一定的借鉴作用。该串口通信模块已作为某铁路供水远程控制终端的一部分,运行稳定,提高了整个系统的运行效率和实时性。</DIV>
      <SCRIPT type=text/javascript>
function ImgZoom(Id)//重新设置图片大小 防止撑破表格
{
var w = $(Id).width;
var m = 550;
if(w < m)
{
return;
}
else
{
var h = $(Id).height;
$(Id).height = parseInt(h*m/w);
$(Id).width = m;
}
}
window.onload = function()
{
var Imgs = $("content").getElementsByTagName("img");
var i=0;
for(;i<Imgs.length;i++)
{
ImgZoom(Imgs[i]);
}
}
</SCRIPT>
<!--自定义字段-->
      <TABLE cellSpacing=1 cellPadding=5 width="100%" align=center 
      bgColor=#cccccc>
        <TBODY></TBODY></TABLE><!--自定义字段--><!--分页-->
      <DIV class=td_center></DIV>
      <H3>责任编辑:<A class=member_url 
      href="http://www.mcuchina.com/member/member.php?username=admin">admin</A></H3>
      <DIV class=mar_10><SPAN class=font_1>本文引用地址:</SPAN>&nbsp;<SPAN 
      class=border_2><A 
      href="http://www.mcuchina.com/article/2007/1228/article_69.html">http://www.mcuchina.com/article/2007/1228/article_69.html</A></SPAN> 
      </DIV><!--上下文-->
      <DIV class=border_1 id=pre_and_next></DIV><BR>
      <DIV class=iconbox id=par>
      <FORM id=sendmail name=sendmail action=/mail/sendmail.php><INPUT 
      type=hidden value=推荐《μC/OS—II下中断服务程序和外设驱动的开发》 name=title> <INPUT 
      type=hidden 
      value="<a href=http://www.mcuchina.com/article/2007/1228/article_69.html target=_blank>μC/OS—II下中断服务程序和外设驱动的开发<br/>http://www.mcuchina.com/article/2007/1228/article_69.html</a>" 
      name=content> </FORM><A class=comment_icon 
      href="http://www.mcuchina.com/article/2007/1228/article_69.html#comment">发表评论</A> <A 
      class=favorites_icon 
      href="javascript:window.external.addFavorite(window.location,'μC/OS—II下中断服务程序和外设驱动的开发')">加入收藏</A> <A 
      class=friend_icon href="javascript:$('sendmail').submit();">告诉好友</A> <A 
      class=print_icon href="javascript:window.print();">打印本页</A> <A 
      class=close_icon href="javascript:window.close()">关闭窗口</A> <A 
      class=top_icon 
      href="http://www.mcuchina.com/article/2007/1228/article_69.html#top">返回顶部</A></DIV><!--相关文章列表-->
      <DIV class=cat_title>
      <DIV class=cat_name>相关文章</DIV>
      <DIV class=cat_url><A class=more 
      href="http://www.mcuchina.com/article/2007/1228/article_69.html#"></A></DIV></DIV>
      <SCRIPT src="μC/OS—II下中断服务程序和外设驱动的开发-文章-中国单片机在线.files/list_js.htm" 
      type=text/javascript></SCRIPT>
    </TD>
    <TD width=10>&nbsp;</TD>
    <TD class=right_bg vAlign=top width=210>
      <DIV class=rightcats>
      <H1>最新文章</H1>
      <H2><A class=more 
      href="http://www.mcuchina.com/article/2007/1228/article_69.html#">更多</A></H2></DIV>
      <TABLE class=tag_box cellSpacing=0 cellPadding=0>
        <TBODY>
        <TR>
          <TD width="100%" height=24>· <A class=tag_title_link 
            title="uC/OS-II 初级程序员指南 " 
            href="http://www.mcuchina.com/article/2008/0107/article_143.html" 
            target=_blank>uC/OS-II 初级程序员指南 </A></TD></TR>
        <TR>
          <TD width="100%" height=24>· <A class=tag_title_link 
            title=在AVR上建立自己的RTOS 
            href="http://www.mcuchina.com/article/2007/1228/article_77.html" 
            target=_blank>在AVR上建立自己的RTOS</A> </TD></TR>
        <TR>
          <TD width="100%" height=24>· <A class=tag_title_link 
            title="uCOS II中实现同优先级调度的方法" 
            href="http://www.mcuchina.com/article/2007/1228/article_76.html" 
            target=_blank>uCOS II中实现同优先级调...</A> </TD></TR>
        <TR>
          <TD width="100%" height=24>· <A class=tag_title_link 
            title=μC/O-SII内核扩展接口的低功耗模式 
            href="http://www.mcuchina.com/article/2007/1228/article_75.html" 
            target=_blank>μC/O-SII内核扩展接口的...</A> </TD></TR>
        <TR>
          <TD width="100%" height=24>· <A class=tag_title_link 
            title=基于μC/OSⅡ的备用电源自动投入装置设计 
            href="http://www.mcuchina.com/article/2007/1228/article_74.html" 
            target=_blank>基于μC/OSⅡ的备用电源...</A> </TD></TR>
        <TR>
          <TD width="100%" height=24>· <A class=tag_title_link 
            title=使用uC/OS-II操作系统的短信息电话机 
            href="http://www.mcuchina.com/article/2007/1228/article_73.html" 
            target=_blank>使用uC/OS-II操作系统的...</A> </TD></TR>
        <TR>
          <TD width="100%" height=24>· <A class=tag_title_link 
            title=μC/OS—II的嵌入式串口通信模块设计 
            href="http://www.mcuchina.com/article/2007/1228/article_72.html" 
            target=_blank>μC/OS—II的嵌入式串口...</A> </TD></TR>
        <TR>
          <TD width="100%" height=24>· <A class=tag_title_link 
            title=基于μC/OS-II嵌入式操作系统的TCSC实验控制器前置单元设计 
            href="http://www.mcuchina.com/article/2007/1228/article_71.html" 
            target=_blank>基于μC/OS-II嵌入式操作...</A> </TD></TR>
        <TR>
          <TD width="100%" height=24>· <A class=tag_title_link 
            title=μC/OS-II中缩短中断关闭时间的方法 
            href="http://www.mcuchina.com/article/2007/1228/article_70.html" 
            target=_blank>μC/OS-II中缩短中断关闭...</A> </TD></TR>
        <TR>
          <TD width="100%" height=24>· <A class=tag_title_link 
            title=μC/OS—II下中断服务程序和外设驱动的开发 
            href="http://www.mcuchina.com/article/2007/1228/article_69.html" 
            target=_blank>μC/OS—II下中断服务程...</A> </TD></TR></TBODY></TABLE>
      <DIV class=rightcats>
      <H1>推荐文章</H1>
      <H2><A class=more 
      href="http://www.mcuchina.com/article/search.php?catid=46&amp;posid=1&amp;search=1">更多</A></H2></DIV>
      <TABLE class=tag_box cellSpacing=0 cellPadding=0>

⌨️ 快捷键说明

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