



免费预览已结束,剩余1页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
缓冲队列的串口通信缓冲队列的串口通信2010-06-05 16:451常用的串口处理方法串口部分的底层软件可以认为是串口的驱动程序,对上层软件而言,它应该提供一种比较自然而简洁的使用方式。以串口的发送为例,使用者可以直接调用一个函数输出一个字符串或者就像在通用平台上使用标准C中的printf函数一样。对上的接口已经确定了,下面我们讨论实现的问题。串口驱动的实现方法通常有两种:基于查询的办法。发送过程中不断检测串口硬件的发送缓冲区是不是为空,如果是,发送一个字节。如果还有数据没有发完,继续上述过程。下面以三星的S3C44B0X MCU为例,给出了基于查询方法的串口发送的示意代码。void Uart_SendStr(char*pt)char*p;p=pt;while(*p!=message)while(!(rUTRSTAT0&0x2);/等待,直到串口缓冲区为空WrUTXH0(*p+);/发送一个字节基于中断的方法。在上面的基于查询的方法中,有一个很明显的弊病,那就是在发送一个字符串的过程中,CPU不能去做其它的事情,必须等待全部字符发送完成后返回。以上述MCU为例,其最高主频为66MHz,由于采用的是ARMv4体系结构,可以达到0.9指令每周期,而其串口最高波特率为115200 bps,这样就有大量的指令周期被浪费,而且在发送较长的字符串时会严重影响系统的实时性。所以在实际的系统中一般更多的采用中断的方法,发送一个字节之后,转去做其它的处理,发送完后自动进入发送中断,再发送下一个字节。这种方式比查询法提高了CPU的利用率,在串口部分进行发送和移位等操作时,CPU不用干预,但是同时也使串口的软件部分变得比较复杂,需要增加相应的中断服务程序(ISR)以及相关的软件缓冲区的管理。由于中断是由硬件触发的,为了使中断进入后能找到要发送的数据,最直接的办法就是设置一个全局的数组和一个指向待发送数据的指针,这样每次中断进入后就发送指针指向的字节,直到发完。2基于双缓冲队列的方法在采用上述的中断方式之后,进一步考虑整个的处理流程,以及中断服务程序和上层程序交互的方便性,对缓冲区进行了仔细设计。由于串口发送和接收的数据是相对独立的,故将其分开,设置两个缓冲区,一个是发送缓冲区TxBuf,一个是接收缓冲区RxBuf,并为每个缓冲区分别设置两个指针,一个记录中断服务程序将处理的字节,另一个记录使用串口服务的上层程序将处理的字节。以串口发送为例,两个指针分别为inTxBuf,outTxBuf。outTxBuf指向发送中断将要发送的数据,inTxBuf指向上层程序将数据放入缓冲区的起始位置。这种方式我们称之为采用双缓冲队列的方法。这种方法,保证了数据的顺序。在缓冲区够大的情况下,上层程序可以一次将要发送的数据全部放入发送缓冲区中,而不是一次发送一个字节,而且如果多个上层程序调用发送函数也不会造成混乱,因为每次调用时放入了要发送的全部数据。其原理类似于打印机对打印任务队列的管理,多个用户共享一个打印机,并发出各自的打印任务,但是不会出现不同任务的输出交叉的情况。串口的发送和接收这时成为公共的后台任务,只要发送缓冲区中有待发送的数据,就采用中断间歇性的进行发送,产生接收中断时也类似的进行接收,并通知上层程序。下面开始分析具体的实现。以下是关于缓冲区和相关指针的声明:#define TxBufLen 1000#define RxBufLen 200 char TxBufTxBufLen,RxBufRxBufLen;char*inTxBuf,*outTxBuf,*inRxBuf,*outRxBuf;int UartTxCount,UartRxCount;以下是串口发送的相关示例代码:/发送中断的ISR采用汇编实现,进行现场保护之后调用UartTx进行后续的处理,/Uart返回后再恢复现场。void UartTx(void)if(outTxBuf=inTxBuf)/TxBuf空return;WrUartBUF(*outTxBuf);/将待发送数据写入串口的寄存器outTxBuf+;/指向下一个要发送的数据if(outTxBuf=(TxBuf+TxBufLen)/缓冲区回绕outTxBuf=TxBuf;UartTxCount+;/发送计数/上层程序调用串口发送数据的接口,一次发送一个message结尾的字符串。void Uart_PrintStr(char*pt)char*t,*p;t=inTxBuf;p=pt;while(*p!=message)/逐个放入缓冲区t+;if(t=(TxBuf+TxBufLen)/回绕t=TxBuf;if(t=outTxBuf)/TxBuf满return;*inTxBuf=*p+;/放入一个数据inTxBuf=t;/inTxBuf后移Uart_TxStart();/启动发送,后面有讨论为便于对缓冲区管理的理解,下面分别给出了TxBuf有待发送数据以及满时的示意图。有阴影的格子表示含有有效数据。图2 TxBuf有待发数据时的示意图图3 TxBuf满时的示意图3第一次进入串口发送中断的方法上面具体分析了基于双缓冲的方法,但是由于串口发送中断是在串口的硬件缓冲区变为空时触发的,那么自然就存在一个问题,如何产生第一次的发送中断呢?解决这个问题要结合具体的CPU的特点,大致有两种方法。对于可以用软件产生硬件中断的CPU,例如Intel 196系列,可以通过直接写INT PENDING寄存器的方法,在发送第一个字节之前手工触发一次中断,其产生的效果和真实的硬件中断一样。以196KC为例,具体方法是设置一个软件flag,初始值为1,表示需要手工触发。先将数据放入发送缓冲区,在发送第一个字节前,将flag置为0,表示不再需要手工触发,然后用下面的代码触发发送中断,_INT_PEND1|=0x01;在中断发送的过程中,如果发现TxBuf为空(见上面的示意代码UartTx),在return之前,将flag重置为1,表示本次发送结束,下次发送时还需要手工触发。通过这种采用硬件特性和软件控制的方法,就可以很好的实现数据发送的流程。对于无法软件模拟硬件中断的CPU,如S3C44B0X等,可以通过先引导第一个字节发送的方法来实现,进而也可以使整个发送缓冲区发送完。对于先发送的一个字节,需要仔细的考虑,首先,发送的必须是一个有效的字节,否则会引起接收方的混乱。另外,如果直接写一个字节到串口的硬件缓冲区中,可能会引起发送的数据交叉,因为其它发送任务可能还在进行中。解决这种情况有两种办法:一是在Uart_PrintStr中检测发送缓冲区是否为空,如果不为空,表明发送已经启动,正在发送之中,不必手工触发中断,可以直接将全部待发送数据放入缓冲区,等待中断来发送即可。如果是,可以把第一个字节之外的数据顺序放入缓冲区,然后把第一个字节直接写入硬件的缓冲区,进而引发中断。二是将整个待发送的数据放入缓冲区,然后手工发送由outTxBuf指向的字节,发送中如果发现串口的缓冲不为空,表明正在有数据发送,这时放弃,返回即可。示例代码如下:void Uart_TxStart(void)if(outTxBuf=inTxBuf)/TxBuf空return;if(rUTRSTAT0&0x2)/如果硬件缓冲为空,发送一个字节WrUTXH0(*outTxBuf);else retrun;outTxBuf+;if(outTxBuf=(TxBuf+TxBufLen)outTxBuf=TxBuf;UartTxCount+;两种方法都是可行的,由于第二种方法不用去判断缓冲区是否为空,实现上比较简单,故在具体代码中采用了第二种方法。4结语关于缓冲的大小,上面给出的是一个参考值,可以结合具体的硬件,例如RAM的大小和需要发送的数据的大小与频率来考虑。设置之前也可以进行简单的估算,以波特率为115200为例,每秒最多发送14400字节的数据。然后估计整个系统每秒钟可能产生的最大的输出数据量是多少,首先不能超出串口的能力,然后根据这个值可以进行缓冲区大小的设置。以上方法在笔者的一个基于嵌入式OS的系统中获得了很好的效果,在每个任务中进行串口输出,长期运行也没有出现数据错位和缓冲区溢
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年制造业生产经理面试题及参考答案详解
- 2025年国际知名企业供应链管理岗位招聘面试模拟题及答案解析
- 2025年产品经理实战模拟题及案例分析
- 2025年家用通风电器具合作协议书
- 2025年铝合金预拉伸厚板和蒙皮铝合金板合作协议书
- 肺动脉高压的教案
- 2025年电子装联专用设备项目建议书
- 10000立罐施工方案
- 2025年高纯人造硅灰石合作协议书
- 职业素养护理题库及答案
- 肾切除患者护理疑难病例
- 人力管理咨询合同范本
- 2025译林版高中英语高考复习必背全七册单词表(精校打印)
- 2025年变压器绝缘材料项目可行性研究报告
- 浙江墨鱼影业有限公司委托评估腾讯视频网剧《帝王侧》项目收益价值·评估报告
- GB 12158-2024防止静电事故通用要求
- 第1章 电子商务数据分析基础
- 混凝土搅拌运输施工方案
- 光伏电站组件清洗方案计划
- T-CFA 030501-2020 铸造企业生产能力核算方法
- 降低阴道分娩产妇会阴侧切率QC小组改善PDCA项目汇报书
评论
0/150
提交评论