当前位置:首页 > 实现
  • 你在微信上想要的功能 QQ都帮你实现了

    你在微信上想要的功能 QQ都帮你实现了

    QQ 20 周年,朋友圈里流行起了晒 Q 龄的活动。不少人从学生时代就开始使用 QQ,一直到毕业、工作,甚至步入了中年。而 QQ 自己却不像一个已经 20 岁的老应用,它还在不断增加着新功能、制造新惊喜。 相比之下,年轻的微信反而显得有些「行动缓慢」,不少呼唤已久的功能迟迟不肯上线,比如语音进度条、夜间模式等。而这些功能,在 QQ 上已经都实现了。 语音进度条 要说微信用户最期待的功能,语音进度条应该可以排到前三。很多人都被连续的 60 秒长语音轰炸过,本来几秒钟就能看完的文字内容,播放语音需要花上好几分钟。如果一不小心打断了播放,就得重新再听一遍...... 实在是浪费时间。 解决长语音的问题,首先可以使用微信自带的语音转文字,这个功能只对普通话管用,稍微嘈杂一点的环境就会不准确。而语音进度条可以大量节省收听者的时间,只听重点。不少主打通讯的社交软件就以此为卖点,比如锤子科技的子弹短信、今日头条的飞聊。 在手机 QQ 的 8.0.0 版本中,也加入了语音进度条的功能,经过了几个版本的优化,在 QQ 中收听语音消息变得十分方便。你可以用自带的功能将语音转为文字,然后控制进度条播放想听的内容。嫌他废话太多?你还可以选择 1.5 倍速、2 倍速播放,就像很多视频网站一样。 聊天记录同步在我的手机里,空间占用最大的应用不是视频,也不是游戏,而是微信。很多人由于工作原因会加很多聊天群,每天产生大量数据,而这些群大部分还不能删除。 微信的聊天记录功能十分原始,只能保存在本地,没有云端服务。这导致聊天记录一旦丢失,就很难再找回来。换手机时更是麻烦,动辄几十个 G 的聊天记录,一转就是好几个小时,还不能断,否则就要重新转移。(如果流量充足,可以尝试用一台手机给另一台手机开热点,传输会更加稳定。) QQ 一直都支持聊天漫游的功能。换手机、恢复出厂,都不用担心聊天记录丢失。聊天记录默认支持 7 天的漫游,如果不够还可以开通超级会员,体验最多两年的漫游,非常方便。 聊天界面长截图八卦是人类的本能,有人经常会将有趣的聊天记录分享给朋友。在微信里,你可以选择逐条转发和合并转发,最终收到的是一串聊天消息,并不直观。 直接截图要更为方便,QQ 就将聊天界面的长截图做成了内置功能。你可以长按消息进行多选,勾选好要截图的消息后,点击长截图按钮合成。点击消息可以自由选择内容,出于隐私保护,可以选择隐藏昵称,不用再进行二次处理。最后点击完成,就是一张美观的聊天截图。 QQ 上还有很多值得微信学习的功能,比如夜间模式、文字识别、回复指定消息(微信只能在电脑端完成)等。QQ 由于面向的是年轻人,在功能的尝试上更加大胆,没有什么束缚。而微信的使命过于重大,反而束手束脚。 如果你对于现在的微信还不满意,其实可以尝试用回 QQ,从易用性上来说它已经做得非常不错。

    时间:2019-08-23 关键词: 实现 功能 微信 qq 想要

  • 5G能实现但4G不能做的10件事情

      2019年6月6日,工信部正式向中国电信、中国移动、中国联通、中国广电发放5G商用牌照,这表明中国正式进入了5G商用的阶段。一时间关于5G的讨论更加热烈,那么对于普通用户而言,5G相比4G到底有何不一样?   从三星Galaxy S10 5G手机到OnePlus 7 Pro 5G手机以及更高版本,首批5G手机现已上市。5G网络时代的开启是从小范围内,如果你居住在可以使用5G的地方,那么它可能值得尝试。   5G作为下一代移动技术,它不仅仅是速度更快,还将实现全新的应用,而这些应用是在4G时代不可能或者不实用的。   5G的一些最佳用途可能还没有被发现,但下面是我们已经知道的十个令人兴奋的用途。   1、8K流媒体视频   4K流媒体视频不是很多人会通过4G观看。然而,5G应该可以实现巨大的飞跃,并以8K的分辨率流式传输视频,且无需等待它缓冲。   这是5G速度更快的一个明显例子,也就是在相同的时间内传输更多数据,因此,即便传输更高质量的视频,传输速度也没有明显的差异。   当然,我们还没有能够使用这一功能的手机或者电视,但我们预计它们将很快就会出现,因为技术已经准备好。事实上,华为已经宣布了8K 5G电视的计划。   2、高速下载   除了更高分辨率的流媒体视频,你还能够以超过5G的速度下载内容,这将使下载8K电影更加可行。从技术上讲,你可以通过4G或3G网络下载它们,但会非常慢。   此外,5G更高的速度将让任何大型文件的下载更加可行,这也可能意味着更好的游戏和应用程序,具有更佳的图象和更多功能。因此,你会希望手机具有足够的存储空间。   3、无延迟的在线手机游戏   通过移动网络进行在线游戏并不总是理想,不仅仅是因为速度,还需要考虑延迟。延迟是网络响应请求所需的时间,使用5G网络时响应会更快。   这意味着当你在游戏中操作时它会立即响应,不会因为延迟而错过重要的杀戮。在线游戏本身可以变得更加完善,更接近游戏机的质量,因为更高的网络速度将有助于应对游戏中的多个玩家。   游戏本身也有潜力进行流式传输,利用5G的强大功能来处理云中的繁重任务,允许更高端的游戏,而不需手机具备更强的能力,谷歌Stadia准备用这样的方式做。   4、VR在线游戏流   说到流媒体游戏,一旦将处理转移到云端,传输真的是限制,5G将有助于解决这个问题。   我们不仅会关注游戏机品质的游戏,还可能会看到VR游戏,超出Google Daydream甚至PlayStation VR所能提供的功能,所有游戏都在手机上运行,甚至甚至只是一个头戴式耳机,它没有真正的计算能力。      5、VR直播   通过VR观看体育赛事和音乐会直播并不是一个全新的概念,但它仍然非常罕见,通常需要极速的家庭有线网络连接来实现。但是,借助5G,应该可以使用移动VR头戴式耳机观看直播,无论身在何处都能获得前排视角。   5G VR直播有可能成为一种全新的生活方式,突然间,花钱买票的想法突然变得不那么吸引人了。   6、更多的直播   不仅是智能手机,?5G也可能进行电视直播。当前的广播技术,受到现场较低速度和/或大型设备(例如直播车)的限制。   使用5G,设备的速度和便携性都可以大幅增加,这意味着直播更多活动将是可行的和负担得起的。你可能会看到每场足球比赛,而不仅仅是大型的比赛,而现场音乐会的播出可能成为标准,而不是罕见。   广播服务公司?Red Bee Media认为,这种直播活动的能力将有助于传统广播公司与?Netflix等按需服务竞争。换句话说,传统广播公司将焕发新的生命力。   7、全息电话   您已经可以进行视频通话了,但全息通话怎么样?这是沃达丰已经通超越5G技术成功实现的应用。   虽然涉及的技术不仅仅是5G本身,但这可能意味着有一天你可以和你正在谈论的人在同一个房间里,让世界变得越来越小,并让人与人能更紧密地联系在一起。   8、增强AR   AR(增强现实)技术是我们在过去几年中看到很多次的技术,但它仍然处于早期阶段。5G可以改变这一现状。   凭借5G提供的高速和低延迟,它将能够以比4G更大的方式增强现实。在未来,您甚至可以看到通过汽车挡风玻璃或智能眼镜投射的完全个性化的广告。   说到汽车,5G可能会通过智能挡风玻璃实现导航等功能。这只是两个例子,但AR显然不止是PokémonGo。   9、自动驾驶汽车成为主流?   5G可能使自动驾驶汽车成为主流。为了使它们最有效地工作,需要能够快速地向其他汽车、智能道路等发送和接收数据,这需要快速的网络,具备低延迟、大量带宽和高可靠性的特性,而这恰好是5G都具备的。   正如Ordnance Survey接受英国广播公司采访时所说的那样,“当你开灯时,它会立即开启。这就是自动驾驶汽车所需要的,如果发生某些情况,汽车需要立即停止,这就需要高频5G信号。”?   10、更智能的家和城市   5G的速度和带宽可以真正帮助提升的是物联网(IoT)。虽然我们已经看到了物联网正在普及,从智能恒温器到智能灯出现在人们的家中,5G能提供几乎所有连接家庭智能设备所需的容量。   但5G不会局限在智能家居,我们应该开始看到由5G驱动的智慧城市。这意味着城市管理人员能够实时监控污染、交通、人流、能源使用等。   这反过来可以减少资源的浪费降低成本,例如,当没有人在周围时允许路灯自动调暗,让城市更环保。

    时间:2019-06-08 关键词: 4g 实现 5G 不能做

  • DSP中DMA操作的无阻塞请求实现

    DSP中DMA操作的无阻塞请求实现

    DMA在DSP应用中至关重要,本文给出了DMA操作非阻塞的请求方法,针对TMS320C620x,实现了与CSL中DAT接口一致的驱动模块QDAT,并指出了EDMA相关的高级特征。 在DSP中,DMA控制器实际是一个外设,与其他集成的串口、主机接口、片外内存接口等都在系统外设总线上,也与其他外设一样有一组相关的控制/状态/数据寄存器,CPU可以访问。 非常重要的一点是,DMA通道能够用于内存之间的数据传送。这里内存都是统一编址的,包括:片上内存,程序和数据分立;接在EMIF上的片外内存,如SDRAM;外设的寄存器也都是内存映射的(memory-mapped),所以DMA通道也可以用于外设和内存之间,进行外设数据接收与发送。 在DSP的处理模型中,所有数据应位于片上供CPU处理,不鼓励CPU直接访问片外数据,因为CPU访问片外资源的时间较长,周期数也不确定,对于实时性和确定性不利。片上内存有时也能够配置成为缓存(cache),缓存控制器会根据一定策略、使用DMA方式切换片外的数据进出缓存,最终使得用户能够在片上访问数据,这个过程对用户是透明的。正因为缓存的机制是透明的,所以也是很难控制的。比如,一段调用频率很高的代码很可能被不常用的部分清出缓存,因为它们映射相同,但随后又很快被调入,这样会造成局部的效率降低。 所以,如果能够明确掌握程序流或数据流的运转特征,不使用缓存模式,用户通过DMA进行自定义的调度,可能提高效率。有的处理器不具备缓存控制器,不支持片上内存作为缓存,如C6205的片上数据内存就不能够配置为缓存,所以主动使用DMA移动数据不可避免。DSP的DMA功能一般也都较为强大,TI C6000系列的DMA通道支持1D-1D、1D-2D、2D-1D以及常用的2D-2D数据传送,对DMA的合理使用可能替代相当的编程效果,如排序、采样或裁剪。 TI的CSL(Chip Support Library,芯片支持库)对于使用DMA给出了很好的支持,有专门的DMA模块,便于对DMA的各个寄存器进行控制。还有一个DAT模块,使用DMA进行内存数据传送,函数DAT_copy()和DAT_fill()就像常用的内存操作memcpy()、memset()一样,只需要在API接口指出源地址、目的地址和长度,或者其他的维数属性等即可,不需要再去管具体的寄存器,非常方便。 视频处理实例分析 DAT模块易用,但因为是在CSL中,所以只能将DMA控制器直接的功能表达出来。对于灰度图像处理(先不考虑将算法处理后的结果传回片外的情况),在下面的处理框架中,每次DMA执行操作时,CPU在前台还可以做算法处理任务。 ... task=DAT_copy(...);//启动头一个DAT任务 ... while(not_finished){ DAT_wait(task); //本次task完成 task=DAT_copy(...); //启动下一次的DMA pingpong_alg_process(...); //对本次传送的数据处理 } 当视频为4:2:0 YUV图像(planar模式)序列,需要处理某一区域时,实际上是在相同时机处理Y、U、V三块数据,通常它们并不连续,也就是说,将会同时使用三个DMA操作。 这里可能可以同时启动多条DMA通道,但有一些限制: 1. 有的处理器支持同时启动的DMA通道数有限,有些DSP有4条通道,但寄存器集只能完整地支持两条; 2. 由于共享总线和某些接口,同时工作的DMA通道数过多将可能增加访问冲突,降低系统性能; 3. 有时多条通道又必须同时使用,比如系统视频、音频采集进入的数据必须占用独立的通道。 所以,上面的任务能够尽量使用一个DMA通道完成,不失一般性,DAT模块的所有操作实际上是在一条打开的通道上完成的。那么,对于YUV图像,处理程序框架类似上面,可能如下, ... taskY = DAT_copy(...); taskU = DAT_copy(...); taskV = DAT_copy(...); ... while(not_finished){ DAT_wait(taskY); DAT_wait(taskU); DAT_wait(taskV); taskY = DAT_copy(...); taskU = DAT_copy(...); taskV = DAT_copy(...); YUV_pingpong_process(...); 这时问题出现了:C620x的DMA通道一次只能接受一个传送请求,也就是说,每次请求必须等到该通道空闲时才可能真正提交上去,这样taskY和taskU在后台操作时,前台无法进行taskU和taskV的启动,即实际上前台没有什么处理任务可做,浪费了效率。而这三个dat任务绑定在一起,启动时机很难拆开。显然,如果能够允许DMA请求连续地提交,将提高效率。 DMA通道请求非阻塞提交的方法 把DMA通道看作一个单处理单元,每个DMA操作作为一个任务,这就形成了一个单处理多任务的模型,任务调度就是FIFO。不妨定义: 1. DMA通道请求上下文是一个数据结构,它包含启动一次DMA传送所需要设定的寄存器参数集合,如源、目的、长度、index寄存器(维数)等等; 2. DMA通道请求上下文队列,一个DMA请求上下文的队列用以缓存DMA请求; DMA通道的使用和请求非阻塞的提交应有以下两条原则: a. 应用程序的使用DMA通道的方法: 提交DMA通道请求(无阻塞),获得此次任务的id;在需要使用某任务的目标内存时,应检查该id任务状态直到完成;如果完成,即可进行相应的处理。 b. 无阻塞提交DMA通道请求的实现:标志此次DMA传送任务正在进行;如果DMA通道空闲,设置寄存器启动DMA操作,标志DMA通道正在工作;如果DMA通道正在工作,则将此次DMA请求插入上下文队列。 3. DMA中断服务程序(注:DAT模块不使用ISR,只是查询对应标志,确定DMA传送是否完成):标志此次DMA传送任务完成;如果DMA请求上下文队列为空,标志DMA通道空闲;如果DMA请求上下文队列非空,则从队列中取出头一个DMA请求上下文,用以设置相应的寄存器启动DMA操作。 QDAT:一个非阻塞的DMA模块实现 在TI C620x DSP上,一个非阻塞的DMA模块QDAT根据以上原理得以实现。 QDAT的API与DAT模块的基本一致,优点是使用上述的YUV图像处理应用程序中,不会发生DMA请求阻塞; QDAT与DAT模块功能相似,但属于驱动程序层次的实现,基于:CSL的DMA模块;CSL的IRQ模块;以及DSP/BIOS的QUE模块。 不过实现十分简便、轻盈。 该模块独立于应用和算法,已经在基于TI C620x DSP上的多个项目中使用,效果十分理想,特别是因为QDAT任务中的DMA操作经过了串行化,也大大降低了在EMIF上访问内存时的冲突。 EMDA的先进特征这些项目向新的TI DM642媒体处理器上移植时,以上的操作将利用EDMA的先进特征, 因为TI C6x1x 和 C64x DSP开始使用EDMA,值得注意的是,EDMA通道控制器(EDMACC)有专门的PRAM(parameterRAM)来缓存DMA请求参数,EDMA事件参数表中有标志以及LINK address,用来指示本次DMA传送结束后, 是否有新的DMA请求参数需要重载入操作寄存器; 如果有,LINK address所指就是新的参数在PRAM的位置。 显然因为这样的链表机制,使用该通道连续两次传送之间无需中断处理程序(CPU)介入队列管理,效率将提高。 对于频繁的内存数据传送,如DAT操作一般使用QDMA, 它由CPU直接将传送请求(TR)提交给传送控制器(EDMATC),TC中有四个优先级队列,每个TR都将进入其对应(已指定)的一个队列。 对于不同的请求源,队列的长度可编程,每个队列最多可以接收7个QDMA请求。 如果队列有空,TR就可以进入;若满了,CPU将会停止(stall)几个EDMA周期等待TC的执行,队列随即空出一个位置。 总之,EDMA执行机构这种纯硬件的队列机制使得效率提升更加极大化, 减少了软件对此的相关开销。 欲获取相关技术信息可以访问www.embeddedcore.com。

    时间:2018-09-05 关键词: DSP dma 实现 操作 驱动开发 无阻塞请求

  • 揭秘以太网接口在印制电路板上的实现

    揭秘以太网接口在印制电路板上的实现

    上世纪70年代以太网诞生了,发展至如今我们对它并不陌生,浮现在现代化生活的每一个角落,或许正因它的无所不在让其带着神秘的色彩,今天我们将从其中一个角度揭开其神秘的面纱。 我们现今使用的网络接口均为以太网接口,目前大部分处理器都支持以太网口。目前以太网按照速率主要包括10M、10/100M、1000M三种接口,10M应用已经很少,基本为10/100M所代替。目前我司产品的以太网接口类型主要采用双绞线的RJ45接口,且基本应用于工控领域,因工控领域的特殊性,所以我们对以太网的器件选型以及PCB设计相当考究。从硬件的角度看,以太网接口电路主要由MAC(Media Access Controlleroler)控制和物理层接口(Physical Layer,PHY)两大部分构成。大部分处理器内部包含了以太网MAC控制,但并不提供物理层接口,故需外接一片物理芯片以提供以太网的接入通道。面对如此复杂的接口电路,相信各位硬件工程师们都想知道该硬件电路如何在PCB上实现。 下图 1以太网的典型应用。我们的PCB设计基本是按照这个框图来布局布线,下面我们就以这个框图详解以太网有关的布局布线要点。   图 1 以太网典型应用 1. 图 2网口变压器没有集成在网口连接器里的参考电路PCB布局、布线图,下面就以图 2介绍以太网电路的布局、布线需注意的要点。   图 2变压器没有集成在网口连接器的电路PCB布局、布线参考 a) RJ45和变压器之间的距离尽可能的短,晶振远离接口、PCB边缘和其他的高频设备、走线或磁性元件周围,PHY层芯片和变压器之间的距离尽可能短,但有时为了顾全整体布局,这一点可能比较难满足,但他们之间的距离最大约10~12cm,器件布局的原则是通常按照信号流向放置,切不可绕来绕去; b) PHY层芯片的电源滤波按照要芯片要求设计,通常每个电源端都需放置一个退耦电容,他们可以为信号提供一个低阻抗通路,减小电源和地平面间的谐振,为了让电容起到去耦和旁路的作用,故要保证退耦和旁路电容由电容、走线、过孔、焊盘组成的环路面积尽量小,保证引线电感尽量小; c) 网口变压器PHY层芯片侧中心抽头对地的滤波电容要尽量靠近变压器管脚,保证引线最短,分布电感最小; d) 网口变压器接口侧的共模电阻和高压电容靠近中心抽头放置,走线短而粗(≥15mil); e) 变压器的两边需要割地:即RJ45连接座和变压器的次级线圈用单独的隔离地,隔离区域100mil以上,且在这个隔离区域下没有电源和地层存在。这样做分割处理,就是为了达到初、次级的隔离,控制源端的干扰通过参考平面耦合到次级; f) 指示灯的电源线和驱动信号线相邻走线,尽量减小环路面积。指示灯和差分线要进行必要的隔离,两者要保证足够的距离,如有空间可用GND隔开; g) 用于连接GND和PGND的电阻及电容需放置地分割区域。 2. 以太网的信号线是以差分对(Rx±、Tx±)的形式存在,差分线具有很强共模抑制能力,抗干扰能力强,但是如果布线不当,将会带来严重的信号完整性问题。下面我们来一一介绍差分线的处理要点: a) 优先绘制Rx±、Tx±差分对,尽量保持差分对平行、等长、短距,避免过孔、交叉。由于管脚分布、过孔、以及走线空间等因素存在使得差分线长易不匹配,时序会发生偏移,还会引入共模干扰,降低信号质量。所以,相应的要对差分对不匹配的情况作出补偿,使其线长匹配,长度差通常控制在5mil以内,补偿原则是哪里出现长度差补偿哪里; b) 当速度要求高时需对Rx±、Tx±差分对进行阻抗控制,通常阻抗控制在100Ω±10%; c) 差分信号终端电阻(49.9Ω,有的PHY层芯片可能没有)必须靠近PHY层芯片的Rx±、Tx±管脚放置,这样能更好的消除通信电缆中的信号反射; d) 差分线对上的滤波电容必须对称放置,否则差模可能转成共模,带来共模噪声,且其走线时不能有stub ,这样才能对高频噪声有良好的抑制能力。   3. 变压器集成在连接器的以太网电路的PCB布局、布线较不集成的相对简单很多,下图 3是采用一体化连接器的网口电路的PCB布局、布线参考图:   图 3一体化连接器的网口PCB布局、布线参考图 从上图可以看出,图 3和图 1的不同之处在于少了网口变压器,其它大体相同。不同之处主要体现在网口变压器已集成至连接器里,所以地平面无需进行分割处理,但我们依然需要将一体化连机器的外壳连接到连续的地平面上。 以太网布局布线方面的要大致就这些,好的PCB布局布线不仅可以保证电路性能,还可以提高电路性能,笔者水平有限,不足之处欢迎指正交流。

    时间:2018-01-23 关键词: 以太网 电路设计 实现 印制电路板

  • 一个通用应用运维管控平台的设计实现

    一个通用应用运维管控平台的设计实现

    一、问题背景: 大部分的应用运维工作随着服务器数量和产品数量的增长而增加,而运维人数的不足导致单个运维人员所承担的工作任务较为繁重,同时运维工作的不标准、无自动化使得应用运维任务十分复杂,耗费的大量的人员成本、时间成本和沟通成本。 应用运维工作说白了大体可以分为两种情况:1. 在某个或某些服务器上执行某个脚本或命令;2.将某个或某些文件传输到某个或某些特定的服务器的特定位置上。在服务器数量较少的情况下,可以通过ssh或scp命令实现上面两个操作;服务器数量较多的情况下,我们可以通过包装ssh或者使用批量ssh工具,如pssh,ansible等来解决问题,但这种方式大多数都是一次性的方式,无论使用方法以及后续跟踪来看都并不友好。 还有,由于一系列历史原因,现网的服务环境也较为繁杂,现网的服务器上的代码、配置、软件包、脚本等文件没有进行统一的版本管理与配置管理,比如某个产品的代码版本多种多样;现网的代码和文件几乎都是通过一台复制到另一台的方式来实现;由于代码版本、配置版本等问题导致的现网质量事件也并不在少数。 另外,应用运维也需要一个统一的资源管理系统,对现网的服务的数据进行业务维度的资源管理,系统运维的CMDB系统只在静态资源维度进行了管控,动态的业务数据等资源需要应用运维团队自行来管理。 因此,针对上面所述的各种问题,需要一个运维管控系统,来解决包括:资源管理、配置管理、任务管理、文件发布等一些列常用的运维跟踪,通过简单高效、自动化的方式将繁琐的应用运维工作通过管控系统来完成,即可以降低运维的难度,也可以提高运维的效率,同时可以提高运维操作的成功率,并实现运维任务的持续跟踪和管理,甚至在不远的将来可以实现移动运维。 二、功能结构: 经过上述的分析和整理,我们将整个管控平台的功能细化到如下几个大功能,如图所示:   三、详细设计: 这里围绕上面功能结构图中的4个大功能,进行详细的分析和设计,其中移动运维功能为附加功能,这里暂时不介绍。 3.1 资源管理 先说资源管理,资源管理是一切后续自动化运维功能的前提,也是所有自动化功能的数据依赖。 资源管理的功能可以较为薄弱,但是对数据的要求比较高,可以基于系统运维的CMDB系统进行二次构建,主要的功能可以分为: 1、物理机资源管理:物理机资源管理功能,需要将CMDB中所有交付到应用运维的物理机资源进行重新整理,按照二级业务产品线进行管理,支持多种服务器状态(如部署中,备用池等等)标注。可以基于物理机资源管理系统进行服务器初始化管理操作,加快服务初始化部署工作的效率。物理机资源管理对于后续的配置管理和作业管理来说是最为重要的,是后续两个功能的数据基础。 2、管理虚机资源管理:所有的管理服务都部署在管理虚机上,因此我们也需要对管理虚机进行管理,管理虚机的数据和物理机资源管理一样,可以依赖系统运维的CMDB中的数据进行二次管理,功能和物理机资源管理类似,这里不再阐述。 3、虚拟资源管理:虚拟资源管理就是在每一台物理机上的虚拟机/业务DB的资源管理,可以基于业务管理数据库中的数据进行二次整合,或者通过数据采集上报的方式实现,尽可能的做到虚拟资源数据的有效性和状态一致性。 虚拟资源数据在进行后续的虚拟资源管理、虚拟资源迁移等功能上会有较大帮助,可以基于虚拟资源管理完成自动化的实例迁移工作,节省大量的手动实例迁移任务。另外虚拟资源管理对宕机恢复或机房、机架断电等问题也会有较大的帮助。 整个资源管理比较简单,可以优先完成物理机资源管理功能,再实现虚拟资源管理功能。 3.2 作业管理 作业管理是应用运维管控系统的核心功能,也是应用运维工作中最经常使用到的功能,作业管理功能也可以分为如下子功能,如图所示:   下面将分别对上面几个子功能进行详细介绍: 1. 脚本执行: 脚本执行和文件分发是整个作业功能的基础功能,其他的功能都是通过对着两个功能进行组装和装饰来实现的。 脚本执行的表现形式就是运维人员在页面中提交一个脚本,脚本建议支持shell和python两种形式,可以通过三种方式: 1)手动书写;也就是在页面上的编辑器中编写脚本; 2)上传脚本;也就是通过浏览器将本地的脚本上传到系统中; 3)克隆系统脚本;所谓的系统脚本就是运维人员通过上面两个步骤提交到系统中的脚本,可以分为基础系统脚本和用户系统脚本,基础系统脚本就是那些我们明确可能会多次执行的脚本,比如服务器初始化等脚本;用户系统脚本就是用户自定义的脚本,可以实现任何功能。 脚本的编写要依赖一定的语法规范,我们可以为shell和python语言提供基础的类包和函数库,同时所有的脚本的执行结果都会根据脚本的exit的 $? 值来判断,$? 值为0,则表示该脚本执行成功,若为其他值则表示脚本执行失败。脚本的输出内容会存储到数据库中用于后续的问题跟踪和排查,因此需要运维人员写脚本的时候注意写上详细的日志内容。 脚本支持输入参数。用户可以在页面中的参数一栏输入执行参数,当然也可以直接写到脚本里。 支持选择执行账户。目前大部分服务的运行账户仍然是root用户,后续可能会改成非root用户,所以这里支持选择执行账户,具体的账户名称,可以在用户管理的功能中维护。 支持选择所执行的服务器。用户在选择好相应的脚本之后,需要指定在哪些服务器上执行该脚本,因此需要支持选择所需的服务器。这里面服务器选择分为两种模式: 1)本地执行模式;本地模式指,该脚本的执行并不会到远程服务器去执行,而是在管理服务所在的本地执行,这种模式可以用来判断远程服务器是否启动等功能,或是某些只能在管理服务器上执行的命令;[!--empirenews.page--] 2)远程服务器执行模式;远程服务器执行模式就是比较常规的将脚本发送到远程服务器上,并在远程服务器上执行的模式,这种模式需要选择所需要执行服务器列表,这里就需要依靠资源管理系统中的物理机管理功能了,可以通过某种方式对服务器进行手动分组或自动分组,然后执行的时候可以按照不同的维度(比如按ip选择,按机房选择,按业务选择,或按自定义组名选择)选择所需的服务器组,进而将脚本下发到这些服务器上执行。 总结一下,脚本执行功能比较基础,同时还包含三个子功能,这三个子功能放到配置管理里面去实现,后面会具体阐述: 1)脚本管理功能;用于管理用户上传的脚本和常用的基础脚本。 2)账户管理功能;用于管理具体的执行用户。 3)服务器分组功能;用于基于资源管理系统的物理机管理数据按照某种方式划分成一定的服务器组。 说完具体的功能之后,我们需要确定具体的实现方式,准确的说,实现方式有两种: 1)SSH远程执行;可以通过封装ssh和paramiko的方式实现,python中的ansible和fabric包也都支持远程SSH执行的功能。Shell就用ssh命令即可。 该方式对中心节点要求比较高,每一个远程执行命令都会在中心节点启动一个进程(线程)来执行,对中心机的压力较大,同时由于是基于SSH的原理,故命令执行的效率较差,命令执行时间长。 2)Agent执行;在每台服务器上部署一个Agent,用户执行管控系统发送的脚本。这种方式的优点是可以采用拉的方式,由各个子节点订阅分给自己的任务,执行完成后再讲结果推给中心节点的数据;当然也可以像SSH方式通过推的方式由中心节点将任务发给远程的Agent,然后Agent去执行,并将结果反馈给中心节点。这种方式的执行效率会比较高,可扩展性强,将来甚至可以通过该Agent进行配置或运行数据上报,对于配置管理也比较方便,缺点是需要开发Agent,Agent需要支持异步非阻塞模式,且需要维护每台服务器的Agent,包括部署和管理。 Python的saltstack软件就是通过Agent的方式实现的,需要在每台物理机上部署一个saltstack minion进程用于接受任务和执行任务,在每个中心机上部署saltstack master进程用于下发任务,saltstack master通过将任务下发到zeromq中从而实现各个minion获取任务并执行,同时saltstack也支持将任务执行结果存储到Redis等数据库中,便于后续的跟踪和查看。 不过Agent也可以通过自行开发的方式实现,线上所有的Agent大多都是这种原理,也都是自己实现的,不过具有一定的开发难度。 因此对于脚本执行的实现方式来看总结如下: 1)如果用SSH的方式,使用python的ansible api或fabric。 2)如果用Agent的方式,可以考虑使用Python的saltstack minion Agent。 3)如果用自研Agent的方式,可以使用golang。上面两种方式相对快速容易实现,这种方式会有一点的时间消耗,不过可以积累一定的开发经验。 2. 文件分发: 文件分发是除了脚本执行的另一个基础功能,该功能的技术描述就是将某台服务器上的某个或某些文件,传输到其他的某个或某些服务器的某个位置上。 文件分发功能分为以下两个子功能,相关文件和模板的管理工作放到配置管理中去实现,这里只介绍如何实现文件分发: 1)普通文件分发,如代码包,镜像文件,软件包等。 2)模板文件分发,如配置文件等。 模板文件分发与普通文件分发不同的区别是模板文件中存储变量替换的逻辑,这里普通文件的管理和模板文件的管理以及配置变量的管理都放到配置管理系统中去实现,用户选择文件下发的时候可以选择是普通文件还是模板文件,如果是模板文件就会自动去加载配置管理中的变量管理生成临时的普通文件并下发。 具体的下发方式也分为两种: 1)管理机文件下发到普通的业务物理机上。 其实大部分的文件分发场景应该都是这一种,也就是我们将基础文件或模板文件放到管理机上,作为我们的基准文件,比如我们的部署代码,软件包等等,我们只要保证管理机上的文件版本的一致性,就可以保证普通的业务物理机上面的文件和管理机上的文件一致,也就是配置管理功能的中的文件版本一致性管理。 这种模式下的文件可能相对容量较小,比如小文件(几k),软件包(几M),或者稍大文件(几G),文件从管理机下发到某些业务物理机上面临的问题是并发导致的传输速度问题,小文件情况下还可以忽略,基本可以在秒级完成,但稍大文件的传输就会有时间问题,随着业务物理机的个数增加而增加,因此这种情况会有并发和流量的控制。 另外文件的传输会提前进行文件md5的对比判断,如果文件的md5值相同,那就没有再传输文件的必要,在稍大文件情况下可以节省较多的时间。 文件传输,可以使用ansible的copy模块,或者salt的文件file模块,当然也可以自研方式中封装rsync的方式,rsync支持文件md5值校验以及断点续传等方式。 2)物理机之间的文件互传。 物理机之间的文件互传准确的来说是反配置管理逻辑的,这种方式就和我们现在的文件传输方式很类似,也就是从一台服务器scp文件到另一台服务器上。对于配置文件和小文件、软件包等需要配置管理的文件来说,我们需要明确禁止使用这种方式。但这种方式的好处就是可以用来P2P的传输较大的文件,比如几百G的镜像文件。 对于几百G的镜像文件来说,如果使用第一种管理机管理的方式,只能1对多的传输将会造成传输时间的极大占用,而使用这种P2P的方式,即可以极大的提升文件传输的速度。 物理机之间的文件互传使用rsync即可,由于文件较大,且可能出现断点,rsync是比较方便的解决大文件传输的方法,需要在每台服务器上的Agent上对rsync功能进行封装,支持Agent之间的rsync文件互传。 物理机文件中需要管理的文件列表,可以通过Agent汇报到配置管理系统中,用户选择文件分发的时候,可以选择配置管理系统中的点对点大文件传输功能,配置管理系统中可以自动选择传输源,针对被传输物理机的个数,实现真正的点对点传输,不需要用户自己去选择源文件服务器,可以节省大量的人为运维操作。 3. 批量执行: 所谓的批量执行功能就是上面两个基础功能中在选择目的服务器的个数的时候支持多个服务器,而不是只能选择单个服务器。[!--empirenews.page--] 在使用SSH方式情况下并发的速度会较差,可能控制在单机30-50个任务同时进行。 在使用Agent的方式情况下,任务本身是异步下发的,可以实现同时1000+任务同时进行。 由于服务器数量较多,且分机房的模式,整个后端架构会是与目前的UCloud后端架构类似的分布式架构,一个中心任务下发节点,每个机房一个任务中转节点,每台服务器一个Agent(或者中转节点SSH的方式)。 4. 定制任务: 所谓的定制任务,就是可以通过任务组装的方式,将脚本执行和文件分发这两个主要功能(可以根据需要添加其他的功能,比如重启后的服务器ping探测,端口探测等),将上面的这些功能,按照1、2、3、4、5的方式组装,具体的支持功能如下: 1) 支持使用基础功能模块的子任务组装成完成任务 2) 支持设置每个子任务的子步骤的执行控制。比如失败后停止,完成后停止等待确认,忽略失败等功能。 3) 支持每个子任务的执行服务器ip修改。 定制任务适用于某些使用频次较高的任务,比如服务器初始化上线,代码版本发布,软件包更新等操作。 5. 定时任务: 定时任务是对普通的基础任务以及定制任务实现定时执行的功能,该功能的实现也相对简单,即按照crontab的分时日月周的语法,支持周期性或者定时性,也可以按照手机创建闹铃的方式选择触发时间和触发频率。 具体的实现方式如下: 1)用户输入的时间计划通过转换后写到管理机的crontab服务中。 2)每次有定时任务产生或删除或修改后生成新的计划任务。 3)计划任务中写明具体的执行命令 4)通过脚本调度API的方式实现任务的定时执行。 6. 灰度计划: 对于非周期性重复执行的任务,都可以加入灰度计划功能,该功能又结合定时任务实现。 灰度计划可以有两个维度体现: 1)定制任务中的每个子任务的子步骤都可以实现灰度,即上面所说的完成后暂停,或失败后暂停。 2)物理机个数维度,并发执行的时候支持自定义灰度计划,比如:任务先执行1台服务器,成功后隔多久后可以执行第二批服务器,再间隔一段时间再执行第三批任务。同时可以设置任务失败条件,比如:任何一台服务器失败,则整个任务失败;或当失败服务器的数量达到灰度计划服务器数量的百分比后整个任务放弃执行。 上面这些是作业管理系统的主要功能,当然想要实现整个作业管理系统还会有一些其他的子功能,比如: 1)任务结果记录跟踪系统。 2)任务重做,重做任务子步骤是否重做控制。 3)脚本内容安全审核功能。 4)其他暂时未想到功能。 3.3 配置管理 配置管理功能是整个管控功能中十分重要的一环,上面的作业管理系统中很多功能都依赖配置管理系统才能实现。 配置管理整个功能经过梳理之后如下图所示:   下面将依次介绍上面所述的功能: 1)账户管理: 所谓的账户管理十分简单,就是服务运行的时候所使用的用户,目前线上的服务大多都是root用户,但是有改成业务用户的趋势,故需要有一个账户管理功能。运维人员在使用作业管理的时候,选择相应的用户进行任务执行。 该功能可以发展成用户权限管理系统,即在该系统中控制每一个用户的系统权限。生成相应的权限配置文件,并下发到所有服务器上。不过用户管理的功能可能系统运维已经管理,这里就不再叙述了。 2) 文件管理: 文件管理功能比较基础,其实主要是对管理机上的重要文件进行管理,比如代码版本,脚本文件,软件包文件等等,文件类型包括:普通文件,文件夹,压缩文件和模板文件。 文件管理中,用户按照一定的规范将所需要的文件放到管理机上的指定位置,并将相应的路径配置在数据库中。 文件管理主要用在作业管理中进行文件分发的基础文件依赖。 3)脚本管理: 脚本管理也是文件管理中的一种,但需要单独管理,脚本是作业管理系统的基础依赖。脚本分为基础系统脚本和用户自定义脚本两种。 所谓的基础系统脚本就是经过严格认证过的,可以重复多次使用的基础功能脚本。而用户自定义脚本指用户通过上传或是通过web 编辑器提交的脚本文件,存储下来用户后续可能的重复使用。 基础系统脚本和用户自定义脚本都会存储在管理机的固定位置上,在文件管理中进行管理,用户在使用的时候选择对应的脚本名称即可。 脚本也支持添加标签,方便记忆和查找。 4)分组管理: 分组管理也是基础功能之一,在作业系统中脚本执行和文件分发都需要有明确的服务器ip地址,而分组管理就是将这些ip地址按照特定的用户自定义的方式来命名和分类,支持添加标签,用户在选择服务器的时候可以通过搜索的方式选择到一组服务器中的一个或几个。 分组管理依赖于资源管理系统,以资源管理系统的物理机资源(管理服务是虚拟机资源)为依据,用户选择一部分服务器并进行命名或添加标签从而得到一个新的分组。 分组可以分为静态分组和动态分组两种。 所谓的静态分组指的是确定完分组后,如需变化必须手动添加或修改的分组。这类分组会占很大一部分。 而动态分组指的是可以通过对服务器资源的某种匹配而自动将其添加到某个分组中的功能,比如说某个机房新上线N台服务器,可以不需要手动,而自动的添加到某个组中。这种功能可以通过手动来实现,在技术和时间限制的情况下,可以暂时不考虑。 分组功能还有组优先级的概念,主要是结合变量管理、模板管理结合使用,这些在变量管理和模板管理里面再进行介绍。 5)变量管理: 变量管理主要是配合分组管理和模板管理使用,所谓的模板就是在不同的情况层显不同内容的文件,而如何呈现不同内容就是在模板中配置了相关的变量名称,而变量的具体赋值则需要在变量管理里面体现。 变量管理建议使用yml语法格式来编写,比如如下的格式: region: id: 7001 name: js mongodb: hosts: - 172.27.117.201 - 172.27.117.202 - 172.27.117.203 port: 27017[!--empirenews.page--] 编写完成后解析成格式化的数据,比如下面表格: key value region.id 7001 region.name js region.mongodb.hosts [‘172.27.117.201’,’172.27.117.202’,’172.27.117.203’] region.mongodb.port 27017 用户可以选择两种可视化方式,但使用的时候需要按照解析后格式化的方式来使用,比如用户在模板中需要使用某个region的mongodb的服务器列表,则需要这种方式来使用:region.mongodb.hosts , 如果需要进一步处理该数据,可以在模板文件中直接使用Python语法处理,这个在模板管理中再介绍。 之所以需要有变量管理,就是因为模板管理的存在,很多配置需要按照不同的环境生成,而这些环境就需要有变量管理这个功能来控制。 变量管理细分可以分为几个维度: ■全局变量 全局变量指的是那些在任何场景下都只有一个的变量,可能会改变,但全局只有这一个变量,它一变会影响到所有的使用它的模板。 ■组变量 组变量是指和分组管理结合后对某个分组设置的变量,组变量的使用场合比较多,而且不同的分组之间可能还有优先级的问题,因此需要在分组的时候设置组的优先级。 建议将组的优先级分为如下几类: ■全局组(级别最低) ■IDC组(级别次之) ■Set组(级别次之) ■自定义组(级别次之) ■主机变量 主机变量是主机级别的动态变量,具有较高的优先级,建议结合资源管理系统使用,可以给每一台物理主机(虚拟主机)都设置一组相应的动态变量,比如某个set的某些mongodb集群,需要区分主、从,设置的变量可以这个样子: 172.27.117.252 id=0 priority=2 arbiterOnly=False 172.27.117.248 id=1 priority=1 arbiterOnly=False 172.27.117.247 id=2 priority=0 arbiterOnly=True 在服务部署的时候可以根据相应的优先级决定生成的配置文件的不同,甚至执行脚本的不同。 ■任务变量 任务变量是具有最高优先级的变量,这个变量只有任务执行的时候,通过输入的参数来控制,该变量实际并不进行管理,使用用户在使用的时候输入而已,一次性的操作。 6) 模板管理 模板管理就是管理各种配置文件的管理系统。 配置文件之所以需要管理,是因为两个原因: 1、在不同的环境中配置文件的内容可能是不同的 2、配置文件中的某些内容可能是会被修改的 我们以下面的配置文件为例,分别说说这两种情况下使用模板管理的必要性: [common]region = {{ region.id }}set = 1instance = 1...[network]listen-ip = {{ inventory_hostname }}file_ulimit = {{ global.file_ulimit }} 上面配置文件中的 {{ region.id }}以及{{ inventory_hostname }}说的就是第一种情况, 而{{ global.file_path }}就是第二种情况。 第一种情况中,在不同的region之间,文件的格式不变,但region.id的值是有变化的;inventory_hostname这里表示的是某个服务器的ip地址,这个在服务器级别都是变化的。因此这类文件需要是需要进行模板管理的。 第二种情况中,所有的file_ulimit都是一样的,那我们为什么不写死在文件里而把它变成变量呢?是因为这个配置,虽然现在没有变化,但将来可能会发生变化,在变量管理中直接修改一下,那新的配置文件就都会按照这个生成了,比起去改一个文件内容还有可能产生格式错误的风险来说,这种方式是不是简单多了。 至于模板文件如何编写,这里将会使用python的最通用的模板引擎jinja2引擎,所有的语法都必须遵循jinja2的引擎即可,变量使用变量管理中定义的变量,对于每一台主机都是在使用的时候动态生成最新的临时文件,并通过文件分发的方式传输就可以了。 7) 软件管理 所谓的软件管理,也就是软件包的管理,软件包的管理有两种: 1、rpm或yum,npm,pip等安装的软件包,具有明确的包管理工具。 2、压缩包或目录格式的代码版本。 具有软件包管理工具的代码,比较容易进行管理,只要通过每台服务器自动的Agent定期执行list操作将所需要跟踪的软件包的版本进行跟踪,并汇报到中心管理数据库即可。 而压缩包或目录格式的代码版本则比较麻烦,需要对比MD5值,以及具有参照样本才可以管理。 这些所有的软件包都需要有一个最新可用的全局版本管理,用于进行版本对比操作,甚至可以直接点击升级。 总之,最终的软件管理的结果会呈现如下的形态,以某台服务器为例: 服务器ip: xxx.xxx.xxx.xxx| 软件包名称| 版本号 | 是否是最新可用版本| 点击升级| :—-|:—-|| nodejs| v0.1.1| 是|| libvirt| x.x.x| 是|| zookeeper| 3.3.5| 否| 升级 当然有了软件管理之后,当我们有某种类似如: 将某些服务器上面的某个软件包升级! 这样的问题的时候,无论是获取基准ip列表,还是后续的升级工作,都十分简单了。 当然版本升级工作会和作业管理相结合,每个版本升级都会是一个单独的作业,这样版本升级的进度,结果也都一目了然,而且还可以做到灰度。 8)服务管理 服务管理有点类似监控工具,它所层显的状态和版本管理类似,实现的方式也类似,都是通过Agent定时上报的机制获取最新的数据。 所谓的服务管理,就是讲每一台服务器上所运行这些进程进行管理,当然不是全部进程,而是我们所关注的服务进程,呈现的状态如: 以服务器:xxx.xx.xxx.xxx为例:| 进程id| 进程名称| 启动时间| 检查时间|运行时间 | 运行用户| 运行状态| 操作|:—-:| 1234| uhost-action| 2016-2-07 10:00:00| 2016-2-17 10:00:00 | 10day | root|运行中 | 重启/停止| 2345| uimage3-action| 2016-2-07 10:00:00 |2016-2-17 10:00:00| 8day | root|已停止 | 启动 上面是某台服务器上的服务管理的实时情况,每一个任务都可以有详细的跟踪记录,可以用于问题跟踪,服务报警,dashborad展现等等。 另外服务管理可以和作业管理相结合,实现服务的重启,停止,启动等功能。[!--empirenews.page--] 服务管理功能也是很有用的功能。 到此位置,整个配置管理工具的功能介绍也完成了,具体的实现方式可以有两种实现方式: 1、基于过程的实现方式(主动) 基于过程的实现方式,就是所说的的配置变化,通过中心触发的方式实现,服务器上所有的配置变化都是主动的而不是被动的,可以通过SSH的方式,也可以通过Agent的方式来实现。可以使用Ansible、fabirc的API或者salt的daemon,也可以自研daemon的方式实现。 2、基于结果的实现方式(被动) 基于结果的实现方式是指整个操作并不关心过程,也不是主动触发的,而是被动触发的,这种方式是基于Agent的实现方式。 运维人员对某台服务器的某个配置设置一个最终的状态,Agent获取这个最终状态后执行相应的操作,只要Agent满足条件需求,那么这台服务器最终所呈现的结果就是我们配置的结果,Puppet就是这种理念设计的,当然也可以自研。 总结: 整个运维管控系统还是比较大的系统,每一个子系统的功能的很复杂,而且还需要结合使用,整体的架构是分布式的,多种开源软件与自研系统结合的方式实现,大体功能和架构如上面所述,具体的实现上肯定会有很多细节需要攻克的。 PS: 这个功能和架构设计参考了腾讯的蓝鲸系统,并结合了Ansible、saltstack和puppet的理念,综合而成,而且其中的部分功能已经实现完成。 关于作者: 赵新宇,UCloud平台架构部,资深专家工程师,DevOps架构师。曾任新浪微博高级数据库工程师,唯品会资深数据库工程师。从事数据库、运维、自动化开发、中间层开发、系统架构设计等工作。

    时间:2017-10-24 关键词: 实现 存储技术 通用应用 运维管控

  • 基于VxWorks的视频采集系统的设计与实现

    基于VxWorks的视频采集系统的设计与实现

    1 引言 目前,视频采集系统的应用极为广泛,许多产品和设施,例如远程监控、可视电话、会议电视等等,都需要采集视频信息。而且,随着PC机的普及,人们可以直接利用PC机进行视频采集,采集到的视频数据经过处理后保存在本地或者发送到远方。由于视频的采集、处理和传输都在一台PC机上完成,因此可以大大降低系统的复杂度和价格。 我们设计的视频采集系统是基于Intel x86平台和实时操作系统VxWorks,由视频采集卡和驱动程序两部分组成,如图1所示。视频采集卡完成视频数据采集和格式转换,驱动程序在系统启动时对硬件进行初始化,在系统启动之后实现硬件和应用软件之间的数据交互。考虑到视频的数据量极大,视频采集卡通过PCI高速总线与计算机相连。   2 视频采集卡的设计 为了将由摄像头输入的模拟视频转换为计算机能够接受和处理的数字视频,需要经过模数转换、同步提取、亮色分离等多个步骤。而为了将数字视频传送到PC机的内存中,还需要一定数量的FIFO、总线接口和相应的控制逻辑。这原本是一个比较复杂的过程,但是随着半导体技术的发展,各半导体生产厂家通过不断创新和改进,目前已经能够在单个芯片上实现所有这些功能。Conexant公司的Bt848就是这样的一种芯片,图2给出了其功能框图。   对于在PCI总线上进行NTSC/PAL/SECAM视频捕获的应用来说,Bt848是一种完整的低价格解决方案。作为一种总线主控设备,Bt848不需要任何本地缓存来存储视频像素数据,这样就极大地降低了硬件价格。Bt848能够充分利用基于PCI总线的系统的高带宽和固有的多媒体功能,并且能够与其他多媒体设备实现互操作,这样就能够以模块的方式在系统中添加视频采集和叠加功能,而花费甚少。Bt848的使用与PCI系统总线的拓扑结构无关,可以用于各种系统总线的组织结构,既可以直接集成在主板上,也可以作成插卡插在PCI总线插槽内。 Bt848的主要特点是:与PCI 2.1规范全兼容,拥有辅助的GPIO数据端口和视频数据端口,支持的图像分辨率高达768×576,支持复杂的裁剪功能,零等待状态的PCI突发写操作,支持场/帧屏蔽以减少带宽,在输出方面支持多种YCbCr和RGB像素格式,支持NTSC/SECAM/PAL模拟输入,可以使用垂直/水平方面的插值滤波将图像尺寸缩小到图标大小,具有多个复合和S视频输入,支持奇偶场不同的目的地址,支持奇偶场不同的颜色空 间/缩放因子,支持225个颜色调色板的视频映射,具有用于图文电视的VBI视频捕获功能。这些特点使Bt848适用于PC电视、桌面可视电话、运动视频捕获、静止图像采集和VBI数据服务等应用领域。 Bt848高度集成的结构使其外围电路极其简单,也便于在同一块插卡上增加更多的功能,例如视频数据加密。视频采集卡的结构如图3所示。一块Bt848最多支持4路模拟视频输入,其中3路是复合视频信号,1路是S视频信号。4路视频输入在Bt848内部完成复用。Bt848通过内部的PCI接口直接与PCI总线相连。单片机通过FIFO与Bt848的GPIO端口相连,单片机软件与主机上的软件一起实现视频采集系统的加密。控制逻辑控制Bt848和FIFO的时序,同步PCI总线、Bt848与单片机的操作。   3 驱动程序的编写 应用程序必须通过驱动程序才能与硬件进行数据通信,而驱动程序的编写又是与操作系统密切相关的。本系统所使用的操作系统是实时操作系统VxWorks。 VxWorks是由WRS(Wind River Systems)公司开发的一套具有微内核高性能可伸缩的实时操作系统,支持广泛的网络通信协议,并能够根据用户的需求进行组合,其开放式的结构和对工业标准的支持使开发者只需做最少的工作即可设计有效的适合于不同用户要求的实时操作系统。VxWorks的特点主要有:微内核结构(最小结构《8KB),高效的任务管理,灵活的任务间通信,微秒级中断处理,符合POSIX 1003.1b实时扩展标准,满足TCP/IP网络标准,灵活的从ROM、磁盘或网络的引导能力,多处理器支持,快速、灵活的I/O系统,MS-DOS和RT-11文件系统,完全符合ANSI C标准,多于1100种功能例程。除了性能出众的操作系统之外,WRS公司还提供了优秀的实时操作系统开发工具Tornado。Tornado由三个高度集成的部分组成:Tornado工具,是一整套强有力的交叉开发工具;VxWorks运行时系统,是运行在目标机上的高性能、可裁剪的实时操作系统;连接目标机和宿主机的通信选项,如以太网、串行线路、在线仿真或ROM仿真等。Tornado能够支持几乎所有的工作平台和目标处理器,所提供的工具可用于所有目标机,并具有两种调试模式(系统和任务模式)。除了基本的功能和开发工具,Tornado还具有先进的系列网络产品,极大地扩展了Tornado的网络特性并增强了嵌入式微处理器的网络特性。 VxWorks的所有机制和功能都是基于“C子程序”这种简单机构,即:VxWorks的所有功能都是由C程序库提供的,任何C程序都能够从Tornado的命令和调试环境中交互式地调用,任何C程序都能够作为VxWorks的一个任务从Tornado主机工具或者应用程序中产生,C程序能够与中断、看门狗定时器或辅助定时器相连。VxWorks的这种统一性使Tornado成为一种有效的开发系统,因为用户不必再编写特殊的代码来与系统陷阱接口,也不需要进行特殊的处理来建立一个任务,更不需要编写特殊的用户接口程序或交互式的测试程序来测试新代码,用户只要编写子程序就能够完成所有这些工作。 VxWorks的这些特性为编写应用程序和设备驱动程序提供了极大的便利。在VxWorks下,设备驱动程序既可以嵌入内核随系统一起启动,也可以作为可加载模块在系统启动之后运行。前一种方式需要修改并重新编译内核,这需要熟悉内核的结构,实现起来比较困难。而后一种方式则比较简单,与编写一般的应用程序类似。但是,无论采用哪种方式编写驱动程序,其基本结构是相同的,如图4所示。[!--empirenews.page--]   PCI总线是一种即插即用的总线,在BIOS和操作系统的支持下,能够自动地为设备分配合适的内存映射地址、I/O端口和系统中断控制器的输入(IRQ)。Bt848支持两类地址空间:配置地址空间和内存地址空间。配置地址空间包括预定义的PCI配置寄存器,而内存地址空间包括Bt848使用的所有局部寄存器。初始化PCI总线就是设置PCI配置空间所定义的寄存器,实现主机与PCI局部总线之间的接口,其过程是:首先在系统中根据设备标识(Bt848)和供应商标识(Brooktree)找到设备的位置,确定其总线号、设备号和功能号;然后根据总线号、设备号和功能号确定设备的基地址和IRQ,这个基地址就是Bt848局部寄存器的起始地址,而IRQ在连接中断服务程序时使用;接着将设备的局部寄存器映射到系统内存中,供以后设置局部寄存器使用;最后设置命令寄存器以控制Bt848产生和响应PCI周期的能力,例如使系统能够响应对内存空间的访问,使Bt848成为总线操作发起的一方,使系统报告校验错等等。 Bt848的中断屏蔽寄存器INT_MASK中的设置决定了系统能够响应哪些中断,中断服务程序为不同的中断源提供相应的处理代码。中断服务程序的编写必须遵循一定的规则,最主要的一点就是不能造成系统阻塞而影响系统性能。中断服务程序应该尽量简洁短小,使其能够尽可能快速地返回。在中断服务程序中不能有运行时间过长的代码,也不能出现对某些共享资源进行某种访问(例如试图获取信号量)的代码。编写完中断服务程序之后,利用初始化PCI总线时获得的IRQ和操作系统提供的函数将中断服务程序与中断矢量连接起来。 Bt848的局部寄存器驻留在4KB的内存寻址空间中,必须通过PCI总线才能访问。通过设置相应的寄存器,就能够控制Bt848的行为。通常,需要设置的内容包括:输入电视信号制式(PAL或NTSC),输入信号源(MUX0、MUX1或MUX2),行同步,场同步,输出格式(CCIR 601、CIF或QCIF),图像放大或缩小参数,图像滤波参数,亮度、色度和对比度调节等等。 t848中集成的DMA控制器非常独特,它实际上是一个小RISC处理器,其运行的指令(即RISC程序)位于主机内存中并由Bt848的设备驱动程序提供。由于这种结构能够将采集到的视频数据传输到内存中,从而大大地方便了视频采集系统的实现。在这种结构中,DMA能够动态地逐行改变目标内存地址,这就使用户能够将每一帧视频数据分成不同的部分放在多个内存区域中。RISC程序的起始地址放在Bt848的RISC程序起始地址寄存器RISC_STRT_ADD中。Bt848提供的RISC指令包括:写入WRITE、略过SKIP、同步SYNC和跳转JUMP,利用这些指令就能够控制数据流,得到所需要的数据。RISC程序的基本流程是:帧同步→写入奇场→偶场同步→写入偶场→奇场同步→跳转至写入奇场。 系统启动是通过设置GPIO和DMA控制寄存器中的RISC使能位和FIFO使能位来实现。将RISC使能位置为1使DMA控制器能够处理RISC指令,将FIFO使能位置为1使数据FIFO有效。在将这两位置为1后,视频采集开始进行。 在整个系统中,由于视频采集的速度通常高于应用软件取得数据并处理的速度,为了保证视频数据的连续性,采用了三缓存结构。缓存A是Bt848视频采集的目标地址,在RISC指令的直接控制下,采集的数据都先存放在这个缓存中。缓存B和C组成“乒乓”式结构,循环往复使用:当某一帧数据采集完毕后产生中断,在中断服务程序中将缓存A的数据复制到缓存B(或C)中,然后采集下一帧;当下一帧数据采集完后,再将缓存A中的数据复制到缓存C(或B)中。当应用程序需要数据时,就从缓存B或C中读取最新的一帧图像。缓存B和C交替使用,能够保证应用程序从缓存读数据的操作和驱动程序向缓存写数据的操作不会发生冲突,避免了数据的损坏和迟延。 4 结论 利用Bt848,在Intel x86平台和实时操作系统VxWorks上实现了视频采集系统。由于Bt848的高度集成特性,其外围电路极其简单,设计硬件电路时极其方便,同时性能也能够得到保证,而且可以灵活地增加其他功能。而VxWorks优异的性能和方便的接口也便于编写设备驱动程序和应用软件,其性能完全能够满足要求。目前,所实现的视频采集系统已经在视频监控和可视电话中获得应用。

    时间:2017-09-24 关键词: VxWorks 视频采集 实现

  • Windows CE下串行通信的实现

    摘要:Windows CE是微软公司推出的一种嵌入式的操作系统、用于系统资源有限的小型设备。它采用模块化的结构,支持多种外部接口,包括最常用的RS232串行接口。本文就Windows CE系统串行接口的编程进行讨论,并给出与GPS设备的接口程序。 关键词:Windows CE 串行通信 GPS 1 Windows CE简介 Windows CE是一种小型的、基于ROM的、具有Win32子集API的操作系统。它的优势在于小尺寸、Win32 API子集和对多平台的支持能力。在Windows CE下编程需要注意的是,Windows CE设备的资源很少,存储器、显示器都很小,接口也比较少,而且根据实际情况变化很大。另外,Windows CE只支持Unicode,这在编程中要格外注意。在Windows CE中,除了一些基本的Windows通用控件以外,还有一些专门设计的控件,比如CommandBar。Windows CE体积虽小,但是它的功能并不少,内存管理、文件操作、多线程、网络功能等等它都支持,可以说是麻雀虽小,五脏俱全。 2 Windows CE下的串行通信 串行端口在Windows CE下属于流接口设备,它是串行设备接口的常规I/O驱动程序调用和与通信相关的具体函数的结合。串行设备被视为用于打开、关闭、读写串行端口的常规、可安装的流设备。Windows CE的通信函数和其它大多数Windows的通信函数相同。特别要注意的是,Windows CE不支持直接对串行端口的寄存器进行编程。常用的串行端口函数介绍如下: (1)打开和关闭串行端口 CreateFile函数用于打开串行口。 hPort=CreateFile(TEXT(“COM1:”),GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL)。注意COM1后要有一个冒号。最后一个参数dwFlagsAndAttributes必须为0,因为Windows CE只支持非重叠I/O。第3个参数dwShareMode也必须为0,通信端口不能像文件一样被共享。这个函数的返回值是已打开的串行端口的句柄或者是INVALID_HANDLE_VALUE。 关闭串行口可以调用CloseHandle(hPort)。 (2)配置串行端口 配置串行口主要是用DCB结构配置端口设置,包括波特率、停止位、数据位长度、校验位、流量控制等等,还有配置超时值。 首先打开串行端口,用GetCommState函数获得当前打开串口配置,然后根据需要修改DCB成员,最后用SetCommState函数设置新的串口配置。 DCB PortDCB; //创建DCB变量 Port.DCB.DCBlength=sizeof(DCB); GetCommState(hPort,%26;amp;PortDCB); //获取当前串口配置修改DCB成员 PortDCB.BaudRate=9600; //波特率 PortDCB.Parity=NOPARITY; //校验位 PortDCB.StopBits=ONESTOPBIT; //停止位 PortDCB.ByteSize=8; . . . SetCommState(hPort,%26;amp;PortDCB); //设置新的串口配置 对串行端口来说,必须配置超时值,否则程序可能陷入到一个循环来等待来自串口的字符。这对采用Windows CE的设备来说,将大大减少设备电池的使用时间,所以超时值是需要配置的。另外一种解决办法就是采用多线程。多线程将在下一部分讲述。 通常,配置超时值和配置串口类似。首先用GetCommTimeouts函数获得当前串口的超时值。然后可以修改COMMTIMEOUT成员,最后用SetCommTimeouts函数设定超时值。 COMMTIMEOUTS CommTimeouts; //定义COMMTIMEOUTS结构 GetCommTimeouts(hPort,%26;amp;CommTimeouts); //获得当前的超时值 //修改COMMTIMEOUT成员 CommTimeouts.ReadIntervalTimeout=MAXDWORD; CommTimeouts.ReadTotalTimeoutMultiplier=0; CommTimeouts.ReadTotalTimeoutConstant=0; CommTimeouts.WriteTotalTimeoutConstant=1000; CommTimeouts.WriteTotalTimeoutMultiplier=10; SetCommTimeouts(hPort,%26;amp;CommTimeouts); //设定超时值 (3)读写串行端口 用ReadFile和WriteFile函数读写串行口。 int rc; DWORD cBytes; BYTE ch; Rc=ReadFile(hPort,%26;amp;ch,1,%26;amp;cBytes,NULL); 其中第一个参数是串口句柄,第2个参数是读回的字符,第3个参数是要读取的字符数量,第4个参数返回实际读取到的字符数量。 Int rc; DWORD cBytes; BYTE ch=TEXT(“a”); Rc=WriteFile(hPort,%26;amp;ch,1,%26;amp;cBytes,NULL); 其中第一个参数是串口句柄,第2个参数是要写入的字符,第3个参数是要写入的字符数量,第4个参数返回字符写入的字符数量。 需要注意的是Windows CE不支持重叠I/O,所以如果在主线程进行大量读写串口操作时,有可能使整个程序陷入缓慢的串口等待中去,因此一般都采用多线程来进行读写串口操作。 (4)通信事件 在Windows CE编程中,除了可以采用单独的线程来处理读写串口操作外,还可以采用利用通信事件的方法。通信事件就是当发生重要事件时,Windows CE向应用程序发送的通知。利用WaitCommEvent函数阻塞线程,直到特定的事件发生。一般的使用方法是:先用SetCommEvent函数指定要查找的一个或多个事件,然后,调用WaitCommEvent函数,并指定导致这个函数返回的事件。当WaitCommEvent函数返回后,循环调用ReadFile函数,读回所有接收到的字符。最后再次调用SetCommEvent函数,指定下次要查找的事件。 3 Windows CE下的多线程 Windows CE是一个完全的多任务、多线程的操作系统。Windows CE同时最多可以运行32个进程。每个进程有一个主线程,而且可以有多个附加线程。附加线程的多少仅受可用内存和线程堆栈的进程地址空间的限制。 Windows CE是以抢先方式调度线程的。线程以时间片为单位来运行,通常是25ms。线程拥有优先级,所有高优先级的线程都将在低优先级的线程之前运行。在可以调度被设定为特定优先级的线程之前,所有拥有高优先级的线程都必须被阻塞。同等优先级的线程以循环方式来调度。如果高优先级的线程停止阻塞,而低优先级的线程目前正在运行,则低优先级的线程会立刻被挂起,同时去调度高优先级的线程。低优先级的线程永远不会抢占高优先级的线程,当然也有例外:一种是线程具有优先级THREAD_PRIORITY_TIME_CRITICAL,它永远不会被抢占;另一种就是低优先级的线程拥有高优先级的线程正在等待的资源,出现优先级倒置。在Windows CE中,线程可以有8种优先级。 下面是一个创建线程和线程函数的例子: HANDLE hThread; DWORD dwThreadID=0; Int nParameter=5; HThread=CreateThread(NULL,0,Thread,nParameter,0,%26;amp;dwThreadID); //创建线程 CloseHandle(hThread); //关闭线程 //线程函数 DWORD WINAPI Thread (PVOID pArg) { int nParam=(int)pArg; . . . return 0x15; } CreateThread函数在许多参数在Windows CE下都不支持,所以被设为NULL或0。第3个参数指向线程函数的开始,第4个参数是CreateThread函数传到线程函数的唯一参数。CreateThread函数返回线程句柄,当这个句柄不需要时,调用CloseHandle函数关闭它。线程函数在被终止之前一直运行,调用ExitThread函数可终止线程的执行。 对于在系统中运行的多个线程,需要协调它们的活动,也就是实现同步。在Windows CE中,采用的方法是使用同步对象。一个线程等待一个同步对象,当用信号通知该对象时,解除阻塞正在等待的线程并调度该线程。同步对象包括事件和互斥体。在这里我们只介绍事件。 事件对象就是一种有两种状态——有信号和元信号的同步对象。事件被创建后自动被置为信号状态。事件可以被命名,从而被不同进程共享。采用下面的函数创建事件: HANDLE CreateEvent(LPSECURITY_ATTRIBUTES lpEventAttributes,BOOL bManualReset,BOOL bInitialState,LPTSTR lpName); 函数的第1个参数应为0,第2个参数表示事件成为有信号后应该人工重置或自动重置为无信号状态,第3个参数表示创建时事件是有信号还是无信号状态,最后一个参数指向事件名。被命名的事件可以被进程共享,否则就设为NULL。创建事件后,就可以采用SetEvent函数或者是PulseEvent函数用信号通知该事件。 SetEvent函数是自动重置事件,只释放一个线程来运行;PulseEvent函数是人工重置事件,释放所有等待那个事件的线程。最后可以用CloseHandle函数破坏事件对象。 事件的用法通常是,线程使用了下列函数中的一个来等待事件:WaitForSingleObject、WaitForMultipleObjects、MsgWaitForMultipleObjects或MsgWaitForMultipleObjectsEx。当线程被这些函数的其中一个阻塞时,线程只消耗少量的电能和CPU处理能力。需要注意的是:应用程序的主线程不能被WaitForSingleObject或WaitForMultipleObjects阻塞,否则主线程无法处理消息循环。通常的做法是采用多线程,主线程处理消息循环,附加线程处理需要在事件上阻塞的共享资源。 4 实际应用 在车载定位系统中,导般计算机需要接受多种传感器的数据输入,其中最常用到的就是GPS数据。通常GPS接收机的通信方式是串行RS232接口,所以导航程序的GPS模块的功能就是接收从串口收到的数据,然后进行处理。 程序采用多线程,主线程负责消息处理,另外还有读写两个附加线程,使用一个事件触发。读线程负责从串口读回GPS数据,写线程由事件触发。在网络补充版(http://www.dpj.com.cn)中给出GPS数据接收程序的代码。 在程序初始化时创建事件,创建写线程并把它阻塞。写线程等待事件触发。按下“打开串口”按钮后打开串口,创建读线程,读回GPS数据,进行处理;按下“发送”按钮后设置事件状态,解除阻塞写线程,发送数据。[!--empirenews.page--]

    时间:2017-05-24 关键词: Windows 串行通信 实现 驱动开发

  • 在VxWorks下实现NAT/NAPT的方法

    在VxWorks下实现NAT/NAPT的方法

    摘要:介绍NAT、NAPT的基本概念和工作原理;结合VxWorks的网络协议栈,描述一种利用VxWorks操作系统提供的钩子函数来开发实现NAT和NAPT的方法。 关键词:NAT NAPT 钩子函数 网络协议栈 截获 转换 校验和 引言 近年来,随着Internet的迅猛发展,连入Internet的主机数量成倍增长。由于最初设计Internet的时候并没有考虑到需要支持这么大的规模,因而Internet使用的Ipv4协议中IP地址的长度选择了32位,它可以使IP包的格式很好地对齐;但是,目前IP地址的短缺已经成为Internet面临的最大问题之一。 为了解决IP地址短缺的问题,人们提出了许多解决方案,nternet能够支持到新一代IP协议Ipv6的出台。在众多的解决方案中,网络地址转换NAT(Network Address Translation)技术提供了一种完全将私有网和公共网隔离的方法,从而得到了广泛的应用。 图1 NAT工作原理示意图 1 NAT技术 NAT技术的基本功能就是,用1个或几个IP地址来实现1个私有网中的所有主机和公共网中主机的IP通信。NAT技术可为TCP、UDP以及ICMP数据包提供透明转发。 1.1 NAT工作原理 NAT的基本工作原理是,当私有网主机和公共网主机通信的IP包经过NAT网关时,将IP包中的源IP或目的IP在私有IP和NAT的公共IP之间进行转换。 如图1所示,NAT网关有2个网络端口,其中公共网络端口的IP地址是统一分配的公共IP,为202.204.65.2;私有网络端口的IP地址是保留地址,为192.168.1.1。私有网中的主机192.168.1.2向公共网中的主机166.111.80.200发送了1个IP包(Des=166.111.80.200,Src=192.168.1.2)。当IP包经过NAT网关时,NAT会将IP包的源IP转换为NAT的公共IP并转发到公共网,此时IP包(Des=166.111.80.200,Src=202.204.65.2)中已经不含任何私有网IP的信息。由于IP包的源IP已经被转换成NAT的公共IP,响应的IP包(Des=202.204.65.2,Src=166.111.80.200)将被发送到NAT。这时,NAT会将IP包的目的IP转换成私有网中主机的IP,然后将IP包(Des=192.168.1.2,Src=166.111.80.200)转发到私有网。对于通信双方而言,这种地址的转换过程是完全透明的。 1.2 NAPT技术 由于NAT实现是私有IP和NAT的公共IP之间的转换,那么,私有网中同时与公共网进行通信的主机数量就受到NAT的公共IP地址数量的限制。为了克服这种限制,NAT被进一步扩展到在进行IP地址转换的同时进行Port的转换,这就是网络地址端口转换NAPT(Network Address Port Translation)技术。 NAPT与NAT的区别在于,NAPT不仅转换IP包中的IP地址,还对IP包中TCP和UDP的Port进行转换。这使得多台私有网主机利用1个NAT公共IP就可以同时和公共网进行通信。 如图2所示,私有网主机192.168.1.2要访问公共网中的Http服务器166.111.80.200。首先,要建立TCP连接,假设分配的TCP Port是1010,发送了1个IP包(Des=166.111.80.200:80,Src=192.168.1.2:1010),当IP包经过NAT网关时,NAT会将IP包的源IP转换为NAT的公共IP,同时将源Port转换为NAT动态分配的1个Port。然后,转发到公共网,此时IP包(Des=166.111.80.200:80,Src=202.204.65.2:2010)已经不含任何私有网IP和Port的信息。由于IP包的源IP和Port已经被转换成NAT的公共IP和Port,响应的IP包(Des=202.204.65.2:,Src=2010166.111.80.200:80)将被发送到NAT。这时NAT会将IP包的目的IP转换成私有网主机的IP,同时将目的Port转换为私有网主机的Port,然后将IP包(Des=192.168.1.2:1010,Src=166.111.80.200:80)转发到私网。对于通信双方而言,这种IP地址和Port的转换是完全透明的。 2 VxWorks的网络协议栈 与VxWorks操作系统捆绑发行的标准网络协议栈,是一个与BSD4.4兼容、功能齐全并针对嵌入式应用作了大量优化的TCP/IP协议栈。该网络协议栈与VxWorks操作系统、开发工具、设备管理工具以及上层协议和应用可以集成在一起,有完整的路由功能并可以根据需要进行剪裁。VxWorks的网络协议栈的分层结构如图3所示。 VxWorks网络协议栈传输数据使用的内存,是在系统启动进行网络协议初始化的时候就申请下来的,并使用系统提供的netBufLib建立内存字点池来管理这些内存空间。网络协议栈传输数据所需的内存都是从这些内存节点池中申请,使用完毕后再释放。 NetBufLib通过3种数据结构处理网络协议栈传输的数据:mBlk、clBlk和Cluster。其中,Cluster保存的是实际的数据,mBlk和clBlk中保存的信息是用来管理Cluster中保存的数据的。为了满足传输不同大小数据的需要,Cluster是一些大小不同的内存块;缺省情况下,VxWorks网络协议栈创建了大小从64~2048字节的6个不同的内存节点池。 由于mBlk中保存的只是指向数据的指针,因此,网络协议栈不同层之间的数据传输可以避免数据拷贝。此外,对于分布在多个Cluster中的数据,可以通过mBlk把它们链在一起,并且只需要传递链首的mBlk就可以了。VxWorks网络协议栈的“零拷贝”技术就是建立在这种机制的基础之上的。图4描述了2个提交给网络协议栈TCP层的包的数据结构。 在mBlk结构中,有2个指向其它mBlk的指针:1个指向同一个包的下一个mBlk;另一个指向下一个包的链首的mBlk。ClBlk指向的就是实际存储数据的Cluster。 3 向VxWorks网络协议栈加入NAT 为了向VxWorks网络协议栈中加入NAT,必须实现2个基本操作:IP包的截获得IP包的处理。 3.1 VxWorks下IP包的截获 VxWorks网络协议栈在物理驱动层和IP层上分别提供了两类钩子函数:EtherHook和IpFilterHook。利用这两类钩子函数,可以实现对IP包的截获。 (1)EtherHook EtherHook提供对以太帧的截获功能。它包括2个钩子函数:以太帧接收钩子函数EtherInputHook和以太帧发送钩子函数EtherOutPutHook。它们分别用函数EtherInputHookAdd和EtherOutputHookAdd安装。安装了这些钩子函数后,每当有以太帧被接收到时,函数EtherInputHook就会在该以太帧被提交给上层处理前被自动调用;每当有以太帧被发送时,函数EtherOutputHook会在该以太帧被发送前被自动调用。通过截获以太帖,可以达到截获IP包的目的。 (2)IpFilterHook IpFilterHook提供对IP包的截获功能。它只对应1个钩子函数,用函数ipFilterHookAdd就可以完成IpFilterHook的安装。安装了IpFilterHook后,每当有IP包被接收到时,函数IpFilterHook就会被自动调用,从而实现对IP包的截获。 3.2 NAT过程中IP包的处理 利用钩子函数完成IP包的截获后,就可以根据需要对IP包进行处理。首先,可以从IP包中剥离出IP头,根据IP头中的“协议”域可以判断出是UDP包还是TCP包。然后,从IP包中剥离出UDP头或TCP头,利用IP头和UDP头或者TCP头中的相关信息,就可以根据需要进行IP地址和Port的转换处理。 NAT一般采用1个映射表来实现IP地址和Port的转换。对于截获到的IP包,通过比较IP包的目的IP、目的Port、源IP、源Port和NAT映射表中的相应表现,对IP包的目的IP、目的Port、源IP、源Port进行转换。 典型的NAT映射表如图5所示。 (1)处理由内到外的IP包 由内到外的IP包指的是私有网主机通过NAT发送到公共网主机的IP包。它的源IP是私有IP,目的IP是公共IP。 当截获到1个由内到外的IP包时,NAT首先以IP包的源IP和源Port作为Real Src IP和Real Src Port的匹配条件,在映射表中进行搜索。如果找到1个对应的表项,就用表项的NAT IP和NAT Port替换IP包的源IP和源Port,而保持IP包的目的IP和目的Port不变。然后,重新计算TCP或UDP的校验和,就可把IP包归还给VxWorks网络协议栈。 如果在映射表中没有搜索到对应的表项,NAT就会向映射表中添加1个新的表现。该表项中的Real Src IP和Real Src Port用IP包的源IP和源Port来填充;NAT Port用NAT分配的1个空闲Port填充。然后,根据新增加的表项,按照上面相同的步骤完成对IP包的处理。后续相同的IP包也都用这个表项来处理。 (2)处理由外到内的IP包 由外到内的IP包指的是从公共网通过NAT发送到私有用的IP包。它的源IP是公共IP,目的IP是NAT的公共IP。 当截获到1个由外到内的IP包时,NAT就以IP包的目的IP和目的Port作为NAT IP和NAT Port的匹配条件,在映射表中进行搜索。如果找到1个对应的表项,就用表项的Real Src IP和Real Src Port来替换IP包的目的IP和目的Port,而保持IP包的源IP和源Port不变。然后,重新计算TCP或UDP的校验和,就可把IP包归还给VxWorks网络协议栈。[!--empirenews.page--] 如果在映射表中没有搜索到对应的表项,则对IP包不作任何处理,直接归还给VxWorks网络协议栈。 (3)NAT映射表的配置 作为NAT完成IP包中IP和Port转换的依据,NAT映射表的管理关系到NAT的功能和性能。NAT映射表的配置可以分为2部分:静态配置部分和动态配置部分。 静态配置部分主要用于NAT IP、NAT Port和私有IP、私有Port的映射关系可以预见的应用,例如UDP通信和TCP Server运行在私网中某个主机等情况。NAT映射表静态配置部分可以在NAT运行前根据规划直接完成配置。 动态配置部分主要用于NAT IP、NAT Port和私有IP、私有Port的映射关系不可预见的应用,例如在私有网中某个主机上运行TCP Client来与公共网中某个主机上的TCP Server建立连接进行通信。因这种情况下,私有网主机使用的Port是动态分配的。为了实现需要NAT IP、NAT Port和私有IP、私有Port的转换,必须动态配置NAT映射表。相对于静态配置部分而言,动态配置部分的数据结构、数据组织和搜索算法的设计和实现的难度要大得多,关键是要实现一个高效的搜索算法。

    时间:2017-05-23 关键词: 方法 VxWorks 实现 驱动开发

  • 在VxWorks下实现NAT/NAPT的方法

    摘要:介绍NAT、NAPT的基本概念和工作原理;结合VxWorks的网络协议栈,描述一种利用VxWorks操作系统提供的钩子函数来开发实现NAT和NAPT的方法。 关键词:NAT NAPT 钩子函数 网络协议栈 截获 转换 校验和 引言 近年来,随着Internet的迅猛发展,连入Internet的主机数量成倍增长。由于最初设计Internet的时候并没有考虑到需要支持这么大的规模,因而Internet使用的Ipv4协议中IP地址的长度选择了32位,它可以使IP包的格式很好地对齐;但是,目前IP地址的短缺已经成为 Internet面临的最大问题之一。 为了解决IP地址短缺的问题,人们提出了许多解决方案,nternet能够支持到新一代IP协议Ipv6的出台。在众多的解决方案中,网络地址转换 NAT(Network Address Translation)技术提供了一种完全将私有网和公共网隔离的方法,从而得到了广泛的应用。 图1 NAT工作原理示意图 1 NAT技术 NAT技术的基本功能就是,用1个或几个IP地址来实现1个私有网中的所有主机和公共网中主机的IP通信。NAT技术可为TCP、UDP以及ICMP数据包提供透明转发。 1.1 NAT工作原理 NAT的基本工作原理是,当私有网主机和公共网主机通信的IP包经过NAT网关时,将IP包中的源IP或目的IP在私有IP和NAT的公共IP之间进行转换。 如图1所示,NAT网关有2个网络端口,其中公共网络端口的IP地址是统一分配的公共IP,为202.204.65.2;私有网络端口的IP地址是保留地址,为192.168.1.1。私有网中的主机192.168.1.2向公共网中的主机166.111.80.200发送了1个IP包(Des=166.111.80.200,Src=192.168.1.2)。当IP包经过NAT网关时,NAT会将IP包的源IP转换为NAT的公共 IP并转发到公共网,此时IP包(Des=166.111.80.200,Src=202.204.65.2)中已经不含任何私有网IP的信息。由于IP 包的源IP已经被转换成NAT的公共IP,响应的IP包(Des=202.204.65.2,Src=166.111.80.200)将被发送到NAT。这时,NAT会将IP包的目的IP转换成私有网中主机的IP,然后将IP包(Des=192.168.1.2,Src=166.111.80.200)转发到私有网。对于通信双方而言,这种地址的转换过程是完全透明的。 1.2 NAPT技术 由于NAT实现是私有IP和NAT的公共IP之间的转换,那么,私有网中同时与公共网进行通信的主机数量就受到NAT的公共IP地址数量的限制。为了克服这种限制,NAT被进一步扩展到在进行IP地址转换的同时进行Port的转换,这就是网络地址端口转换NAPT(Network Address Port Translation)技术。 NAPT与NAT的区别在于,NAPT不仅转换IP包中的IP地址,还对IP包中TCP和UDP的Port进行转换。这使得多台私有网主机利用1个NAT 公共IP就可以同时和公共网进行通信。 如图2所示,私有网主机192.168.1.2要访问公共网中的Http服务器166.111.80.200。首先,要建立TCP连接,假设分配的TCP Port是1010,发送了1个IP包(Des=166.111.80.200:80,Src=192.168.1.2:1010),当IP包经过NAT 网关时,NAT会将IP包的源IP转换为NAT的公共IP,同时将源Port转换为NAT动态分配的1个Port。然后,转发到公共网,此时IP包(Des=166.111.80.200:80,Src=202.204.65.2:2010)已经不含任何私有网IP和Port的信息。由于IP包的源 IP和Port已经被转换成NAT的公共IP和Port,响应的IP包(Des=202.204.65.2:,Src=2010166.111.80.200:80)将被发送到NAT。这时NAT会将IP包的目的IP转换成私有网主机的IP,同时将目的Port转换为私有网主机的Port,然后将IP包(Des=192.168.1.2:1010,Src=166.111.80.200:80)转发到私网。对于通信双方而言,这种IP地址和Port的转换是完全透明的。 2 VxWorks的网络协议栈 与VxWorks操作系统捆绑发行的标准网络协议栈,是一个与BSD4.4兼容、功能齐全并针对嵌入式应用作了大量优化的TCP/IP协议栈。该网络协议栈与VxWorks操作系统、开发工具、设备管理工具以及上层协议和应用可以集成在一起,有完整的路由功能并可以根据需要进行剪裁。VxWorks的网络协议栈的分层结构如图3所示。 VxWorks网络协议栈传输数据使用的内存,是在系统启动进行网络协议初始化的时候就申请下来的,并使用系统提供的netBufLib建立内存字点池来管理这些内存空间。网络协议栈传输数据所需的内存都是从这些内存节点池中申请,使用完毕后再释放。 NetBufLib通过3种数据结构处理网络协议栈传输的数据:mBlk、clBlk和Cluster。其中,Cluster保存的是实际的数据,mBlk和clBlk中保存的信息是用来管理Cluster中保存的数据的。为了满足传输不同大小数据的需要,Cluster是一些大小不同的内存块;缺省情况下,VxWorks网络协议栈创建了大小从64~2048字节的6个不同的内存节点池。 由于mBlk中保存的只是指向数据的指针,因此,网络协议栈不同层之间的数据传输可以避免数据拷贝。此外,对于分布在多个Cluster中的数据,可以通过mBlk把它们链在一起,并且只需要传递链首的mBlk就可以了。VxWorks网络协议栈的“零拷贝”技术就是建立在这种机制的基础之上的。图4描述了2个提交给网络协议栈TCP层的包的数据结构。 在mBlk结构中,有2个指向其它mBlk的指针:1个指向同一个包的下一个mBlk;另一个指向下一个包的链首的mBlk。ClBlk指向的就是实际存储数据的Cluster。 3 向VxWorks网络协议栈加入NAT 为了向VxWorks网络协议栈中加入NAT,必须实现2个基本操作:IP包的截获得IP包的处理。 3.1 VxWorks下IP包的截获 VxWorks网络协议栈在物理驱动层和IP层上分别提供了两类钩子函数:EtherHook和IpFilterHook。利用这两类钩子函数,可以实现对IP包的截获。 (1)EtherHook EtherHook提供对以太帧的截获功能。它包括2个钩子函数:以太帧接收钩子函数EtherInputHook和以太帧发送钩子函数 EtherOutPutHook。它们分别用函数EtherInputHookAdd和EtherOutputHookAdd安装。安装了这些钩子函数后,每当有以太帧被接收到时,函数EtherInputHook就会在该以太帧被提交给上层处理前被自动调用;每当有以太帧被发送时,函数 EtherOutputHook会在该以太帧被发送前被自动调用。通过截获以太帖,可以达到截获IP包的目的。 (2)IpFilterHook IpFilterHook提供对IP包的截获功能。它只对应1个钩子函数,用函数ipFilterHookAdd就可以完成IpFilterHook的安装。安装了IpFilterHook后,每当有IP包被接收到时,函数IpFilterHook就会被自动调用,从而实现对IP包的截获。 3.2 NAT过程中IP包的处理 利用钩子函数完成IP包的截获后,就可以根据需要对IP包进行处理。首先,可以从IP包中剥离出IP头,根据IP头中的“协议”域可以判断出是UDP包还是TCP包。然后,从IP包中剥离出UDP头或TCP头,利用IP头和UDP头或者TCP头中的相关信息,就可以根据需要进行IP地址和Port的转换处理。 NAT一般采用1个映射表来实现IP地址和Port的转换。对于截获到的IP包,通过比较IP包的目的IP、目的Port、源IP、源Port和NAT映射表中的相应表现,对IP包的目的IP、目的Port、源IP、源Port进行转换。 典型的NAT映射表如图5所示。 (1)处理由内到外的IP包 由内到外的IP包指的是私有网主机通过NAT发送到公共网主机的IP包。它的源IP是私有IP,目的IP是公共IP。 当截获到1个由内到外的IP包时,NAT首先以IP包的源IP和源Port作为Real Src IP和Real Src Port的匹配条件,在映射表中进行搜索。如果找到1个对应的表项,就用表项的NAT IP和NAT Port替换IP包的源IP和源Port,而保持IP包的目的IP和目的Port不变。然后,重新计算TCP或UDP的校验和,就可把IP包归还给 VxWorks网络协议栈。 如果在映射表中没有搜索到对应的表项,NAT就会向映射表中添加1个新的表现。该表项中的Real Src IP和Real Src Port用IP包的源IP和源Port来填充;NAT Port用NAT分配的1个空闲Port填充。然后,根据新增加的表项,按照上面相同的步骤完成对IP包的处理。后续相同的IP包也都用这个表项来处理。 (2)处理由外到内的IP包 由外到内的IP包指的是从公共网通过NAT发送到私有用的IP包。它的源IP是公共IP,目的IP是NAT的公共IP。 当截获到1个由外到内的IP包时,NAT就以IP包的目的IP和目的Port作为NAT IP和NAT Port的匹配条件,在映射表中进行搜索。如果找到1个对应的表项,就用表项的Real Src IP和Real Src Port来替换IP包的目的IP和目的Port,而保持IP包的源IP和源Port不变。然后,重新计算TCP或UDP的校验和,就可把IP包归还给 VxWorks网络协议栈。[!--empirenews.page--] 如果在映射表中没有搜索到对应的表项,则对IP包不作任何处理,直接归还给VxWorks网络协议栈。 (3)NAT映射表的配置 作为NAT完成IP包中IP和Port转换的依据,NAT映射表的管理关系到NAT的功能和性能。NAT映射表的配置可以分为2部分:静态配置部分和动态配置部分。 静态配置部分主要用于NAT IP、NAT Port和私有IP、私有Port的映射关系可以预见的应用,例如UDP通信和TCP Server运行在私网中某个主机等情况。NAT映射表静态配置部分可以在NAT运行前根据规划直接完成配置。 动态配置部分主要用于NAT IP、NAT Port和私有IP、私有Port的映射关系不可预见的应用,例如在私有网中某个主机上运行TCP Client来与公共网中某个主机上的TCP Server建立连接进行通信。因这种情况下,私有网主机使用的Port是动态分配的。为了实现需要NAT IP、NAT Port和私有IP、私有Port的转换,必须动态配置NAT映射表。相对于静态配置部分而言,动态配置部分的数据结构、数据组织和搜索算法的设计和实现的难度要大得多,关键是要实现一个高效的搜索算法。

    时间:2015-12-14 关键词: 方法 VxWorks 实现 驱动开发

  • 触摸屏驱动程序的设计和实现

    触摸屏驱动程序的设计和实现 嵌入式设备触摸屏按其技术原理可分为五类:矢量压力传感式、电阻式、电容式、红外线式和表面声波式。其中电阻式触摸屏在嵌入式系统中用的较多,电阻式触摸屏可分为四线、五线、七线等几种。一般来说,WinCE触摸屏驱动的设计和实现有以下几个步骤: (1)配置和初始化触摸屏 触摸屏驱动在初始化过程会调用TouchPanelEnable函数,该函数调用的DDSI函数为DdsiTouchPanelEnable和 DdsiTouchPanelDisable。这两个DDSI接口函数是驱动实现的关键所在,分别用于打开和关闭触摸屏硬件。但是为了降低功耗,这两个函数其实可以不真正操作硬件,而只是实现软件上的控制。 同时,在初始化时还需要进行这几个配置和初始化:一是创建事件 hTouchPanelEvent和hCalibrationSampleAvailable,前者是在正常状态下当有触摸笔按下或者按下后需要定时采集数据时被触发;而后者是在校准状态下当有校准数据输入时被触发。二是检查初始化所需的中断gIntrTouch(触摸屏中断)和 gIntrTouchChanged(定时器中断),并将这两个中断关联到事件hTouchPanelEvent。三是创建一个ISR线程 TouchPanelpISR,用于等待和处理触摸屏事件hTouchPanelEvent,它也是整个驱动程序中唯一的事件源。 (2)校准触摸屏基准参数 完成前面繁琐的工作后,驱动程序的各种功能就都已经准备就绪了,现在就可以实际操作触摸屏幕了。但一般来说,电阻式触摸屏需要校准,也就是说在驱动启动过程中MDD层要调用相应的DDSI函数来读取注册表中的校正数据校正触摸屏。理想情况下,校准程序只要在嵌入式设备初次加电测试过程中运行一次就可以了,参考值会被存储在非易失性存储器中,以免让用户在以后的加电启动期间再做校准。不过,高质量的触摸屏驱动程序是应该要向用户提供一种进入校准例程的途径,从而在由于温度漂移或其它因素造成校准不准确时进行重新校准。 在理想情况下,校正触摸屏基准只需两组原始数据,即在屏幕对角读取的最小和最大值。但在实际应用中,因为许多电阻式触摸屏存在明显的非线性,如果只在最小和最大值之间简单的插入位置数值会导致驱动程序非常的不精确。因此,在 WinCE中需要获取多个校准点,常用的校准点数量为5个。 方法是:①首先驱动程序在函数 DdsiTouchPanelGetDeviceCaps 中设置校准点的个数;②是系统在TouchDriverCalibrationPointGet中获取每个校准点的屏幕坐标;③是在屏幕界面的校准点坐标处显示一个位置符号,用户需要精确地在位置符号按下触摸屏;④驱动程序通过TouchPanelReadCalibrationPoint函数读取相应的触摸屏坐标值;⑤然后再开始下一个校准点,直到循环设定的次数后将采集到的触摸屏坐标值和校准点屏幕坐标送到 TouchPanelSetCalibration函数中进行处理,该函数将产生校准基准参数。校准完成之后,触摸屏便可以开始正常的操作了。 (3)判断屏幕是否被触摸 一旦完成了触摸屏硬件设置、初始化和基准参数校准后,接下来就需要用一种可靠的方法来判断屏幕是否被触摸了。WinCE提供了屏幕是否被触摸的检测机制,而且当触摸事件发生时还可选择是否中断主处理器。判断屏幕是否被触摸的驱动程序的函数名叫WaitForTouchState()。当屏幕被初次触摸时唤醒主机的中断,称为PEN_DOWN中断。这样做可以让驱动程序在屏幕没有被触摸时中断自己的执行,而不消耗任何CPU资源,而一旦用户触摸屏幕,驱动程序就被唤醒并进入转换模式。 当被唤醒后就有一组模数数据等待转换并产生中断信号。中断是硬件与软件打交道的重要方法,所以大多数驱动程序都涉及到中断处理。就中断处理而言,WinCE采用了一种独特的方法。它将中断处理分为两步:中断服务例程(ISR)和中断服务线程(IST)。具体来讲就是把每个硬件的设备中断请求(IRQ) 和一个ISR 联系起来,当一个中断发生并未被屏蔽时,内核调用该中断注册的ISR。因为ISR 运行于内核模式,所以应该被设计得尽可能的短,ISR 的基本职责是引导内核调度和启动合适的IST。IST 在设备驱动程序软件模块中编写,它从硬件获取或向硬件发送数据和控制代码,并进一步处理设备中断。 WinCE触摸屏驱动程序是采用中断方式对触摸笔的按下状态进行检测,当检测到触摸笔按下时产生的中断,就会触发一个事件通知一个工作线程开始采集数据。同时,驱动将打开一个硬件定时器,只要检测到触摸笔仍然在按下状态,将定时触发同一个事件通知这个工作线程继续采集数据,直到触摸笔抬起后关闭该定时器。简单的说,就是驱动程序会同时采用触摸屏中断和定时器中断这两个中断源。目的在于不仅可以监控触摸笔按下和抬起状态,而且可以检测触摸笔按下时的拖动轨迹。触摸屏中断的两个逻辑中断分别是:SYSINTR_TOUCH是用于触摸笔点击触摸屏时产生相应的中断;SYSINTR_TOUCH_CHANGE则用于触摸笔离开时产生相应的中断。 (4)获得稳定的、去抖动的测量数据 在进行触摸屏程序开发时,一定要注意原始的触摸测量数据经常会有一些噪声和偏差,这是正常的。一般来说,只有用户紧紧压住电阻触摸屏才能得到两个连续的读数,然而我们会发现当触控笔或手指按上或离开触摸屏时,读数的变化要比保持稳定压力时大得多。这是因为用户是以机械的方式连通二个平面电阻-触摸层,当用户按压和释放触摸屏时,在很短的一段时间内触摸屏的电气连接均处于临界状态。这时,我们需要丢弃这些读数直到系统稳定下来,否则提交的触摸位置读数会产生大幅跳跃,导致严重的失真或触摸位置漂移。 这时就需要进行折衷考虑,这也是触摸屏驱动设计的关键所在。如果我们要求较窄的稳定窗口,那么驱动程序将无法跟踪快速的“拖曳”操作;如果加宽稳定窗口,就可能面临着许多风险,这些风险包括接收到不精确的触摸数据,或上面描述处于临界状态的层连接结果。这时,就需要通过实验来确定适合系统的最佳值。 在正常情况下,当屏幕被触摸时驱动程序应会得到每个稳定的读数,并利用简单的线性插值法将原始数据转换成像素坐标。读取触摸点的坐标是由DdsiTouchPanalGetPoint()函数实现的。另外,在每个转换过程的前后,驱动程序必须检查并确认屏幕仍处于被触摸状态。因为我们不希望采集到实际上是处于“开路状态”的稳定读数。因此,在读取触摸数据时,我们需要对原始数据进行去抖动处理,然后确定屏幕被触摸时是否有稳定的读数;如果不稳定就要继续读取数据并进行去抖动处理,直到得到稳定的数据为止。[!--empirenews.page--] 最后,触摸屏驱动程序应将触摸状态和位置变化信息发送给更高层的应用软件,以完成一次完整的触摸操作。

    时间:2015-10-24 关键词: 触摸屏 嵌入式开发 实现 设计 驱动程序

  • 一种基于ARM9的彩色TFT-LCD模块设计及实现

    摘 要:介绍了一种基于ARM9的彩色薄膜晶体管液晶显示模块(TFT-LCD)的设计和实现方法。为了解决图像及字符在液晶模块上的实时显示,图像库及字符库存储在容量达64Mbyte的NAND Flash闪存中,可以根据不同需求对图像库及字符库进行更新。模块支持24bit彩色RGB格式图像的显示,还支持JPEG格式图像的显示,JPEG图像的解码功能在ARM9处理器上实现。模块采用串口方式与其他外接主控系统通信,通过接收主控系统的不同指令,可以实现对库中图像及字符显示的实时更改。在液晶屏LQ080V3DG01上已通过测试,运行可靠。该模块已实际应用于图像显示设备中。 1 引 言 TFT-LCD因其厚度薄且画面质量优异,可以实现信息的高速度、高亮度及高对比度显示,已广泛应用于图像显示系统中。虽然TFT-LCD具有良好的显示性能,但TFT-LCD的驱动信号非常复杂,同时外围的控制单元需要处理的数据量非常大,以一个分辨率为640×480的彩色TFT-LCD为例,显示一幅彩色图像就需要处理900kbyte的数据量,这对于传统的单片机等处理器显得无能为力。由于图像数据量大,目前图像大都采用压缩后再存储,其中JPEG (Joint PhotographicExperts Group)格式的压缩图像应用最为广泛。 为了解决图像等大容量数据在TFT-LCD显示屏上的应用,本文提出了一种基于ARM9处理器S3C2440X的彩色液晶显示模块。模块能够实现对字符及彩色RGB格式图像的显示,同时还可以显示JPEG 格式的图像。由于液晶显示屏只能接收RGB格式的图像数据,为了实现对JPEG格式的图像显示,必须对压缩图像进行解压缩,JPEG格式图像的解码功能在 ARM9处理器上实现。本文提出的方法简化了彩色TFT-LCD图像显示的设计难度,同时为JPEG格式的解码及液晶显示提供了一种实现方法。液晶显示模块可以方便地与外接系统接口,实现图像显示模块的功能。 2 模块结构设计与分析 模块硬件包括4个部分:ARM9S3C2440X处理器、数据存储模块、液晶显示模块及RS232串口通信模块。模块中使用了两种非易失性闪存NAND Flash和NOR Flash。考虑到NOR Flash具有芯片内执行及可靠性高的特点,使用它来存储ARM9处理器运行的程序代码;存储容量大且高单元密度的NAND Flash用来存储海量数据,作为图像库及字符库的存储单元。SDRAM 作为外扩存储器使用。TFT-LCD LQ080V3DG01作为模块的显示屏使用。与其他外部模块通信采用RS232串口方式。 模块实现的主要功能有:JPEG 格式图像的解码;支持24bit彩色RGB图像数据及JPEG两种格式图像的显示;字符的显示;数据存储容量为64Mbyte,可以实现对图像库及字符库的更新;可以设置不同的串口波特率。模块功能框图如图1所示。   图1 模块功能框图。 2.1 ARM9嵌入式处理器S3C2440X S3C2440X是一款基于ARM920T 内核、主频最高达400MHz、适用于嵌入式应用的RISC处理器。它支持可配置的8,16,32bit数据总线宽度。在存储器接口方面,最多可以扩展6 个通道的ROM 或RAM 存储器,以及2 个通道的SDRAM,同时它还支持NAND Flash、NORFlash存储器扩展。 它内部的ARM920T 内核具有高速微控制器总线(AMBA BUS)结构及哈佛结构的高速缓冲存储器(Cache),高速缓冲分别是16kbyte程序及16kbyte数据存储器,使其具有良好的高速性能[3]; 具有丰富的外围设备,包括LCD控制器、UART、USB、SD 及SPI等接口,可以满足不同的设计要求。 2.1.1 LCD控制器 S3C2440X内部LCD控制器接口支持STNLCD及TFT-LCD的无缝连接,它支持单色、调色板彩色及24bit真彩色的显示。根据不同的设计要求,通过程序编程可以实现相应的LCD分辨率,数据格式及帧频等设置,从而满足各种类型的LCD模块。S3C2440XLCD控制器用来传输视频数据VD [23:0],同时产生相应的控制信号VSYNC、HSYNC、VDEN及LEND,时序图如图1所示。实现LCD 控制器功能的关键是根据LCD时序的要求,合理配置控制器寄存器。   图2 TFT-LCD时序图。 图1中的信号定义如下: VSYNC:LCD控制器和LCD之间的帧同步信号,高电平有效时表示一帧图像的起始。 HSYNC:行同步信号,由水平有效像素的大小决定。 VCLK:LCD时钟信号,在一个时钟周期内数据送入LCD移位寄存器内。 VDEN:数据使能信号,高电平表示数据有效。 LEND:行结束信号。 VD[23:0]:RGB数据信号线。对于24bitTFT-LCD,R、G、B各占8位;而对于16bit TFT屏有两种方式:5∶6∶5及5∶5∶5+1,使用时需要注意要与相应TFT-LCD的信号相一致。 2.1.2 数据存储模块 NAND Flash是一种固态内存,与EEPROM相比,具有读写速度快的优势;与SRAM 相比,具有非易失性等优势。图像尤其是彩色图像数据量大,因此需要考虑使用大容量的存储器来存储图像数据。另外,考虑到断电后数据的非易失性,因此选择 NAND Flash作为存储器件。 数据存储单元NAND Flash包括图像库及字符库,其中字符库存储容量是8Mbyte,图像库存储容量是56Mbyte。模块选用NAND FlashK9F1216U0A作为图像的存储器件,它的容量大小为64M×8bit,其中每页是(512+16)byte,块大小是 (16k+512)byte;随机读取一页数据的最大时间是12μs,而向NAND Flash写入一页数据的典型时间是200μs。以分辨率为640×480的RGB 彩色图像为例,图像数据大小是900byte,因此将此图像写入Flash的最大时间是341μs,然后将此图像从Flash读出的最长时间是21μs。 以分辨率为640×480的RGB格式彩色图像为例,56Mbyte的图像存储容量可以存储62幅图像,完全可以满足大容量存储的要求。在存储图像数据的编程过程中,由于NAND Flash是以页为单元进行数据存储,这就意味着一幅图像需要占用多个页的存储空间。需要注意的是,由于NAND Flash器件存在坏块单元,而且坏块是随机分布的,因此需要对坏块进行标记处理,对它们标记为不可用,这样就避免了由于坏块单元引起的数据存储错误。[!--empirenews.page--] 2.1.3 JPEG图像解码 JPEG是一种目前广泛使用的静态图像压缩标准,它以其显着的压缩效率和较低的图像质量损失获得了广泛应用,成为国际通用的标准。 JPEG的目的是提供一种使用于各种连续色调图像的压缩方法,并且能够易于硬件实现,具有良好的性价比。为了满足各种应用需求,它提供了两种压缩编码技术:基于离散余弦变换(DCT)的有损压缩编码和基于DPCM 的无损编码,这两种编码方式可以采用4种操作模式来实现:顺序编码、累进编码、无损编码及层次编码。其中基于DCT变换的顺序编码方式最常用。 以基于离散余弦变换的顺序编码方式来说明JPEG图像解码的过程。图像解码是压缩编码的反过程,解码的码流起始位置标志信息,解码器根据 JPEG压缩图像的文件头信息,得到原始图像的基本信息。得到原始图像信息后,解码器根据JPEG文件中的霍夫曼表进行解码。由于熵编码过程中使用霍夫曼编码分别对DC及AC系数进行编码,其中系数编码的顺序采用zig-zag序列,因此实现解码时需要考虑这些相关实现过程,详细信息请参考相关文献 [5]。根据量化系数表,经霍夫曼解码后的系数与相应的量化值进行乘积,然后进行反余弦变换。需要注意的是,JPEG 图像使用的是YCrCb模型,其中Y 是亮度分量,Cr及Cb是色度分量,需要将系数的色彩空间从YCrCb转换到RGB空间,最终得到图像的R、G、B 数据值,这些数据才可以在液晶显示屏上显示。 根据JPEG 文件交换格式提供的资料文献[6],YCrCb色彩空间到RGB色彩空间的转换见公式(1)。   考虑到延时应尽量小,程序在NOR Flash存储器上执行效率低。图像解码算法中应合理安排在ARM9中的内存分配。设计过程中将频繁访问的程序代码及数据搬运到ARM9内部高速缓冲存储器中,从而提高编码的效率。由于顺序编码方式最常用,它通常称为JPEG 基本系统(BaseLine)。设计过程中,实现的JPEG 图像解码支持顺序编码,完全可以满足应用要求。 2.2 TFT-LCD LQ080V3DG01 实验中选用LQ080V3DG01彩色液晶显示模块测试设计效果。LQ080V3DG01 由彩色TFT-LCD面板、驱动电路、控制电路、供电电路及背光单元组成。它支持最大分辨率为640×480的图形和文字显示,数据输入格式为 18bit,其中红绿蓝各占6bit,提供的颜色共262 144种。 TFT-LCD需要+3。3V或+5V供电电压,背光需要交流电源供电。输入的控制信号有4个:帧同步信号VSYNC、行同步信号HSYNC、数据使能信号ENAB及时钟信号CK。数据线宽度是18bit,红绿蓝各占6bit,分别是R [0∶5]、G [0∶5]及B [0∶5],颜色配置信息如表1所示。 表1 输入数据信号及颜色显示配置   LQ080V3DG01液晶显示屏的数据线共18bit,对于24bit的彩色图像以及24bit的ARM9S3C2440X的TFT-LCD 控制器而言,其接口并不兼容。设计中为了适应LQ080V3DG01液晶显示屏的接口,分别舍弃了8bit R、G、B 值的低2位,测试结果显示效果良好。如果选用的TFTLCD是24bit数据线,则可以直接连接到LCD控制器相应的数据线。 3 模块设计方案的实现 3.1 工作流程 在ARM9执行初始化后,主程序就等待外部模块通过串口发送指令。外接模块通过RS232串口与本模块通信,根据通信协议发送不同的指令,实现相应的功能。在约定的串口波特率下,通信协议如下:显示图像时首先发送指令0x55,然后再发送图像在图像库中的编号;显示字符时首先发送指令0x56,然后再发送字符在字符库中的编号,最后发送字符在液晶屏上显示的横轴及纵轴坐标。需要说明的是,在NAND Flash存储空间中的图像库及字符库是自己定义的,可以重新下载更新。软件流程图如图3示。   图3 软件流程图 3.2 彩色图像显示 所设计的模块支持24bit彩色RGB及JPEG两种格式的图像显示。因为像素数据可以直接送到液晶接口控制模块显示,而JPEG格式的图像则必须经过解码之后才能显示,所以图像在显示前,需要先判断图像数据是什么格式。如果图像数据是JPEG格式,则必须经过图像解码,解码后得到原始彩色图像的像素数据值R、G、B,这些数据经过显示控制单元送到液晶屏显示。如果图像是原始图像的数据,则可以直接送到液晶控制模块进行显示。 由于要显示的图像存储在NAND Flash的图像库存储空间,所以在将彩色图像输出到TFT-LCD显示时,首先要将需要显示的图像数据从NAND Flash中读取出来,得到一幅24bit彩色图像的完整原始图像数据。原始图像数据中,一个像素占用3byte,其中R、G、B 各占1byte。将数据输出给TFT-LCD 显示前,需要根据LCD接收的数据格式将图像数据进行转换,然后才能输出显示,图像数据按照从上到下,自左向右的顺序输出[9]。同样,将TFT-LCD 按照相同的顺序进行扫描,最终完成整幅图像的显示。 NAND Flash存储着大量的图像数据,为了区分不同的图像数据,将相应的图像输出显示,模块采用RS232串口与外界通信。通过发送不同的指令,可以将在NAND Flash上存储的相应图像读取出来,输出在TFT-LCD上,最终实现各种彩色图像的显示。 3.3 字符显示 字符采用16×16点阵,由于每个像素占用3byte,所以每个字符占用768byte。可以将常用字符存储在NAND Flash中,作为字符库使用,需要时调用即可。当显示字符时,首先要确认相应字符在存储器中的位置,然后根据地址信息对相应字符进行操作,最后根据字符要显示的位置在液晶屏上输出,实现字符在液晶屏上的显示。 实验过程中为字符库分配8Mbyte空间,可以存储10 922个字符。字符库还可以实现更新,只需将存储器NAND Flash对应地址空间的内容替换即可。[!--empirenews.page--] 4 实验结果 为了测试模块的正确性,将一幅分辨率为640×480的图像"AutumnLeaves"下载到NANDFlash存储器中,它在图像库中的编号为0x01。 根据串口通信协议,向液晶显示模块发送指令0x55,然后再发送图像在图像库中的编号0x01。 显示模块接收到指令后,液晶屏显示效果如图4所示。测试结果表明,模块工作正常,发送显示其他图像及字符的指令同样效果良好,运行可靠,达到了模块方案设计要求。   图4 液晶屏显示图像测试结果。 5 结 论 提出了一种基于ARM9的24bit彩色TFTLCD液晶显示模块设计方案。图像及字符库存储在NAND Flash固态闪存中,保证了图像及字符的实时显示,同时还能实现对图像库及字符库的更新。提供了串口通信方式,可以方便地实现与其他外接系统交互。该模块设计简化了彩色TFT-LCD显示图像的设计难度,提高了开发效能。模块可以兼容不同类型的彩色TFT-LCD,为液晶显示模块的彩色图像显示提供了一种新的方法。

    时间:2015-07-12 关键词: arm9 实现 嵌入式处理器 tft-lcd模块

  • Windows CE下串行通信的实现

    摘要:Windows CE是微软公司推出的一种嵌入式的操作系统、用于系统资源有限的小型设备。它采用模块化的结构,支持多种外部接口,包括最常用的RS232串行接口。本文就Windows CE系统串行接口的编程进行讨论,并给出与GPS设备的接口程序。 关键词:Windows CE 串行通信 GPS 1 Windows CE简介 Windows CE是一种小型的、基于ROM的、具有Win32子集API的操作系统。它的优势在于小尺寸、Win32 API子集和对多平台的支持能力。在Windows CE下编程需要注意的是,Windows CE设备的资源很少,存储器、显示器都很小,接口也比较少,而且根据实际情况变化很大。另外,Windows CE只支持Unicode,这在编程中要格外注意。在Windows CE中,除了一些基本的Windows通用控件以外,还有一些专门设计的控件,比如CommandBar。Windows CE体积虽小,但是它的功能并不少,内存管理、文件操作、多线程、网络功能等等它都支持,可以说是麻雀虽小,五脏俱全。 2 Windows CE下的串行通信 串行端口在Windows CE下属于流接口设备,它是串行设备接口的常规I/O驱动程序调用和与通信相关的具体函数的结合。串行设备被视为用于打开、关闭、读写串行端口的常规、可安装的流设备。Windows CE的通信函数和其它大多数Windows的通信函数相同。特别要注意的是,Windows CE不支持直接对串行端口的寄存器进行编程。常用的串行端口函数介绍如下: (1)打开和关闭串行端口 CreateFile函数用于打开串行口。 hPort=CreateFile(TEXT(“COM1:”),GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL)。注意COM1后要有一个冒号。最后一个参数dwFlagsAndAttributes必须为0,因为Windows CE只支持非重叠I/O。第3个参数dwShareMode也必须为0,通信端口不能像文件一样被共享。这个函数的返回值是已打开的串行端口的句柄或者是 INVALID_HANDLE_VALUE。 关闭串行口可以调用CloseHandle(hPort)。 (2)配置串行端口 配置串行口主要是用DCB结构配置端口设置,包括波特率、停止位、数据位长度、校验位、流量控制等等,还有配置超时值。 首先打开串行端口,用GetCommState函数获得当前打开串口配置,然后根据需要修改DCB成员,最后用SetCommState函数设置新的串口配置。 DCB PortDCB; //创建DCB变量 Port.DCB.DCBlength=sizeof(DCB); GetCommState(hPort,%26;amp;PortDCB); //获取当前串口配置修改DCB成员 PortDCB.BaudRate=9600; //波特率 PortDCB.Parity=NOPARITY; //校验位 PortDCB.StopBits=ONESTOPBIT; //停止位 PortDCB.ByteSize=8; . . . SetCommState(hPort,%26;amp;PortDCB); //设置新的串口配置 对串行端口来说,必须配置超时值,否则程序可能陷入到一个循环来等待来自串口的字符。这对采用Windows CE的设备来说,将大大减少设备电池的使用时间,所以超时值是需要配置的。另外一种解决办法就是采用多线程。多线程将在下一部分讲述。 通常,配置超时值和配置串口类似。首先用GetCommTimeouts函数获得当前串口的超时值。然后可以修改COMMTIMEOUT成员,最后用 SetCommTimeouts函数设定超时值。 COMMTIMEOUTS CommTimeouts; //定义COMMTIMEOUTS结构 GetCommTimeouts(hPort,%26;amp;CommTimeouts); //获得当前的超时值 //修改COMMTIMEOUT成员 CommTimeouts.ReadIntervalTimeout=MAXDWORD; CommTimeouts.ReadTotalTimeoutMultiplier=0; CommTimeouts.ReadTotalTimeoutConstant=0; CommTimeouts.WriteTotalTimeoutConstant=1000; CommTimeouts.WriteTotalTimeoutMultiplier=10; SetCommTimeouts(hPort,%26;amp;CommTimeouts); //设定超时值 (3)读写串行端口 用ReadFile和WriteFile函数读写串行口。 int rc; DWORD cBytes; BYTE ch; Rc=ReadFile(hPort,%26;amp;ch,1,%26;amp;cBytes,NULL); 其中第一个参数是串口句柄,第2个参数是读回的字符,第3个参数是要读取的字符数量,第4个参数返回实际读取到的字符数量。 Int rc; DWORD cBytes; BYTE ch=TEXT(“a”); Rc=WriteFile(hPort,%26;amp;ch,1,%26;amp;cBytes,NULL); 其中第一个参数是串口句柄,第2个参数是要写入的字符,第3个参数是要写入的字符数量,第4个参数返回字符写入的字符数量。 需要注意的是Windows CE不支持重叠I/O,所以如果在主线程进行大量读写串口操作时,有可能使整个程序陷入缓慢的串口等待中去,因此一般都采用多线程来进行读写串口操作。 (4)通信事件 在Windows CE编程中,除了可以采用单独的线程来处理读写串口操作外,还可以采用利用通信事件的方法。通信事件就是当发生重要事件时,Windows CE向应用程序发送的通知。利用WaitCommEvent函数阻塞线程,直到特定的事件发生。一般的使用方法是:先用SetCommEvent函数指定要查找的一个或多个事件,然后,调用WaitCommEvent函数,并指定导致这个函数返回的事件。当WaitCommEvent函数返回后,循环调用 ReadFile函数,读回所有接收到的字符。最后再次调用SetCommEvent函数,指定下次要查找的事件。 3 Windows CE下的多线程 Windows CE是一个完全的多任务、多线程的操作系统。Windows CE同时最多可以运行32个进程。每个进程有一个主线程,而且可以有多个附加线程。附加线程的多少仅受可用内存和线程堆栈的进程地址空间的限制。 Windows CE是以抢先方式调度线程的。线程以时间片为单位来运行,通常是25ms。线程拥有优先级,所有高优先级的线程都将在低优先级的线程之前运行。在可以调度被设定为特定优先级的线程之前,所有拥有高优先级的线程都必须被阻塞。同等优先级的线程以循环方式来调度。如果高优先级的线程停止阻塞,而低优先级的线程目前正在运行,则低优先级的线程会立刻被挂起,同时去调度高优先级的线程。低优先级的线程永远不会抢占高优先级的线程,当然也有例外:一种是线程具有优先级THREAD_PRIORITY_TIME_CRITICAL,它永远不会被抢占;另一种就是低优先级的线程拥有高优先级的线程正在等待的资源,出现优先级倒置。在Windows CE中,线程可以有8种优先级。 下面是一个创建线程和线程函数的例子: HANDLE hThread; DWORD dwThreadID=0; Int nParameter=5; HThread=CreateThread(NULL,0,Thread,nParameter,0,%26;amp;dwThreadID); //创建线程 CloseHandle(hThread); //关闭线程 //线程函数 DWORD WINAPI Thread (PVOID pArg) { int nParam=(int)pArg; . . . return 0x15; } CreateThread函数在许多参数在Windows CE下都不支持,所以被设为NULL或0。第3个参数指向线程函数的开始,第4个参数是CreateThread函数传到线程函数的唯一参数。 CreateThread函数返回线程句柄,当这个句柄不需要时,调用CloseHandle函数关闭它。线程函数在被终止之前一直运行,调用 ExitThread函数可终止线程的执行。 对于在系统中运行的多个线程,需要协调它们的活动,也就是实现同步。在Windows CE中,采用的方法是使用同步对象。一个线程等待一个同步对象,当用信号通知该对象时,解除阻塞正在等待的线程并调度该线程。同步对象包括事件和互斥体。在这里我们只介绍事件。 事件对象就是一种有两种状态——有信号和元信号的同步对象。事件被创建后自动被置为信号状态。事件可以被命名,从而被不同进程共享。采用下面的函数创建事件: HANDLE CreateEvent(LPSECURITY_ATTRIBUTES lpEventAttributes,BOOL bManualReset,BOOL bInitialState,LPTSTR lpName); 函数的第1个参数应为0,第2个参数表示事件成为有信号后应该人工重置或自动重置为无信号状态,第3个参数表示创建时事件是有信号还是无信号状态,最后一个参数指向事件名。被命名的事件可以被进程共享,否则就设为NULL。创建事件后,就可以采用SetEvent函数或者是PulseEvent函数用信号通知该事件。 SetEvent函数是自动重置事件,只释放一个线程来运行;PulseEvent函数是人工重置事件,释放所有等待那个事件的线程。最后可以用 CloseHandle函数破坏事件对象。 事件的用法通常是,线程使用了下列函数中的一个来等待事件:WaitForSingleObject、WaitForMultipleObjects、 MsgWaitForMultipleObjects或MsgWaitForMultipleObjectsEx。当线程被这些函数的其中一个阻塞时,线程只消耗少量的电能和CPU处理能力。需要注意的是:应用程序的主线程不能被WaitForSingleObject或 WaitForMultipleObjects阻塞,否则主线程无法处理消息循环。通常的做法是采用多线程,主线程处理消息循环,附加线程处理需要在事件上阻塞的共享资源。 4 实际应用 在车载定位系统中,导般计算机需要接受多种传感器的数据输入,其中最常用到的就是GPS数据。通常GPS接收机的通信方式是串行RS232接口,所以导航程序的GPS模块的功能就是接收从串口收到的数据,然后进行处理。 程序采用多线程,主线程负责消息处理,另外还有读写两个附加线程,使用一个事件触发。读线程负责从串口读回GPS数据,写线程由事件触发。在网络补充版(http://www.dpj.com.cn)中给出GPS数据接收程序的代码。 在程序初始化时创建事件,创建写线程并把它阻塞。写线程等待事件触发。按下“打开串口”按钮后打开串口,创建读线程,读回GPS数据,进行处理;按下“发送”按钮后设置事件状态,解除阻塞写线程,发送数据。[!--empirenews.page--]

    时间:2015-03-20 关键词: Windows 串行通信 实现 ce 驱动开发

  • SPI总线在51单片机系统中的实现

    一个完整的单片机系统,通常包括键盘输入、显示输出、打印输出、数据采集等许多功能模块。这些功能模块一般是通过I/O端口实现与单片机的数据交换,但是单片机的I/O端口有限,且一般用来处理数字信号,从而产生了总线式传输模式。 现在大多数单片机都是传统的三总线结构,即地址,数据,控制三总线。由于方便控制,三总线得到广泛的应用。但是作为并行总线,它也有一定的局限性。不适合远距离的传输。与I/O口的数目存在矛盾。随着电子技术的进步,发展出很多新的总线接口,如 USB、I2C、CAN、SPI、1-Wire等。这些总线的特点都是串行接口,只需要几根甚至一根线就可以实现数据的传输。本文通过对支持SPI总线的AD器件MAX189性能分析,简要介绍了SPI总线在单片机系统中如何应用,并利用其制作一款简易的电压表。 一、SPI总线简介 SPI(Serial Peripheral Interface)是MOTOROLA公司提出的同步串行总线方式。因其硬件功能强大而被广泛应用。在单片机组成的智能仪器和测控系统中。如果对速度要求不高,采用SPI总线模式是个不错的选择。它可以节省I/O端口,提高外设的数目和系统的性能。标准SPI总线由四根线组成:串行时钟线(SCK)、主机输入/从机输出线(MISO)。主机输出/从机输入线(MOSI)和片选信号(CS)。有的SPI接口芯片带有中断信号线或没有MOSI。图1给出了 SPI的典型时序图。   SPI主要性能如下: 全双工,三线同步传输 1.05Mbit/s的最大主机位速率 四种可编程主机位速率 可编程串行时钟极性与相位 发送结束中断标志 写冲突保护 总线竞争保护 二、MAX189芯片 MAX189是美国美信公司设计的一种12位串行A/D转换器。其内部集成了大带宽跟踪/保持电路和串行接口。转换速率高,功耗低,精度高。并且有SPI、Microwire和TMS320兼容的4线串行接口,与微处理器接口。只需要很少的口线,很节约资源。 MAX189的特点: 三线高速串行接口,12位分辨率 8.5 us逐次逼近型ADC 单一5V工作电压,工作电流1.5mA。关断电流2uA 0-5v模拟输入电压范围 使用片外时钟源 外置参考电压 内部跟踪/保持电路,75ksps采样速率 1/2LSB整体非线性度 MAX189的时序如图2,表1给出了MAX189引脚功能。   PIN 名称 功能说明 1 VCC 电源输入,+5V(±5%) 2 AIN 模拟电压输入端,0-REF。 3 /SHDN 三电平关闭输入端,低电平关断 4 REF 用于模拟信号的基准电压端,使用外部基准源时用作输入 5 GND 模拟和数字地 6 DOUT 串行数据输出端,数据在sclk的下降沿输出 7 /CS 片选,低电平有效 8 SCLK 串行时钟输入端(最大5MHz) 该简易电压表电路采用不带SPI接口的AT89C2051单片机,其指令系统与51系列完全兼容。可以通过软件模拟SPI时序,包括串行时钟。数据输入和输出。来实现对A/D器件MAX189的操作。所测电压经过单片机的处理,采用三个七段数码管显示。采用SN74LS164扩展I/O口。MAX189 的2脚为待测模拟电压输入端。图3是简易电压表的原理图,其中A为数码管显示电路,B为A/D转换部分电路。   MAX189可以工作在两种模式下。即普通状态和关断状态。如果将SHDN置低电平。器件处于美断状态,电流小于10 uA。当把SHDN置高电平或悬空。器件就可以被操作。此时,CS在时钟下降沿启动转换.在时钟SCLK的每一个上升沿把一个最高位为“1”的控制宇节的各位送入输入移位寄存器.并启动串行时钟.开始将输入电压值逐次逼近转换。它用输入跟踪/保持(T/H)和12位逐次逼近寄存器(SAR)构成的电路系统将模拟信号转换成12位数宇信号输出。T/H电路不需要外部保持电容。输出数据按照高位在前.低位在后的顺序。在12个SCLK的每一个下降沿决定逐次逼近的各位并将数据送到Dout端。每一位转换结束后Dout由低电平变为高电平。(转换过程中不能对SCLK操作)按照时序要求。每输入一个(移位)脉冲。下降沿取出一位数据。单片机读取并做处理。读出12位数据后,可以开始下一次转换。 AT89C2051的串行端口处于模式0。数据的发送和接收都是通过RXD引脚(这里只用来发送数据).TXD则负责送出移位脉冲。其数据位由LSB开始发送/接收8个位。波特率固定为fosc/12。SN74LS164负责接收串行口发送的数据。在传输8个位后。其将数据并行送出驱动数码管.显示所测电压值。 该电压表小巧,方便,精度高。程序运行比较稳定。误差在0.01V数量级。(感谢在设计过程中司佑全老师的给予的悉心指导) 源程序 该程序的作用是是该电路能测量0-5V的电压.并用数码管实时显示。 ;占用p1.5,p1.6,p1.7作为模拟SPI时序与MAX189连接。 sclk equ P1.5;定义缓冲区 cs equ p1.6; dout equ p1.7; buf equ 50h; org 0000h ajmp begin begin: acall init;初始化片内资源 acall load_data;初始化缓冲区 acall adc_init;对AD的操作 acall cON;数据处理子程序 acall display;显示子程序 acall load_data ajmp begin init:mov 36h,#00000000b;加载初值,取高8位数据 mov 37h,#00000000b mov r1,#8 mov r3,柏 mov scon,#00h mov ie,#82h setb ti ret adc_init:acall init_ad;AD的控制 acall wait acall read_ad [!--empirenews.page--]ret init_ad: ;启动AD转换 setb cs clr cs ret wait: ;等待AD转换的结束 jnb dout,wait; ret fasong:jnb ti,$;发送数据 clr ti mov sbuf,a ret read_ad: Ioop1: setb sclk clr sclk mov C,dout mov A,36H; rlc A mov 36H,A djnz r1,loop1;读高8位,存放在36h loop11: setb sclk clr sclk mov C,dout mov a,37H; RLC a MOV 37H,a DJNZ R3,loopll; mov a,36h setb cs ret load_data:mov buf,0fch;扫描显示器,显示数据 mov buf+1,#0fch mov buf+2,#0h mov buf+3,#0h ret con:mov B,#5 div AB mov B,#10 div AB mov DPTR,#table1 movc A,@A+DPTR mov buf+1,A mov A,B mov DPTR,#TABLE movc A,@A+DPTR mov buf,A ret display:mov r0,#buf;显示 lop:mov a,@r0 acall sent inc r0 cjne r0,#buf+8,lop acall delay ret sent:jnb li,$发送数据 clr ti mov sbuf,a ret delay:mov r7,#230; d1:mov r6,#13O d2:djnz r6,d2 djnz r7,d1 ret table1:db 0fdh,61h,0dbh,0f3h,067h db 0b7h,0bfh,0e1h,0ffh,0e7h;带小数点的八段显示数据(0--9) table1: db 0fch;0 db 060h;1 db 0dah;2 db 0f2h;3 db 066h;4 db 0b6h;5 db 0beh;6 db 0e0h;7 db 0feh;8 db 0f6h;9 ;不带小数点的八段显示数据 end

    时间:2015-02-16 关键词: 51单片机 实现 spi总线 总线与接口

  • 基于EDA的交通信号灯电路的设计与仿真

     传统的交通信号灯控制电路的设计是基于中、小规模集成电路,电路元件多、焊接复杂、故障率高、可靠性低,而且控制系统的功能扩展及调试都需要硬件电路的支持,为日常维护和管理增加了难度。目前很多城市的交通信号灯还是应用传统的电路设计,一旦交通信号灯出现故障,不能及时维修和处理,势必会造成道路的交通混乱。通过技术的改进,采用基于EDA技术的交通信号灯控制电路弥补了传统设计中的缺点,通过VHDL语言编写系统控制程序,利用软件控制整个系统的硬件电路,还可以利用EDA集成开发环境对交通信号灯的设计进行仿真,验证设计结果是否实现。改进后的交通信号灯电路组成元器件少,可靠性高,操作简单,实现可扩展功能。 1 交通信号灯控制电路 1.1 交通信号灯工作原理 基于FPGA的交通信号灯控制电路主要用于甲乙两条车道汇合点形成的十字交叉路口,甲乙两车道各有一组红、黄、绿灯和倒计时显示器,用以指挥车辆和行人有序的通行。两组红绿灯分别对两个方向上的交通运行状态进行管理,红灯亮表示该道路禁止通行,黄灯表示停车,绿灯表示可以通行;倒计时显示器是用来显示允许通行或禁止通行的时间,以倒计时方式显示交通灯闪亮持续时间。为每个灯的闪亮状态设置一个初始值,指示灯状态改变后,开始按照初始值倒计时,倒计时归零后,灯的状态将会改变至下一个状态。交通灯两车道的指示灯闪亮状态是相关的,每个方向的灯闪亮状态影响着另一个方向的指示灯闪亮状态,这样才能够协调两个方向的车流。甲乙两车道交通灯工作状态如表1所示,其中“1”代表点亮,“0”代表熄灭。 当甲车道绿灯亮时,乙车道对应红灯亮,由绿灯转换红灯的过渡阶段黄灯亮。同理,乙车道绿灯亮时,甲车道的交通灯也遵循此规则。当出现特殊情况时,各方向均亮红灯,倒计时停止,特殊运行状态结束后,控制器恢复原来状态,继续运行。 1.2 交通信号灯电路结构 根据交叉路口交通灯工作原理,图1为交通信号灯控制电路的原理图。该电路包含了1个FPGA芯片,2个七段LED数码显示管,6个发光二极管分别表示甲乙两车道上指示灯,以及一个紧急按钮。FPGA芯片采用EP1C12Q240C8,作为系统总体控制部分;利用外接发光二极管模拟交通信号灯的红、黄、绿,控制甲乙两车道车辆运行状态;2个数码管显示交通信号灯闪亮持续时间,并采用动态扫描方式。 2 交通信号灯控制电路的VHDL设计与仿真 十字交叉路口的交通灯指挥行人和车辆的安全运行,在甲、乙车道的交叉路口设计一个交通控制,根据“红灯停,绿灯行,黄灯等待”的交通规则,实现如下功能: 1)甲车道和乙车道的车辆交替运行,每次通行时间设为30 s; 2)每次黄灯先亮5 s,才能变换运行车道; 3)黄灯亮时,要求每秒钟闪亮一次; 4)信号灯点亮时间可预置; 5)特殊情况下可通过开关单独控制,显示器停止计时并闪烁显示。 通过对电路实现功能分析,整个系统主要由分频模块、状态控制模块、译码模块以及显示电路构成。如图2所示,其中clk为系统外加时钟信号,jin为特殊状态禁止通行信号。 2.1 分频模块 分频模块主要是把基准时钟信号转换为激励信号,由于系统的外接时钟信号设为1 kHz,而系统计时所需时钟信号为1 Hz,因此首先通过分频器把外部高频率的时钟信号转换为内部需要的激励信号,驱动状态控制模块工作。所谓分频器实际上就是一个计数器,计数器对1 kHz信号进行计数,每当999时输出一个脉冲信号,从而得到1 Hz时钟信号,其仿真波形如图3所示。 2.2 状态控制模块 状态控制模块是本系统的核心模块,它的作用是根据计时赋值标志位和时钟信号,判断、调整和控制系统的工作状态,提供适当的指示灯控制信号。其中对应输出的工作状态有4种,分别是st1、st2、st3和st4。控制甲、乙车道的红、黄、绿灯的信号分别用ra、ya、ga和rb、yb、gb表示,其值为‘1’表示灯亮,为‘0’表示灯灭。 状态控制模块在脉冲信号作用下分别对甲乙车道的计数进行减1计数,并监测计数器的计数值,当计数器到临界计数值时,在下一秒脉冲为计数器装载新的计数初值,同时改变车道的指示灯状态。当出现特殊情况时,控制按键输入禁止通行信号,即jin为‘1’,计数器暂停计数,各方向车辆都处于禁止运行状态。各状态及特殊情况指示灯工作仿真波形如图4所示。 当工作状态为st1时ra=‘0’、ya=‘0’、ga=‘1’,即甲车道绿灯亮;rb=‘1’、yb=‘0’、gb=‘0’,即乙车道红灯亮;此时计数器qh=3,ql=0,即30s。当工作状态为st2时ra=‘0’、ya=‘1’、ga=‘0’,即甲车道黄灯亮;rb=‘0’、yb=‘1’、gb=‘0’,即乙车道黄灯亮;此时计数器qh=0,ql=5,即5s。同理,当工作状态处于st3时,甲车道红灯亮,乙车道绿灯亮,计数器置初值30;当工作状态处于st4时,甲乙车道都点亮黄灯,计数器置初值5。在特殊情况jin=‘1’时,ra=‘1’,rb=‘1’,此时甲乙车道红灯都点亮,禁止各方向车辆通行,同时计数器停止计数。 2.3 译码模块 译码模块的作用是根据根据状态控制模块中设置的计时初值显示交通灯的闪亮持续时间,并将灯亮时间以倒计时的形式显示出来。即将状态控制模块中计数器计数位各数值进行译码,输出译码信号,驱动七段数码管,由数码管显示器显示当前计数值。当显示黄灯点亮持续时间和特殊情况时数码管显示器实现闪烁显示功能。 译码模块根据七段数码管显示控制规则,将状态控制模块计数器中数值按规则输入译码信号,驱动数码管各控制端。其中数码管各显示控制信号与数值显示关系如表2所示。 译码模块仿真波形如图5。其中one存放计数器个位数值,ten存放计数器十位数值,seg7_1,seg7_2分别代表个位和十位数码管显示控制信号。根据计数器存放数值,seg7_ 1,seg7_2分别输出对应控制信号,以便驱动数码管显示对应数值,例如:当one=6时seg7_1输出“1011111”信号驱动数码管显示数字6;当ten=0时seg7_2输出“1111110”信号驱动数码管显示数字0。 2.4 交通信号灯整体电路仿真分析 交通信号灯控制电路仿真波形如图6所示。 系统输入的基准时钟脉冲Clk=1 kHz,经过分频后得到系统电路需要的时钟激励信号1 Hz。当工作状态stx=st1时,甲车道绿灯信号ga=‘1’,乙车道红灯信号rb=‘1’,并且计数器置入初始值30(qh=3,ql=0),数码管开始倒计时显示时间,此时甲车道绿灯亮,允许车辆通行30s,乙车道红灯亮,禁止车辆通行;当工作状态stx=st2时,甲车道黄灯信号ya=‘1’,乙车道黄灯信号yb=‘1’,并且计数器置入初始值5(qh=0,ql=5),数码管开始倒计时闪烁显示时间,此时甲乙两车道黄灯亮,两车道车辆运行状态进入转换阶段;当工作状态stx=st3时,甲车道红灯信号ra=‘1’,乙车道绿灯信号gb=‘1’,并且计数器置入初始值30,数码管开始倒计时显示时间,此时甲车道红灯亮,禁止车辆通行,乙车道绿灯亮,允许车辆通行30s;当工作状态stx=st4时如同工作状态st2。 如图中所示,在正常运行时出现特殊情况时,启动特殊控制开关,使禁止通行信号jin=‘1’,此时ra=‘1’,rb=‘1’,甲乙两车道都亮红灯,禁止各方向车辆运行,此时数码管停止计时并闪烁显示,当特殊状态结束后,恢复正常运行,数码管继续计时显示。 3 结束语 基于EDA技术的交通信号灯控制电路设计改变了基于单片机的传统交通灯不稳定和不利于扩展的缺点,突破了单片机的种种限制。通过VHDL语言编程,对交通信号灯控制电路做了改进:增加了指示灯倒计时和闪烁提醒功能,以便让司机控制过交叉路口的车速,使交通更加安全有序;增加了全红灯的特殊状态,保证了紧急情况下公务车能顺利通行。

    时间:2015-02-09 关键词: 仿真 实现 设计 优化 交通信号灯

  • 嵌入式WebServer技术及其实现

    摘要:讨论基于TCP/IP协议栈,利用8位单片机构建嵌入式WebServer的具体技术及相关实现方案;给出系统硬件原理框图和有关软件实现的代码框架结构。 关键词:WebServer TCP/IP协议栈 套接字 引 言   利用8位微控制器通过ISP(Internet服务供应商),在不需要使用PC机或高档单片机的情况下接入互联网。随着嵌入式系统的迅猛发展和 IA(信息电器)的出现,该应用系统正逐步取代传统的以PC为中心的应用,成为未来Internet发展中的主力军;将会广泛应用于智能家居系统、工业智能化从站系统、LED网络控制显示屏系统、网络安全加密系统等各个方面。   利用单片机实现嵌入式WebServer方案的主要技术难点是:如何利用单片机本身有限的资源对信息进行HTTP、SMTP、POP3、TCP、 UDP、ICMP、IP及PPP等协议的处理,使之变成可以在互联网上传输的IP数据包以及可以在内置Web页上浏览的数据。  1 应用方案 1.1 方案简介   利用单片机实现嵌入式WebServer,大体可有以下三种形式:   ① MCU+专用网络芯片,如E1552、Webchip PS2000等。此种方案的主要优点是:应用系统设计工程师完全不必考虑任何网络协议,只需要解释并执行网络芯片传送过来的指令和数据就可以实现与 Internet网络连接。   ② EMIT技术。EMIT采用桌面计算机或高性能的嵌入式处理器作为网关,称为emGateway,上面支持TCP/IP协议并运行HTTP服务程序,形成一个用户可以通过网络浏览器进行远程访问的服务器。emGateway通过RS232、RS485、CAN等轻量级总线与外设联系起来,每个外设的应用程序中包含一个独立的通信任务,称为emMicro,监测嵌入式设备中预先定义的各个变量,并将结果反馈到emGateway中;同时emMicro还可以解释emGateway的命令,修改设备中的变量或进行某种控制。该方案中复杂的网络协议是通过emGateway在PC机上实现的,应用系统MCU只处理较简单的emNet协议,进行网际连接。   ③MCU直接实现形式。实现该形式的Web Server,可选用多种型号的MCU来实现网络协议,如AT89C8252、SX52BD100等,并可根据具体要求选用不同速度的MCU作为核心芯片,但是基本硬件结构大致相同。   显然以上方案中,以“MCU直接实现形式”的硬件结构最为简洁,不失为首选方案。下面就详细论述之。 1.2 硬件平台   MCU直接实现形式的WebServer的硬件平台如图1所示。           图1中,MCU以SX52BD100的运算速度最快,在100 MHz晶振驱动下指令执行速度可达100MIPS;RABBIT2000次之,51系列最慢。但是硬件成本恰好反之,用户可以根据不同的要求来配置 MCU。以太网控制芯片可采用RealTek公司的RTL8019AS。该芯片是一款全双工以太网控制器,可以工作在Ethernet II和IEEE802.3、 10Base5、10Base2、10BaseT下,并与NE2000兼容。E2PROM主要用来存WEB页面、图像文件、PDF文档等内容,因此没有特殊要求,可由用户自由选择,一般32 KB左右即可。   该方案中,MCU为核心芯片,通过它控制以太网控制芯片RTL8019AS,进而完成接入网络的工作;而且可以通过编程来选择通信电路类型,如 RS232、RS485、MODEM等。该技术方案最大的特点在于:用简洁硬件构架应用平台,使原本硬件成本所需的支出可用于相对复杂的软件开发上,且该方案的I/O接口可以自由扩展和支配。 1.3 工作流程和软件设计   整个系统的工作流程如图2所示。当数据包通过RJ45接口传送到RTL8019AS和MCU后,系统内部的TCP/IP堆栈进行数据包解析和流向判断,然后进行解包或者打包的动作,以继续进行后续工作。显然,最终的处理结果都要通过WebServer来进行。 2 网络协议栈的实现   通常,所谓的TCP/IP协议是一个四层协议系统,包括数据链路层、网络层(含IP协议)、传输层(含TCP协议)和应用层,每一层负责不同的功能。基于TCP/IP协议可以实现多种功能应用,如: HTTP(超文本传输控制协议)、TELNET(远程登录)、 FTP(文件传输协议)、SMTP(简单邮件传送协议)、SNMP(简单网络管理协议)等。本文主要讨论HTTP, 也就是WebServer在应用层的主要构成协议。当然,用户也可以根据需要附加其它的协议功能。 2.1 TCP/IP协议栈的实现   IP包含编址方案,并提供寻址功能;TCP则是在不同主机的对等进程之间提供可靠的进程间通信。与TCP两端口所连接的实体中,一端为应用程序进程或用户,另一端则为底层协议,如IP协议。TCP在建立连接过程中采用三向握手机制,以保证数据的可靠性。   下面以ZWORLD公司的Rabbit 2000系列芯片为例,论述嵌入式WebServer的具体实现过程。Rabbit 2000系列芯片是一种高性能8位器件。由于其C语言友好指令集和快速数字处理功能,因而受到瞩目。Rabbit结构以Zilog公司的原始Z80微处理器为基础,但作了几项改进:不像Z80指令集那样使用16位寻址覆盖存储空间,而用一个20位或1MB的实际存储空间;采取直接与静态存储器件相连接的方式;有3条存储芯片选择线路和2组写入/输出启动线路;片上外设包括4个串行端口、1个子端口、40条I/O线、7个不同的定时器、精确脉冲发生硬件和电池支持的RTC。   系统硬件框架结构如图1所示,用户只需对应添加相关芯片及辅助设施(如电源、用户所需外设等)即可;而软件的实现,由于Rabbit 2000系列芯片得到Dynamic C编译器的支持以及实现TCP/IP所需的库文件dcrtcp.lib,因此只要会用C语言就可以进行开发。用户关注的重点也变为网络通信实现以后的代码编制及优化,可以极大提高开发进度。   以下是Dynamic C实现TCP/IP协议通信的程序主体框架。程序中起始宏定义为默认IP配置信息;“memmap”句可使程序在芯片里面运行时,如同在扩展代码窗口下被编译;“use”句使编译器按照库文件配置编译代码。 #define TCPCONFIG 1 #memmap xmem #use dcrtcp.lib main(){ sock_init(); for (;;) { tcp_tick(NULL);} }   sock_init()和tcp_tick()都是TCP/IP函数库的基本函数,前者为初始化TCP/IP协议栈函数,使协议栈开始处理入栈数据报;后者主要有两个用途:① 支持后台处理的最新信息;② 测试 TCP套接字的状态。   可以看到利用Dynamic C提供的TCP/IP协议包,用户可以轻松建立起TCP/IP通信。当通信建立以后,就可以在此基础上进行后续的进一步功能扩展,开展例如HTTP、 PPP等应用层的协议实现。 2.2 HTTP的实现   HTTP(超文本传输协议)服务器可使 HTML (超文本链接标示语言)页面,如Web页等和其它文件为客户端所使用。在Dynamic C中,HTTP由HTTP.LIB来负责实现。HTTP服务器实现的程序主体框架如下: #define TCPCONFIG 1 #memmap xmem #use "dcrtcp.lib" #use "http.lib" main(){ sock_init(); http_init(); tcp_reserveport(80); while (1) { http_handler();} }   用户可以根据自己的需要在此程序框架上添加构成WebServer的所有其它动态或静态元素(无论是否符合HTML标准)。限于篇幅,具体示例不再列出。 小 结   在建立起相应的硬件连接以后,就可以根据不同的硬件特点,选用不同的开发工具和开发语言进行WebServer的构架工作。本文给出了目前构架 WebServer的主要原理和方法,并给出Rabbit 2000系列芯片实现的具体应用,相信对读者的实际工作会有些帮助。至于采用其它芯片或方案的实现步骤及过程大同小异,读者可举一反三。[!--empirenews.page--]

    时间:2014-12-22 关键词: 嵌入式 嵌入式开发 实现 webserver

  • 22纳米有望在2011~2012年实现商用

    为了促进纳米电子学的发展,奥尔巴尼大学的纳米学院已经被授予半导体研究公司(Semiconductor Research Corporation, SRC)的领导地位。 这项在去年2月开始的为期3年、投资750万美元的计划由SRC以及纽约州共同投资,奥尔巴尼大学的纳米学院就是纽约先进互连科学和技术中心(NY CAIST)计划的基地。 除了奥尔巴尼大学内的纳米级科学以及工程学院(CNSE)之外,参与该项目的学术机构包括:哥伦比亚大学、科内尔大学、Lehigh大学、马萨诸塞州理工大学(MIT)、Penn State大学、Rensselaer工学院(RPI)、斯坦福大学、SUNY Binghamton大学、佛罗里达大学、马里兰大学、北德州大学、以及位于阿林顿和奥斯汀的德州大学。 作为NY CAIST计划的组成部分,规划的项目有27个,最终目标是为芯片制造商服务提供扩展铜以及低k介质缩小技术。 “因为互连性能正开始超越器件成为主宰芯片性能的关键因素,互连研究对于确保半导体器件工艺尺寸的持续缩小越来越重要,”在全球研究协作(Global Research Collaboration, GRC)担任互连以及封装研究的总监、英特尔公司的代理人Scott List表示。GRC是SRC的下属单位,负责缩小各种选项,以便把CMOS工艺传承至最终极限。 “在22纳米以下工艺尺寸,为了驱使芯片几何尺寸的缩小,必须缩小互连,但是,这种技术仅仅提供一半的解决方案。当我们评估像碳纳米管以及光学互连等选项的过程中,我们已经发现若干实现22纳米互连的可行选择。在向着缩小铜互连以及低k介质的方向发展的过程中,至关重要的是我们继续在与NY CAIST取得一道的进步基础上构建新的技术,”List表示。 研究人员指出,年复一年,芯片上的开关速度已经增长了几乎20%,而线宽缩小了30%,晶体管密度也增加了。然而,如果无法实现新型的互连材料、工艺、方法学和概念,这种芯片速度、晶体管密度持续增加而线宽持续缩小的步伐最终将减慢下来。 在奥尔巴尼大学内的纳米级科学以及工程学院的SRC以及NY CAIST的研究人员将携手开展交叉功能协作,涉及领域包括:缩小侧壁以及晶界散射,从而减小40纳米铜电阻系数;开发新一类厚度为几个原子的铜扩散势垒区;开发具有原子分辨率的测量掩埋接口的方法;在几个原子的规模上最优化低k介质中的空穴尺寸和结构,从而在提高速度的同时维持强度;掌握互连中存在的根本故障机制,以减少介质中的短路以及铜线中的开路。 研究工作将建立在NY CAIST过去三年期间SRC、GRC及其学术合作伙伴的研究工作基础之上,并增强NY CAIST的研究工作。 已经取得的成果包括:实证从铜线的边缘起可以把侧壁散射减少50%;实现了小于10个原子厚的扩散势垒;评估了新的基于光学以及碳纳米管的互连。 国际半导体技术路线图(The International Technology Roadmap for Semiconductors, ITRS)预计22纳米节点到2011-12年将实现商业化生产。 2007年9月,在一项相关努力中,SRC和美国商务部的国家标准和技术研究院(National Institute of Standards and Technology, NIST)发布了一项合作伙伴关系,以支持在纳米电子学领域的研究。 该计划是为了证明未来5-10年内下一代电路的可行性。 今年,NIST将为该努力捐助276万美元,届时与来自行业的资金结合起来,将提供接近400万美元的新的研究津贴。

    时间:2014-10-18 关键词: 实现 嵌入式处理器 商用 22纳米

  • 音频滤波器ESD/EMI保护的实现

    随着便携式和无线设备的日趋复杂化,此类设备越来越容易受到静电放电(ESD)和电磁干扰(EMI)的影响。尤其在立体声耳机、移动电话、便携式多媒体播放器、PDA或笔记本电脑等电子设备中,需要降低电磁干扰,以确保电子设备的高音频质量。 电磁干扰(EMI)由无线射频产生,对音频线路造成影响。同时,音频输入和输出又会使射频线产生失真。爱普科斯研制出一款新型组合式双重ESD/EMI音频滤波器(CA04F2FT5AUD010G),可有效降低寄生噪声,提高音频质量。该滤波器被置于0405双通道封装内,其特点是串联电阻低,并集EMI滤波和ESD保护于一体。   设计此款新型ESD/EMI音频滤波器需要将十个分立组件的功能集于同一块芯片上(图1)。由于此滤波器具有20MHz的截止频率和0.2Ω的低串联电阻,它在要求低通带衰减的应用中提供了良好的解决方案。对于所有四波段GSM频率制式(850/900/1800/1900MHz)、UMTS制式 (2.1GHz)、GPRS/WLAN和蓝牙频率(2.4GHz),当频率范围为200MHz至4GHz时,其衰减高于-20dB。在频率为900MHz 时,它的衰减值非常高,超过-60dB(图2)。   图2:插入损耗。 使用TVS和齐纳二极管的滤波器在音频信号路径上具有非常明显的非线性特征。因此,它们会大幅度增加总谐波失真度(THD)。相比较而言,爱普科斯生产的双重ESD/EMI音频滤波器具有低THD的特点,在1kHz时噪声值低于-100dB,因而,它处理超清晰的声音的能力极佳。   图3:超电压的双重保护。 ESD/EMI音频滤波器的设计还能对敏感的IC提供极好的ESD保护(IEC61000-4-2, 4级标准)。其内部采用双钳位结构,可将ESD脉冲从8kV降至70V(图3)。此外,ESD/EMI音频滤波器还具有非常稳定的陶瓷结构。即便经过 1000 ESD脉冲,双重式ESD/EMI音频滤波器仍能保持原有的高滤波性能。

    时间:2014-09-10 关键词: 电路设计 实现 音频滤波器 esd/emi

  • W78E516及其在系统编程的实现

    摘要: 近年来,在系统编程(ISP)技术的不断发展和成熟,使得硬件设计逐步软件化,硬件结构的通用性日益增强,系统设计、生产、维护、升级等环节都发生着深刻的变革。本文以WINBOND公司的W78E516为例介绍ISP器件的结构及其在系统编程原理。 关键字: W78E516在系统编程微控制器 使用传统方法对CPU重新编程存在诸多不便,在系统编程技术(以下简称ISP技术)的出现是对传统编程方法的突破。ISP(In System Programming)技术是指,在用户设计的目标系统中或印刷电路板上,为重新配置逻辑或实现新的功能,而对器件进行编程或反复编程的能力。ISP技术的出现和发展开创了数字电子系统设计技术新的一页。ISP技术无需编程器和较高的编程电压,打破了先编程后装配的惯例,形成产品后还可以在系统内反复编程,使具有MTP-ROM可多次编程或反复编程的微控制器的优越性得以更充分的发挥。尤其是在互联网时代,依据系统环境和需要,经调制解调装置(MODEM)、串行口或专用的编程接口就能够通过软件控制,实现系统远程升级和调试,提高产品的适应性,延长产品生存周期,经济效益显著。真正的可编程系统的时代即将到来。 一、 W78E516的结构 W78E516是一种8位微控制器,内部含有在系统可编程的MTP-ROM,用于系统更新。W78E516与标准的8052完全兼容。 1. 特征 (1) 全静态设计,最高工作频率为40MHz。 (2) 64KB APROM存储应用程序和4KB LDROM存储控制ISP操作的程序。2块存储器均为MTP-ROM。 (3) 512字节的片内RAM(包括256字节AUX-RAM,可由软件选择)内部数据RAM有512字节。它分成2个存储单元:256字节高速暂存和256字节辅存。这些地址有不同的确定方式: ① RAM 0H~127H:同8052一样直接或间接寻址,地址指针是被选中的寄存器单元中的R0和R1。 ② RAM 128H~255H:同8052一样只能间接寻址,地址指针是被选中的寄存器单元中的R0和R1。 ③ AUX-RAM 0H~255H:采用外部数据存储器的方式间接寻址,用MOVX指令,地址指针是选中寄存器单元的R0和R1以及DPTR寄存器。在CHCON寄存器中的第4位置位后,AUX-RAM有效,访问AUX-RAM使用“MOVX@Ri”指令。当执行内部程序存储器的指令时,访问AUX-RAM不会影响 P0,P2,WR和RD。AUX-RAM在复位后失效。 (4) 程序存储器和数据存储器可寻址空间范围为64KB。 (5) 4个8位双向口:P0~P3,1个4位双向多用途编程口P4。 (6) 3个16位的定时器/计数器:T0,T1,T2。T0和T1功能与8051相同。T2是一个16位定时器/计数器,它由T2CON配置和控制。T2能作为外部时钟计数器,也能作为内部定时器,这取决于T2CON的C/T2位的配置情况。T2有3种操作方式:清零、自动重写、波特率发生器。在清零和自动重写方式时,时钟频率与T0和T1相同。 (7) 具有一个全双工串行口。 (8) 具有6个中断源和2级中断能力。 (9) 内部电源管理:空闲方式和掉电方式,这两种方式可由软件选择。 (10) 具有编程后的编码保护功能。 2. 与ISP操作相关的特殊功能寄存器 (1) 在系统编程控制寄存器CHPCON(BFH)功能如表1所列。 表 1 BITNAME功能 7软件复位该位置1且FBOOTSL和FPROGEN都置为1时,微控制器复位,重新开始正常操作。读该位结果为逻辑1时,可以确认CPU处于F04KBOOT模式 6-保留 5-保留 4ENAUXRAM0:使AUX-RAM无效; 1:使AUX-RAM有效3 30必须置为0 20必须置为0 1EBPPRTSL程序地址选择。 1:装载程序位于64KB的APROM。4KB LDROM是重新编程的目标地址。 0:装载程序位于4KB的存储器。64KB的APROM是重新编程的目标地址 0FPROGENMTP-ROM编程使能。 1:使编程功能有效。微控制器进入在系统编程状态。在这种编程模式下,清除、编程、读操作在设备进入空闲模式后可以实现。 0:不能对ROM执行写操作 (2) 编程状态下MTP-ROM的控制字节寄存器SFRCN(C7H)功能如表2所列。 表 2 BITNAME功能 7-保留 6WFWIN选择ISP操作目标存储器。 0:对LDROM重新编程; 1:对APROM重新编程 5OENMTP-ROM输出使能 4CENMTP-ROM使能 3,2,1,0CTRL[3:0]ROM控制信号 (3) SFRAH,SFRAL:在系统编程状态下的目标地址。SFRAH包含地址的高位字节;SFRAL包含地址的低位字节。 (4) SFRFD:编程状态下MTP-ROM的编程数据。 二、 W78E516的在系统编程方法 1. ISP操作实现过程 微控制器通常执行APROM中的程序。如果APROM中的程序需要修改,用户需要通过设置CHPCON寄存器来激活在系统编程模式。在默认情况下,CHPCON是只读的,必须依次向寄存器中写入#87H和#59H,才能使CHPCON的写特性有效。激活CHPCON的写特性后,在其0位置位,进入在系统编程模式。ISP操作包括进入/退出在系统编程模式、编程、擦除、读等,它们是在CPU处于空闲模式时完成的,因此,设置CHPCON寄存器后使 CPU进入空闲模式,并由定时器中断的发生来控制执行每一种ISP操作的时间。定时器中断到来时,转入LDROM中执行相关的中断服务程序。第一次执行 RETI指令后, PC指针清零,指向LDROM中的00H。当APROM中的内容被完全更新后,将CHPCON的第0,1,7位设置为逻辑1,通过软件复位的方式返回 APROM执行其中的新程序。在应用程序需要频繁更新的情况下,这种在系统编程方式使工作简单而高效。 在默认情况下,上电复位后W78E516从程序中启动。在某些情况下,可以使W78E516从LDROM中启动。当APROM中的程序不能正常运行,W78E516无法跳到LDROM中执行ISP操作时,CPU进入F04KBOOT模式。在应用系统设计中一定要注意P2,P3,ALE,EA和 PSEN引脚在复位时的值,以避免意外激活编程模式或F04KBOOT模式。复位时进入F04KBOOT MODE时P4?3,P2.7,P2.6引脚电平及时序如图1及图2所示。 P4.3P2.7P2.6MODE XLLF04KBOOT LXXF04KBOOT W78E516处于在系统编程模式时,MTP-ROM可以被反复编程和检验。向 MTP-ROM中完整、正确地写入新代码后,新代码即被保护起来。W78E516有专用设置寄存器组(special setting re-gisters),其中包括安全性寄存器(security register)和公司/器件识别寄存器(company/device ID registers),处于编程模式时不能访问这些寄存器。安全性寄存器在LDROM空间的地址是0FFFFH,当它的各个位被从1编程为0后就不能再被改变,将它们重新置位的惟一方式是执行全部擦除操作,这样就能保证其安全性。[!--empirenews.page--] 一般情况下,具有ISP功能的微控制器一般都具备2块程序存储区(暂时称为A-ROM和B-ROM),其中A-ROM用于存储通常状况下的应用程序,B-ROM用于存储控制ISP操作的程序,向A-ROM中写入新代码。有些微控制器,A-ROM和B-ROM中的程序代码均能控制ISP操作,由特殊功能寄存器来选择其一,为设计人员提供了灵活的设计应用空间。针对不同类型的ISP器件,对CPU进行在系统编程的方法具有共同之处。 2 W78E516的 ISP功能特点 在MTP产品中,W78E516颇具特色。它在ISP功能方面具有突出的优点: (1) 开发灵活性。可由设计者自定任何编程通信协议,经计算机或简单工具,将要修改的程序通过任何I/O口或UART口送入单片机内,不能像其他具有ISP功能的芯片那样,而必须针对其特定引脚及特殊的TIMMING协议来实现。 (2) 操作连续性。市场上目前具有ISP功能的单片机在执行ISP操作时(在未带配件的情况下)必须停止其他操作;而有些应用希望此时UART或 TIMER/COUNTER等功能仍然能够运作。W78E516可以满足这种要求。因为在执行ISP操作时只是控制权从64KB APROM变换到4KB LDROM,故仍可由4KB中的程序来继续操作控制。 (3) 断电时具有存储数据能力。因W78E516拥有2块大小不同的闪速存储器,其中1块可用于存储断电后仍必须被单片机保留的数据,因此,设计者可减少外接EE2PROM芯片的线路与成本。 除具有上述特点外, W78E516在执行ISP操作时不需辅以任何配件,受到用户的欢迎。 三、 应用实例 此实例是在机车故障检测记录仪系统内对W78E516进行ISP操作的实验。这是一个由PC机和微控制器组成的主从式系统。 PC机经串行通信将新程序的二进制代码以数据形式下载,微控制器接收数据,由软件控制更新64KB APROM中的程序代码。实验中微控制器经RS-232接口接收数据并暂存于内部AUX-RAM中,不需扩展外部数据存储器,节省了板上空间。检测记录仪与PC机的通信采用RS-232标准,为简化硬件,只使用了该标准中的TXD、RXD以及地线3根连线,电平转换由MAXIM232专用芯片完成。 实现ISP操作的软件由两部分组成:一是微控制器部分(包括APROM和LDROM中的程序),用MCS-51汇编语言编写;二是PC机部分,由Microsoft Visual Basic开发而来,主要应用MSCOMM控件与W78E516通信,完成数据下载。 微控制器上电后一般从64KB APROM中启动。64KB APROM中,包括了在系统编程子程序,还有其他检测记录系统的子程序。微控制器必须读取拨码盘的输入,决定进入哪一种工作状态,是否进行在系统编程。值得注意的是,在写CHPCON寄存器时,应将其第4位置1,使AUX-RAM有效;64KB APROM中的程序应该始终包含图3流程所示的程序段,以使系统具有进入下一次在系统编程的能力。4KB LDROM中的程序主要作用是接收来自PC机的下载数据,并控制各项ISP操作。执行在系统编程时,利用SFRAL、SFRAH、SFRFD、SFRCN 这几个特殊功能寄存器,选择在系统编程的地址单元,准备待写入的数据,选择待执行的操作类型。当从F04BOOT模式启动时,软件复位失效,必须硬件复位。在系统编程的数据由在此期间仍能正常工作的串行通信口进入。这部分流程如图6所示。 PC机通过 RS-232串口发送数据。每一帧的前3个字节都为7EH,作为帧同步信号。随后2个字节内容均为帧指针,表明本帧数据的帧号。PC机在发送1帧数据后,等待单片机发回确认数据帧,该帧数据应包括数据接收正确与否的标志及接收到的数据的帧号。 根据本文介绍的方法,在机车故障检测记录仪系统内实现了对W78E516的在系统编程。 ISP技术高度的灵活性使同一种硬件结构能够实现多种系统功能,成为多功能硬件,减少了系统所需电路板的品种,简化了生产流程;多功能硬件还能够减少板上元件数目和系统电路板数目,使系统成本显著降低。在机车系统中要对各部分进行多种不同的测试,比如轴温、轴速以及车门的开关状态等等,以便了解机车的运行状况。在现阶段,处理这些模拟量或数字量需要设计生产多种不同的模块。应用ISP技术以后这一现状会得以改变:设计人员设计出包括微控制器、A/D和 D/A转换芯片、I/O口等在内的通用模块,将其安装到需要进行检测的各个部分,然后利用ISP技术把不同的应用程序下载到微控制器中,就可以完成各种不同的测试功能,其综合经济效益不可低估。此外,   ISP技术也为其他许多领域带来了变革。总之,在系统编程技术具有广阔的开发应用前景。MES 参考文献 1 华邦公司?在系统可编程系列(W78E系列)?世界电子元器件,1999(2) 2 黄正瑾?在系统编程技术及其应用?南京:东南大学出版社,1997  

    时间:2014-08-21 关键词: 嵌入式开发 实现 w78e516 系统编程

  • DSP器件为核心的嵌入式系统技术

    摘要:以DSP为信心的嵌入式系统具有实时性、利于并行处理等优点,这也是嵌入式系统中的重要技术。本文在讨论嵌入系统基本技术特征的基础上,比较详尽地介绍了DSP嵌入式系统的基本结构和技术特征,并对应用特性进行了讨论。 关键词:嵌入式系统 DSP 嵌入式系统的目的是提供一个以多任务和网络为信心,易于开发的复杂数字系统。从数字技术和信息技术的角度看,嵌入式系统已成为现代信息网络技术应用的基础技术,已成为现代工控领域的基本技术。 使用嵌入式系统技术,不仅可以实现硬件和软件的优化集成,更主要的是提供了使用 “数字基因技术”的基本工具。从计算机和信息网络技术发展的角度看,嵌入式系统标志着网络化计算机时代的到来,标志着计算机应用进入了“通用元素”化和 “数字基因”化发展的新阶段,因此,嵌入式系统在计算机应用具有里程碑的意义。 本文将讨论DSP内核嵌入式系统或芯片的基本技术特征,以及这种嵌入式系统的应用技术特点。 以DSP为核心的嵌入式系统 嵌入式系统实际上就是一个集成化的计算机系统。随着信息技术的发展,应用领域还对嵌入式系统提出了网络化功能,这就促使嵌入式系统向着更高的集成化方向发展。 嵌入式系统的发展,主要体现在芯片技术的进步,以及芯片技术限制下的算法与软件的进步上。对于嵌入式系统来说,核心是具有数据处理和系统管理能力的计算机系统,因此,只要是以处理器系统为核心的器件,都可以形成嵌入式系统。这就是说,使用具有强大数据处理功能的DSP器件也可以组成一个嵌入式系统,并且可以充分发挥DSP器件在数据处理方面的优势,改善嵌入式系统的实时操作特性。 所谓DSP嵌入式系统,实际上就是把DSP系统嵌入到应用电子系统中的一种通用系统。这种系统具有DSP系统的所有技术特征,同时还具有应用目标所需要的技术特征。DSP嵌入式系统不再是一个专用的DSP系统,而是一个完整的、具有多任务和实时操作系统的计算机系统,以这个计算机系统为基本,可以十分方便地开发出用户所需要的应用系统。 DSP器件特点 DSP器件是一种特别适合于进行数字信号处理运算的微处理器,其主要应用是实时快速地实现各种数字信号算法处理。按数据格式划分,DSP器件可以分为定点和浮点两种。 DSP芯片具有如下主要技术特性: 1)硬件上采用多总线哈佛(Harvard)结构,提高了数据的处理能力和速度。 2)指令执行采用流水作业(pipeline),具有较高的指令执行速度。 3)采用独立的硬件乘法/加法器(MAC),极大地提高了数据处理速度。 4)设置有循环寻址(Circular addressing)、位倒序(bit-reversed)等特殊指令,有处于实现高健壮性的实时系统。 5)内部具有独立的DMA总线控制器,通过DSP器件中一组或多组独立的DMA总线,可以实现程序执行与数据传输并行工作。目前,在不影响CPU工作的条件下,片内DMA速度已达1600Mbyte/s以上。 6)提供了多处理器接口,可以十分方便地实现多个处理器并行或串行工作,不仅可以提高数据处理速度,还为使用嵌入式子系统实现大型和复杂嵌入式系统提供了技术基础。 7)提供了JTAG(Joint Test Action Group)标准测试接口(IEEE 1149标准接口),便于DSP作片上的在仿真和多DSP条件下的调试。 由于DSP器件的上述技术特性,使得以DSP器件为核心的DSP系统具有如下几个主要技术特点: 1)数据处理速度快,具有良好的可编程实时特性。 2)硬件软件接口方便,可以十分方便地与其它数字系统或设备相互兼容。 3)开发方便,可以灵活地通过软件对系统的特性和应用目标进行修改和升级。 4)具有良好的系统健壮性,受环境温度以及噪声的影响较小、可靠性高。 5)易于实现系统集成或使用SOC技术,可以提供高度的规范性。 以DSP器件为核心的嵌入式系统基本硬件结构 典型的DSP嵌入式系统构成如图1所示。 在图1中,网络通信接口不仅提供了DSP嵌入式系统的网络通信硬支持,同时也提供了通过网络开发嵌入式系统的技术条件。在DSP嵌入式系统中,网络接口具有十分重要的作用,同时由于现代网络技术的发展,要求嵌入式系统中的网络接口必须能满足不同开发系统的要求,因此除了包含 IEEE1394-2(USB火线)外,还应当包含有传统的RS232和IEEE488接口,以及以太网接口和相应的TCP/IP协议。 从图1可以看出,如果不考虑用户应用电路,则DSP嵌入式系统就可以形成一个独立的通用高速数据处理系统,这个高速数据处理系统不仅具有数据处理、可编程开发和多DSP并行应用的特点,还具有强大的网络功能,可以完全满足信息网络的技术要求。 图2是一个DSP嵌入式系统和PLC形成的工业控制系统基本结构。从图2可以看出,如果DSP嵌入式系统的资源不能满足系统要求时,可以采用附加DSP系统或增加一个完整的DSP嵌入式系统的方法加以解决,而不需要从系统结构上进行大的改动。 DSP嵌入式系统的应用特性 DSP嵌入式系统最重要的技术特性就是具有相当强大的数据处理功能,从现代信息技术角度看,在系统中嵌入DSP的目的,就是为了增强系统的信息处理能力。因此,DSP嵌入式系统与微处理器嵌入式系统在应用特性上有很大的不同。 并行操作 为了提高系统的数据和信息处理能力,DSP嵌入式系统可提供许多重要的数据处理算法,其中一个重要的内容就是并行算法。这里的并行算法包含软件和硬件两个方面的概念。从软件的角度看,在使用微处理器的嵌入式系统中,并行算法的实现往往比较复杂,而对于DSP嵌入式系统,由于系统中DSP器件中采用的哈佛结构、浮点运算以及并行乘加运算,所以可比较容易地实现并行算法和一些并行系统操作的软件编程。从硬件角度看,DSP器件的多总线结构和片同DMA电路与局部总线,为并行算法与并行操作提供了硬件支持。 直接终端操作 使用嵌入式系统的一个重要目的,就是要用简单的方法和技术实现复杂的系统。凭借DSP强大的数据和信息处理功能,使其具有直接处理终端信号和信息的能力,因此,在DSP嵌入式系统中,可以实现终端的直接操作。例如在图2中,可以直接利用DSP系统处理某个PLC测量的模拟信号,或者直接处理一组PLC采集的逻辑信号所携带的控制信息。这样就能大大降低对PLC的要求,即充分利用DSP嵌入式系统资源,提高系统的性能和技术指标,又可以降低系统的整体成本。[!--empirenews.page--] 数据流量大 由于采用高度集成,在简化终端电路复杂程度的同时,也带来了数据流量大的问题,例如,如果对一个终端需要进行比较复杂的滤波、信息提取和识别,终端设备只起到数据采集的作用就可以了,这时的数据流量将会远大于仅完成设置和传递系统操作命令所需要的数据流量。如果系统中有几个这样的终端,则会使数据处理流量远大于DPS系统所具有的处理能力。因此,一般采用DSP嵌入式系统,必须注意不要增加数据流量,而是充分利用DSP的数据处理能力,强化系统的管理、操作以及远程通信功能。此外,还可以使用廉价的DSP器件形成低价位的DSP嵌入式系统,使信息处理成为网络终端的基本功能,从而形成具有信息处理能力的嵌入式系统单元,再利用这些智能单元组成复杂的智能网络。 结束语 嵌入式系统已经与SOC技术融合在一起,成为新一代信息技术的基础。嵌入式系统中可以采用微处理器、单片机或DSP,其中DSP嵌入式系统不仅具有其他微处理器和单片机嵌入式系统的优点和技术特性,而且还可使用并行算法操作,具有高速数字信号处理的能力,为实现系统的实时性提供了有力的支持。 与传统的单片机系统(即单板机、PC机等)相比较,嵌入式系统更有利于网络应用和智能系统应用,由于嵌入式系统可以实现单片机,因此使得嵌入式系统几乎可以用于任何一种数字系统应用场合。嵌入式系统,特别是DSP单片机系统已经成为现代电子技术、计算机技术和信息网络技术的重要支柱。

    时间:2014-08-20 关键词: 嵌入式开发 实现 w78e516 系统编程

  • 无线通信SCADA系统的实现与应用

      摘要:介绍了城市路灯无线通信SCADA系统的实现方法,包括监控中心组成与功能、无线通信方式及RTU硬件电路模块设计。 关键词:SCADA系统 测控系统 电台通信 1 SCADA系统的特点 SCADA(Supervisory Control and Data Acquisition)系统即监视控制与数据采集系统,是以计算机为基础的监测控制与调度管理自动化系统,能实现远程数据采集、设备控制、测量、参数调节以及信号报警等各项功能,可广泛应用于电力、水利、石油、化工、环保和市政等众多领域。 SCADA系统一般采用分散式测控、集中式管理的方式,整个系统由监控中心、若干个分散的远程测控终端RTU(Remote Terminal Unit)和通信介质三部分组成。监控中心又称主站,是SCADA系统的核心,负责控制管理整个系统的运行;RTU又称外围站点,是采用微处理器或DSP 的可独立运行的智能测控模块,完成各种远端现场数据的采集与处理、现场执行机构的控制以及与远程控制中心的通信,具有易扩展性和易维护性特点;通信介质根据实际需求和应用对象的不同多种实现方式,下面稍作分析。 2 通信介质的选取 数据传输介质分为有线和无线两类。有线传输方式如:电力线载波、RS-485现场总线和PSTN公用电话网等。无线传输方式如:VHF/UHF无线电台 、ISM扩频电台、GSM移动电话网以及卫星通信网等。每种方法各种其特点。 电力线载波利用现有的供电线路不需另铺专用通信线路,但电力线固有干扰较大,且载波信号只能在一个配电变压器区域内传送,通信跟踪较短;RS-485现场总线具有通信效率高、可靠性好等优点,但用于大容量系统时铺设专用线路工程造价太高。 PSTN公用电话网和GSM移动电话网的初期投入费用少,无盲区覆盖,但日积月累的运营费用极高;ISM(工业科学医疗用途)频段的扩频电台(2.4GHz)及微波(4GHz以上)可用于远距离、高性能传输,但价格昂贵。 VHF/UHF无线电台:传输距离较远,只需维护费用而无运营费用,系统使用及站点扩展很方便,尤其适用于大容量分散式SCADA系统,其性能价格比高,但必须向当地无线电管理部分申请相应频点才可使用。 由此可见,有线与无线方式各有利弊,有线通信的优势在于数据传输的可靠性,但当RTU分散时测控系统辅设专用线路造价过高;而无线通信则在大容量 SCADA系统中优势明显。城市路灯监控系统正是采用VHF/UHF无线电台通信方式,已在南京、福州、长春等省会城市连续常运行几年且客户反映好。实践证明,只要解决好数据传输的可靠性这一关键问题,就能保证整个无线通信SCADA系统正常可靠运行。 3 城市路灯无线通信SCADA系统的设计 该系统总体结构主要由三部分构成:监控中心、若干个外围站RTU及VHF/UHF无线电台进行数据通信。监控中心选用TAIT 855/856基地台,外围站选用Motorola GM300车载电台。城市路灯无线通信SCADA系统组网结构如图1所示。 3.1 监控中心组成和功能 城市路灯无线通信SCADA系统的控制中心主要由主控机、后备机、服务器、大屏幕多媒体投影机、电台、铁塔及天线等组成。 主控机与服务器按Client/Server结构连网。主控机作为系统的客户机,由一台Intel工控机构成,用VB语言编程,主要功能实现人机界面并通过无线Modem与电台连,向RTU发送控制指令,接收返回的检测数据和状态参数。为提高系统的可靠性,在该系统中采用另一台Intel工控机作为后备机对主控机进行备份。 用一台IBM服务器作无线通信SCADA系统的数据库服务器,RTU采集到的数据经主控机处理后存放在数据服务器中,其它管理系统经授权可以直接访问该服务器,很容量实现系统间的数据共享。 监控中心主要完成以下功能: (1)大屏幕多媒体投影机动态显示SCADA系统中每一个RTU在城市地图中所处位置及该站点的工作状态和实时参数(包括各条线路的交流电压、电流、功率、电度表读数、亮灯率等)。 (2)根据该城市所处经纠度及日出日落时间,制定出对应全年的每日开/关灯时间曲线以实时控制路灯的通/断;另外可由控制人员结合具体情况,修改开/关灯时间,并传送给RTU以进行控制。 (3)定时巡检/定点检测RTU,并通过无线Modem获取RTU返回的开关状态、数据参数及报警码。 (4)在巡检过程中,若发现故障或参数越限,可进行声光报警,并在大屏幕上动态显示以该站点位置为中主的放大地图及相应的工况、实测数据及故障形式。 (5)具有节省能源功能,实行全夜灯/半夜灯两种工作方式,由控制人员针对每条线路决定是否采用半夜灯方式及任意调节半夜灯的起止时间。同时还具有防窃电监测功能:当检测到某一支路电流值大于正常运行值时,若同一RTU中其它支路电流值正常(表明A/D芯片工作正常),则该支路存在窍电现象。 (6)采用虚拟仪表方法显示电压表、电流表、电度表等仪表形状,利用VB控件Meter在仪表盘上直观显示模拟数据量的动态变化。 (7)定时对所有RTU进行校时,确保外围站时间准确性。 (8)数据处理、存储及报表打印功能。 3.2 无线通信 3.2.1 通信介质 无线通信SCADA系统监控中心与RTU之间采用VHF/UHF无线电台进行数据传输,工作频率为203~450Hz(须向当地无线电管理部门申请相应的频点),数据通信的调制方式为FSK,传送速率为300~1200bps。RTU站点间分布较散,与监控中心距离较远,因此通信体制采用大区制。监控中心选用TAIT 855/856基地台,发射功率为45W,工作在全双工方式,覆盖范围与高增益全向天线铁塔的高度有关,半径可达几十公里。RTU采用Motorola GM300车载电台,配以定向天线,发射功率为25W,工作在半双工方式。 3.2.2 通信方式 监控中心采用广播方式或点对点方式向RTU发送命令。采用广播方式时,RTU只接收命令并执行,如校对时间、修改开/关灯时间等命令;采用点对点方式时,如遥测、遥控等命令,RTU先进行站点编号确认,若是则根据命令格式执行相应操作,如控制路为开/关、向监迭中心返回电流、电压、开关状态、故障码数据帧等。 3.3 外围站RTU结构模块设计 无线通信SCADA系统的外围站RTU结构图如图2所示。 RTU主要由单片机测控系统组成,包括数据采集处理及A/D转换电路、键盘显示电路、时钟电路、路灯全夜灯/半夜灯控制电路、无线通信电路。外围站都可独立运行,即使因通信故障等原因无法与监控中心联系,也可单独完成路灯系统的日益监控。 单片机测控系统采用80C31作为CPU,27C256作为EPROM,62256作为RAM,在地址译码电路中采用74LS138,P2.7分别接 62256的片选信号(为零选中)及74LS138管脚G1(为1选中),P2.4、P2.5、P2.6分别接74LS138管脚A、B、C,输出片选信号控制多路开关、ICL7109、DS12887、74HC245、液晶显示。 (1)数据采集及A/D转换电路 RTU实时测量参数包括线路的电压、电流、电度表读数等。该模块模拟输入信号有三相交流电压UA~UC。线路总电流IA~IC,各支路电流(本系统最多可检测8条支路)I1A~I1C、…、I8A~I8C,信号经V/I变送器、多路开关(4051%26;#215;4片)、信号处理电路(包括对交流信号整流、滤波等变换)后送入双积分式A/D转换器ICL7109,转换成十二位二进制数,其中低八位D1~D8与P0.0~P0.7相连,高四位D9~D12 与P0.0~P0.3相连,CPU通过控制高/低字节使能端HBEN、LBEN分别从数据总线上读取高四位及低八位数据。 (2)键盘显示电路 采用液晶显示。键功能主要有:设置站号、时间、各支路电流变化值、电流/电压调零校正、全夜灯/半夜灯模式,巡检/定点检测每一支路参数等。 (3)时钟电路 采用时钟芯片DS12C887提供精确时钟信号,包括年、月、日、时、分。可通过手动方式修改时间,也可由监控中心统一校时。 (4)路灯开/关电路 可通过固化在EPROM中的每日开/关灯时间自动执行该站点路灯线路的通/断,也可通过手动设置方式或由监控中心进行遥控来实现线路通/断。 (5)无线通信电路 由调制/解调芯片TCM3105将接收的模拟载波信号解调为数字信号传给CPU,将需发送的数字信号调制成模拟载波信号并通过GM300车载电台、定向天线与监控中心进行数据传送。 4 路灯无线通信SCADA系统实现的注意事项 采用VFH/UFH电台通信的城市路灯无线通信SCADA系统已经连续几年正常运行。经验表明,只要解决好数据无线传输的可靠性问题,在城市大容量监控系统中该方法明显优于有线传输方式,性能价格比高,且可方便地任意扩展RTU。笔者认为在设计调试安装过程中还需要注意以下几方面: (1)尤其要重视无线信号的场强测试。在外围站安装前,由监控中心基地台发送信号,每一个RTU安装处都要进行场强测试,应无明显的同频干扰和异频互调干扰,信号电平应在20dB以上。若某个RTU不能满足,须改变其地址;当大部分 RTU都不能满足要求时,必须改变无线电台的工作频点。 (2)不能选择过高的通信波特率,否则极易引起丢码现象。 (3)在A/D转换电路调试中发现,ICL7109芯片引脚17(TEST)、27(SEND)不能悬空,应与26(RUN/HOLD)同接+5V。否则 A/D转换数据经常会出现不稳定现象。 (4)用于测量三相电压的V/I变送器不能直接装在主板上,否则极易受雷击而烧毁主板。 (5)在多山地区若无线信号受影响可设立中断站。

    时间:2014-07-10 关键词: 无线通信 scada 实现

首页  上一页  1 2 3 4 5 6 7 8 9 10 下一页 尾页
发布文章

技术子站

更多

项目外包