当前位置:首页 > 实现
  • 新能源汽车2014年销售或突破8万辆 实现3-4倍增长

    [摘要] 随着今年补贴落实,各地打破地方垄断的前提下,新能源汽车的总销量有望升至6万-8万辆,乘用车将达到3万辆规模,3-4倍于去年。   2013年9月17日,四部委针对新能源汽车联合下发的文件,为新能源汽车量产和应用奠定了政策基础:明确了混合动力、纯电动轿车和大巴的补贴额度,补贴范围也扩展到全国,各地政府推广外地品牌的比例不低于30%;为鼓励高能效,补贴标准也从原来的”电池容量”改为”续航里程”。在随后的11月26日,四部委又正式批复确定23个城市和5个省份城市群成为首批新能源汽车示范城市。   有望实现3-4倍增长   2013年,国内纯电动汽车产量达到14235辆,比2012年增长48.98%。其中奇瑞产量最多,以5767辆占比40%;排在第二的上海华普生产出2511辆,占比18%。产量排在前10的企业,还有北汽、长安、江淮、比亚迪、上汽、东风等中国企业。   有业内人士分析认为:”随着今年补贴落实,各地打破地方垄断的前提下,新能源汽车的总销量有望升至6万-8万辆,乘用车将达到3万辆规模,3-4倍于去年。”   公车采购扶持新能源   去年11月25日,中共中央、国务院颁布的《党政机关厉行节约反对浪费条例》,也称为新能源汽车”落地”的一大助推器。该条例明确规定公务车实行政府采购,并且优先选用新能源汽车。   新一轮的公车改革中最引人瞩目的关键词,莫过于”国产”和”新能源”,公务车向新能源车型倾斜不仅有利于节能减排,也将对汽车行业产生重大的扶持、引导和示范效应。   比亚迪”秦”   作为自主知识产权与国产新能源汽车的首吃螃蟹者,比亚迪通过”秦”证明了自己完整、高效的新能源车型技术研发和生产体系。秦用发动机和电机驱动,纯电动可行驶70公里,百公里加速仅5.9秒。   比亚迪在电池领域的技术积累,也彻底解决了电动汽车充电不便的困扰——可用社区充电设施或快充设备充电,普通家用电源插座也能充电。通过回收制动能量,”秦”还可实现循环充电1万次,电池寿命甚至高过了整车,预计秦在各地3年内的推广规模将超过30万辆。 比亚迪秦   北汽切入公用项目   北京汽车目前已在通州、大兴等区县投放1000辆电动出租车,累计运营里程超过1300万公里,单车最高运营里程10万公里,单车单日最高行驶里程300公里,为进入私人购买领域作好了准备。   据北汽新能源汽车技术中心副主任李玉军透露:”在北京即将于2月举行的2014年首次摇号中,新能源小客车的个人申请已经有655个。”而今年北京的新能源汽车配额指标为2万个,这意味着首批申请人无须摇号即可直接买到新能源车。   长安逸动混动版下月上市   2008年底,长安就已完成新能源汽车的生产及销售布局,重庆市政府当时就采购了10辆长安杰勋混合动力汽车,投入新能源汽车的示范运行。目前,长安已为国内10多个城市提供了数千辆新能源汽车。今年2月,长安将推出综合油耗仅5.4L的逸动混合动力版,并将在年中推出纯电动车型。

    时间:2014-01-17 关键词: 新能源 实现 突破 增长

  • 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纳米

  • 一种基于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模块

  • 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 系统编程

  • 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 系统编程

  • 嵌入式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

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

    触摸屏驱动程序的设计和实现 嵌入式设备触摸屏按其技术原理可分为五类:矢量压力传感式、电阻式、电容式、红外线式和表面声波式。其中电阻式触摸屏在嵌入式系统中用的较多,电阻式触摸屏可分为四线、五线、七线等几种。一般来说,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 关键词: 触摸屏 嵌入式开发 实现 设计 驱动程序

  • 嵌入式设备鼠标接口的设计与实现

    摘要:分析了PS/2鼠标的接口和通信协议,介绍了PS/2鼠标与单片机的接口设计方法,配合点阵LCD显示器,实现了嵌入式设备的图形化人机接口(GUI)。 关键词:PS/2接口 双向同步串行协议 GUI 当前嵌入式系统技术已得到了广泛应用,但传统嵌入式系统的人机接口多采用小键盘操作的文本菜单方式,用户操作较为不便。本文介绍了一种利用PS/2接口鼠标,在点阵LCD的单片机系统上实现图形化用户界面的方案。用窗口菜单和图形按钮取代了传统的键盘操作,具有成本低、效果好等特点,具有很强的实用性。 1 PS/2接口和协议 1.1 接口的物理特性 PS/2接口用于许多现代的鼠标和键盘,由IBM最初开发和使用。物理上的PS/2接口有两种类型的连接器:5脚的DIN和6脚的mini-DIN。图1就是两种连接器的引脚定义。使用中,主机提供+5V电源给鼠标,鼠标的地连接到主机电源地上。 1.2 接口协议原理 PS/2鼠标接口采用一种双向同步串行协议。即每在时钟线上发一个脉冲,就在数据线上发送一位数据。在相互传输中,主机拥有总线控制权,即它可以在任何时候抑制鼠标的发送。方法是把时钟线一直拉低,鼠标就不能产生时钟信号和发送数据。在两个方向的传输中,时钟信号都是由鼠标产生,即主机不产生通信时钟信号。 如果主机要发送数据,它必须控制鼠标产生时钟信号。方法如下:主机首先下拉时钟线至少100μs抑制通信,然后再下拉数据线,最后释放时钟线。通过这一时序控制鼠标产生时钟信号。当鼠标检测到这个时序状态,会在10ms内产生时钟信号。如图3中?A时序段。主机和鼠标之间,传输数据帧的时序如图2、图3所示。 2 PS/2鼠标的工作模式和协议数据包格式 2.1 PS/2鼠标的四种工作模式 PS/2鼠标的四种工作模式是:Reset模式,当鼠标上电或主机发复位命令?0xFF给它时进入这种模式;Stream模式?鼠标的默认模式,当鼠标上电或复位完成后,自动进入此模式,鼠标基本上以此模式工作;Remote模式,只有在主机发送了模式设置命令?0xF0后,鼠标才进入这种模式;Wrap模式,这种模式只用于测试鼠标与主机连接是否正确。 2.2 数据包结构 PS/2鼠标在工作过程中,会及时把它的状态数据发送给主机。发送的数据包格式如表1所示。 表1 鼠标发送的数据包格式   Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 Byte1 Y overflow X oberflow X sipn bit X sign bit Always 1 Middle Btn Right Btn Left Btn Byte2 X Movement Byte3 Y Movement Byte4 Z Movement Byte1中的Bit0、Bit1、Bit2分别表示左、右、中键的状态,状态值0表示释放,1表示按下。Byte2和Byte3分别表示X轴和Y轴方向的移动计量值,是二进制补码值。Byte4的低四位表示滚轮的移动计量值,也是二进制补码值,高四位作为扩展符号位。这种数据包由带滚轮的三键三维鼠标产生。若是不带滚轮的三键鼠标,产生的数据包没有Byte4?其余的相同。 3 设计与实现 3.1 接口设计 因为PS/2鼠标接口采用双向同步串行协议,时钟脉冲信号?以下皆称CLOCK总是由鼠标产生。因此,可以考虑这种方案:鼠标的CLOCK接主机的一外中断线,数据线?以下皆称DATA接主机的某一I/O口线,如图4所示。 在主机程序中,利用每个数据位的时钟脉冲触发中断,在中断例程中实现数据位的判断和接收。在实验过程中,通过合适的编程,能够正确控制并接收鼠标数据。但该方案有一点不足,由于每个CLOCK都要产生一次中断,中断频繁,需要耗用大量的主机资源。 由于鼠标与主机之间以双向同步串行协议传送数据,若不考虑CLOCK,仅考虑DATA,则其数据帧的时序与单片机的UART异步串行时序类似。所以,采用了另一种方案:鼠标的CLOCK仍旧接主机的外中断,但鼠标的DATA接UART的接收脚?RxD。参照图4? DATA改接RxD。在初始化过程中,主机利用CLOCK的外中断和RxD脚的I/O口线功能实现数据的传输。初始化完成后,切换到RxD功能?即UART的接收引脚功能。因为鼠标已处于Stream模式的工作状态,这时鼠标能主动发送数据。这样,主机可以在每收到一帧数据时才中断一次。中断次数大大降低,减少了主机资源的耗用。 不过,在此方案中,必须实现另一个功能:主机波特率的自适应。因为PS/2接口的鼠标一般工作在10kHz~20kHz时钟频率。不同厂家制造的鼠标工作的时钟频率不同。嵌入设备主机要做到与不同鼠标的波特率同步和自适应,才能够正确接收鼠标传送来的数据。波特率的自适应是这样实现:鼠标上电自检时会产生一串时钟脉冲,利用鼠标时钟脉冲产生的中断,结合主机的定时器测量时钟脉冲周期,可以得出所用鼠标的时钟频率,进而求出波特率。通过设置相应的波特率寄存器,实现了波特率的自适应。 3.2 软件实现 软件实现原理框图如图5所示。 (1)鼠标初始化 最简单的初始化就是当鼠标上电自检完成后,主机给鼠标发送一个使能鼠标数据传送命令字节(0xf4),鼠标就会在默认设置状态下工作。主机也可实现自定义初始化,如:复位三次(Snd_CMD(0xff),Snd_CMD(0xff),Snd_CMD(0xff);设置采样率:Snd_CMD(0xf3),Snd_CMD(0x0a);设置解析度(2点/毫米):Snd_CMD(0xe8),Snd_CMD(0x01);设置缩放比例(1:1):Snd_CMD(0xe6);使能鼠标数据传送:Snd_CMD(0xf4)。鼠标每收到一个命令字节都会给出一个应答字节 (0xfa)。 (2)两种方案的实现过程 两种方案的软件实现过程基本相同。只是后一种方案中,初始化时还要实现主机波特率的自适应,关闭时钟脉冲中断和打开串口中断。此后主机利用UART的接收功能接收鼠标数据。 (3)图形化人机接口(GUI)的实现 在点阵式LCD显示屏上实现图形化的人机接口界面,主要有两个方面:一个是菜单图标的实现;另一个是鼠标光标的实现。实现菜单图标,显示屏一般工作在图形显示模式。菜单图标有正常显示状态和反显状态,它们都用函数实现:void Draw_ICON(signed int xICON, signed int yICON,unsigned char *pDatICON)。xICON?yICON是图标所在位置的左上角坐标值,pDatICON是各个图标及其不同显示状态的点阵码值。反显状态是当图标被光标滑到或点取时才显现的。实现鼠标光标,又分两种情况。一种是单层显示的LCD,只能由程序画出鼠标光标。但是,当光标移动较快时,画出光标的点阵图形需要耗用较多的主机资源。另一种是有双层显示和光标功能的LCD,只需程序控制它的光标移动位置,无需程序画出光标的点阵图形,因而耗用主机资源较少,实现起来效果较好。 两种方案简单、明了,容易实现,都已在实验中得到验证。并且,后一种方案已在某一仪表系统中得到成功应用。总体来说,随着嵌入式处理器性能的不断提高,在嵌入设备中接入鼠标,既可灵活使用,也可减少因接入许多按键而占用的口线数,还能使LCD的图形化显示界面更美观、更人性化。

    时间:2014-04-25 关键词: 嵌入式 实现 设计 总线与接口 鼠标接口

  • 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总线 总线与接口

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

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

    一、问题背景: 大部分的应用运维工作随着服务器数量和产品数量的增长而增加,而运维人数的不足导致单个运维人员所承担的工作任务较为繁重,同时运维工作的不标准、无自动化使得应用运维任务十分复杂,耗费的大量的人员成本、时间成本和沟通成本。 应用运维工作说白了大体可以分为两种情况: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 关键词: 实现 存储技术 通用应用 运维管控

  • uC/OS-II在ARM系统上的移植与实现

    摘要:使用ARM公司提供的ADS 开发工具,将uC/ OS - II 移植到ARM 处理器上,并将移植结果应用在跑马灯和数码管的实现上,运行正常,表明移植成功. 关键词:uC/ OS - II ;ARM;移植 0  引言 在开发嵌入式系统时,一般选择基于ARM 和uC/ OS - II 的嵌入式开发平台,因为ARM 微处理器具有处理速度快、超低功耗、价格低廉、应用前景广泛等优点[1 ] . 将uC/ OS - II 移植到ARM 系统之后,可以充分结合两者的优势. 如果一个程序在一个环境里能工作,我们经常希望能将它移植到另一个编译系统、处理器或者操作系统上,这就是移植技术.移植技术可以使一种特定的技术在更加广泛的范围使用,使软件使用更加灵活,不局限于某一条件.uC/OS - II 是由Jean J . Labrosse 先生编写的完整的可移植、固化、裁剪的占先式实时多任务内核.uC/ OS - II 的源代码完全开放,这是其他商业实时内核无法比拟的[2 ] . 它是针对嵌入式应用设计的,在设计之初就充分考虑了可移植性,它的大部分源代码都是用高可移植性的ANSIC 编写的[3 ] . uC/ OS - II可以移植到从8 位到64 位的不同类型、不同规模的嵌入式系统,并能在大部分的8 位、16 位、32 位、甚至64 位的微处理器和DSP 上运行. 由于uC/ OS - II是一个实时操作系统,所以如果将它嵌入到ARM处理器上,就能够进一步简化ARM系统的开发. 图1  uC/ OS - II 文件体系结构 [b]1  uC/ OS - II 的移植 [/b] uC/OS - II 的文件系统结构包括核心代码部分、设置代码部分、与处理器相关的移植代码部分[4 ] . 结构如图1 所示.其中最上边的软件应用层是uC/ OS - II 上的代码. 核心代码部分包括7 个源代码文件和1 个头文件. 功能分别是内核管理、事件管理、消息队列管理、存储管理、消息管理、信号量处理、任务调度和定时管理. 设置代码部分包括2 个头文件,用来配置事件控制块的数目以及是否包含消息管理相关代码. 而与处理器相关的移植代码部分则是进行移植过程中需要更改的部分,包括1 个头文件OS CPU. H ,1 个汇编文件OS CPU A. S 和1 个C 代码文件.实际上将uC/ OS - II 移植到ARM 处理器上,需要完成的工作主要是以下三个与体系结构相关的文件:OS CPU. H ,OS CPU. C 以及OS CPU A. S[5 ] . 1. 1  OS CPU. H 的移植 文件OS CPU. H 中包括了用# define 语句定义的与处理器相关的常数、宏以及类型. 移植时主要修改的内容有:与编译器相关的数据类型的设定;用#define 语句定义2 个宏开关中断;根据堆栈的方向定义OS STK GROWTH等. 在将uC/ OS - II 移植到ARM 处理器上时,首先进行基本配置和数据类型定义. 重新定义数据类型是为了增加代码的可移植性,因为不同的编译器所提供的同一数据类型的数据长度并不相同,例如int型,在有的编译器中是16 位,而在另外一些编译器中则是32 位. 所以,为了便于移植,需要重新定义数据类型,如INT32U 代表无符号32 位整型. typedefunsigned int INT8U ,就是定义一个8 位的无符号整型数据类型. 其次就是对ARM 处理器相关宏进行定义,如ARM处理器中的退出临界区和进入临界区的宏定义,退出临界区宏定义[5 ] : # define OS EXITCRITICAL () ARMDisable Int ( ) / / 关中断,进入临界区宏定义# define OS ENTER CRITICAL ( ) AR2MEnableInt () / / 开中断. 最后就是堆栈增长方向的设定. 当进行函数调用时,入口参数和返回地址一般都会保存在当前任务的堆栈中,编译器的编译选项和由此生成的堆栈指令就会决定堆栈的增长方向[6 ] ,定义为# define OS STK GROWTH 1. 图2  堆栈增长方向 1. 2  OS CPU. C 的移植 OS CPU. C 的移植包括任务堆栈初始化和相应函数的实现. 在这里,共有6 个函数:OSTaskStkInit( ) , OSSTaskCreateHook ( ) , OSTaskDelHook ( ) , OS2TaskSwHook( ) ,OSTaskStatHook ( ) , OSTimeTickHook () . 其中后面的5 个HOOK函数又称为钩子函数,主要是用来对uC/ OS - II 进行功能扩展. 这些函数为用户定义函数,由操作系统调用相应的HOOK函数去执行,在一般情况下,他们都没有代码,所以实现为空函数即可. 而函数OSTaskStkInit ( ) 对堆栈进行初始化,在ARM 系统中,任务堆栈空间由高到低依次为PC ,LR ,R12 ,R11 , %26;#8943;,R1 ,R0 ,CPSR ,SPSR. 在进行堆栈初始化以后,OSTaskStkInit ( ) 返回新的堆栈栈顶指针. 1. 3  OS CPU A. S 的移植 OS CPU A. S 文件的移植需要对处理器的寄存器进行操作,所以必须用汇编语言来编写. 这个文件的实现集中体现了所要移植到处理器的体系结构和uC/ OS - II 的移植原理[6 ] . 它包括4 个子函数:OSStartHighRdy() , OSCtxSw() , OSIntCtxSw() ,OSTick2ISR() . 其中难点在于OSIntCtxSw() 和OSTickISR() 函数的实现,因为这两个函数的实现与移植者的移植思路以及相关硬件定时器、中断寄存器的设置有关.在实际的移植工作中,这两处也是比较容易出错的地方. OSIntCtxSw( ) 函数由OSIntExit ( ) 函数调用,而OSIntExit () 函数又由OSTickISR() 调用. OSIntCtxSw()函数最重要的作用就是它完成在中断ISR 中直接进行任务切换,从而提高了实时响应的速度. 它发生的时机是在ISR 执行到OSIntExit ( ) 时,如果发现有高优先级的任务因为等待time tick 的到来获得了执行%26;#8226; 7 2 %26;#8226; 第4 期李学桥等:uC/ OS - II 在ARM系统上的移植与实现的条件,就可以马上被调度执行,而不用返回被中断的那个任务之后再进行任务切换. 实现OSIntCtxSw() 的方法大致也有两种情况[7 ] :一是通过调整SP 堆栈指针的方法,根据所用的编译器对于函数嵌套的处理,通过精确计算出所需要调整的SP 位置来使得进入中断时所作的保护现场的工作可以被重用. 二是设置需要切换标志位的方法,在OSIntCtxSw( ) 里面不发生切换,而是设置一个需要切换的标志,等函数嵌套从进入OSIntExit ( ) = > OS ENTER CRITI2CAL() = > OSIntCtxSw( ) = > OS EXIT CRITICAL() = > OSIntExit ( ) 退出后,再根据标志位来判断是否需要进行中断级的任务切换. 其次是对OSTickISR() 修改.OSTickISR() 首先在被中断任务堆栈中保存CPU 寄存器的值,然后调用OSIntEnter () . 随后调用OSTimeTick() ,检查所有处于延时等待状态的任务,判断是否有延时结束就绪的任务. 最后调用OSIntExit ( ) . 如果在中断中(或其他嵌套的中断) 有更高优先级的任务就绪,并且当前中断为中断嵌套的最后一层,OSIntExit ( ) 将进行任务调度. 如果进行了任务调度,OSIntExit () 将不再返回调用者,而是用新任务的堆栈中的寄存器数值恢复CPU 现场,然后实现任务切换. 如果当前中断不是中断嵌套的最后一层,或中断中没有改变任务的就绪状态, OSIntExit ( ) 将返回调用者OSTickISR ( ) ,OSTickISR() 返回被中断的任务. 最后就是退出临界区和进入临界区函数. 进入临界区时,必须关闭中断,用ARMDisableInt () 函数实现. 在退出临界区的时候恢复原来的中断状态,通过ARMEnableInt ( ) 函数来实现[7 ] . 至于进行任务级上下文切换,则是由汇编子程序OSCtxSw 实现. [b] 2  在ARM系统上的实现 [/b] 以跑马灯和数码管为例,说明uC/ OS - II 的移植过程:跑马灯是4 个小灯轮流变明变暗,很方便看出效果. 跑马灯在日常中使用很多,比如状态栏跑马灯、文字跑马灯、图片跑马灯、单片机跑马灯等[8 ] . 本文采用的是单片机跑马灯. 实现单片机跑马灯的程序中,只有地址口为低电平(接地) 时,发光管才会亮. 所以只要循环控制地址口的各个引脚的电平高低变化就可使LED 循环点亮:首先是全不亮,接着第1 个灯亮,第2 个灯亮,第3 个灯亮,第4 个灯亮,第5 个灯亮,最后所有的灯一起亮. 笔者使用6 个共阳极LED 数码管来实现在7 段数码管上循环显示0~9 ,A~F 字符. 每个显示位的段选线与一个8 位并行口线对应相连,只要在显示位上的段选线上保持段码电平不变,则该位就能保持相应的显示字符. 这里的8 位并行口可以直接采用并行I/ O 口,也可以采用串入/ 并出的移位寄存器或是其他具有三态功能的锁存器等. 当采用动态显示接口时,在多位LED 显示时,为了简化电路,降低成本,将所有位的段选线并联在一起,由一个8 位I/ O口控制. 而共阴(或共阳) 极公共端分别由相应的I/ O 线控制,实现各位的分时选通. 由于各个数码管是共用同一个段码输出口分时轮流通电的,从而大大简化了硬件线路,降低了成本. 对于数码管的实现分为3 个步骤: 1) 制作LED 字符与码段对应表   2) 扫描控制 3 ( (U8 3 ) 0x02000006) = 0x3E; / 3 使能第一个数码管 3 / 3) 段码输出 ( (U8 3 ) 0x02000004) = seg7table[0 ] ; 根据上面的LED 字符与码段对应表,控制相应的数字进行输出. 数码管扫描控制地址为0x02000006 ,8 位访问,比如Bit0 控制数码管0 ,并且低电平有效,Bit5 控制数码管5 ,低电平有效,数码管显示试验系统中采用的是动态显示接口,其中数码管扫描控制地址为0x02000006 ,位0 —5 分别对应一个数码管,将其中每位清0 来选择相应的数码管;地址0x02000004 为数码管的数据寄存器,控制数码管的段码输出. [b] 3  多任务应用程序 [/b] uC/OS - II 的移植及跑马灯和数码管的实现如下[9 ] :首先是C 语言入口函数Main (所有C 程序的入口) . 它里面包括调用函数ARMTargetInit () 初始化ARM处理器,调用OSInit ( ) 进行uC/ OS - II 操作系统初始化,然后调用OSTaskCreate ( ) 函数创建任务TaskLED 和TaskSEG,最后调用ARMTargetStart () 函数启动时钟节拍中断,并且调用OSStart ( ) 启动系统任务调度,由于在程序当中使用for ( ; ;) ,这是一个永无止境的回路,所以装置可以一直进行下去,直到关闭装置.   void Main(void)   {ARMTargetInit () ;   uHALr printf (″uC/ OS - II # n″) ;   OSInit () ;   Sem1 = OSSemCreate(0) ;   Sem2 = OSSemCreate(1) ;   OSTaskCreate(TaskLED , (void 3 ) %26;amp;IdLED , (OS STK 3 ) %26;amp;StackLED[ STACKSIZE - 1 ] , 5) ;   OSTaskCreate(TaskSEG, (void 3 ) %26;amp;IdSEG, (OS STK 3 ) %26;amp;StackSEG[ STACKSIZE - 1 ] , 6) ;   ARMTargetStart () ;OSStart () ;   return ;} 4  结语 使用创建好的模板Temp 新建一个工程Temp ,并将模板中的Core 和Assemble 文件夹中的文件加入到工程Temp 中. 1) 新建一个文件Temp. c ,并将其添加到Temp 工程的App 文件夹中. 2) 打开Temp. c文件,添加两个任务,它们的任务处理函数分别为TaskLED() 和TaskSEG() . 3) 在TaskLED( ) 函数中每隔50 个时钟节拍使所有跑马灯闪烁一次(即按顺序亮,然后全亮,最后全灭,顺序循环) . 4) 在TaskSEG() 函数中每隔50 个时钟节拍切换一次数码管显示(循环从0~F 显示) . 5) 编译工程Temp ,如果出错,则进行修改后再编译. 6) 将Temp 下载并运行,看结果. 正确的结果是将每隔1/ 2 s 切换一次数码管显示,每隔1/ 2 s使所有跑马灯闪烁一次. 经持续了2 h试验,没有出现错误,跑马灯和数码管正常运转,结果证明移植成功. [b]参考文献: [/b][1 ]  雷必成, 吴高标, 吴永良. 嵌入式实时操作系统uC/ OS - II 的移植探讨[J ] . 自动化技术与应用,2003 , (5) :1 —3. [2 ]  邵贝贝. 嵌入式实时操作系统uC/ OS - II[M] . 第2 版. 北京:北京航空航天大学出版社,2003. 2 —30. [3 ]  叶丰桥,黄海. uC/ OS - II 在51XA 上的移植应用[J ] . 工业控制计算机,2002 , (10) :1 —2. [4 ]  田泽. 嵌入式开发与应用实验教程[M] . 北京: 北京航空航天大学出版社,2004. 264 —270. [5 ]  陈赜. ARM嵌入式技术实践教程[M] . 北京:北京航空航天大学出版社,2005. 189 —203. [6 ]  王田苗. 嵌入式系统设计与实例开发[M] . 北京: 清华大学出版社,2003. 62 —89. [7 ]  朱华军. uC/ OS - II 操作系统在ARM处理器上的技巧 [J ] . 计算机工程,2004 , (S1) :2 —3. [8 ]  苏中义,杨宇. 嵌入式系统[J ] . 嵌入系统,2004 , (3) :11 [9 ]  曾鸣. uC/ OS - II 实时操作系统在嵌入式平台上进行移植的一般方法和技巧[ J ] . 今日电子, 2004 , (11) :2 —3.

    时间:2014-04-25 关键词: ARM 移植 实现 uc/os-ii 驱动开发

  • 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 驱动开发

  • 在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 实现 驱动开发

  • 在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 实现 驱动开发

  • 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 串行通信 实现 驱动开发

  • 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 实现 操作 驱动开发 无阻塞请求

  • PROTEL原理图嵌入Word文档的实现与分析

    自从澳大利亚Protel Technology公司的计算机辅助电路设计软件Tango进入中国市场以来,它以操作简便、功能强大等优点逐步得到了广大用户的青睐。Protel 3.x虽然易学易用,但终将被淘汰。随着Microsoft公司的Windows 3.x,Windows 95,Windows 98操作平台的相继亮相,Protel Design System V1.0、V2.x、V、3.x,以至如今的 Protel98/99SE.Protel Design System包括下面几个部分:(1)Advanced Schematic,它的主要功能是绘制电路图、编辑零件库及生成网络表文件。 (2)Advanced PCB Design,它的主要功能是用来设计负责制电路板。 (3)Advanced PLD,主要用来设计可编程逻辑器件(PLD)。 (4)其它模拟程序,如类比电路模拟器(Analog Simulator)、数字电路模拟器(Digital Simulator)及混合信号模拟器(Mixed Signal Simulator)等,这些模拟器可让电子工程师们在还没实际做出电路和印制电路板之前,能验证一下所设计的的电路是否正确,或评估其可行性。 Protel Design System还有许多优点,如:完全支持中文Windows,可随意执行“复制”、“粘贴”命令;可在电路图中随意填写各种字体的中英文字;可直接在原理图中随意粘贴图片、绘制几何图形、波形,甚至机械结构;可产生或读取OrCAD的图形文件及零件库文件;完全支持Windows所使用的打印机和绘图仪,并可预览打印效果等等。以上的功能及优点是DOS版本下的Protel 3.x所完全不能比拟的。 与此同时,广大无线电工作者和科技文档编辑者在惊喜之余,却经常对在Word文档中难以插入自己的电路图感到困惑。针对这一问题,本文介绍了一种既不用格式转换(所谓格式转换就是将 Protel原理图文件*.S01转换为后缀为。SCP文件,通过参数设置再改成后缀为。HGL文件插入到Word文档中(这种方法只适用于Word 6.0和Word 5.0.),也不用屏幕截取(屏幕截取就是利用一些专门的屏幕抓软件如Capture或HyperSnap进行截取,其打印输出效果不甚理想)或是复印粘贴的方法,而用一种简单易行的方法,暂将此法称之为“选取粘贴法”,它对于电路图插入Word97文档中非常有效(当然也适用于Word95、 Word6.0、Word200)。下面以Protel Design System V2.3为例进行说明,具体步骤主要分为以下三大部分。 1、选取前的准备1) 启动程序栏Protel Design System中的电路图编辑器Schematic Editor. 2) 打开将要插入Word97文档中的电路图文件,或按功能键Alt+F,O. 3)执行选单命令Options/Preferences项,或按功能键Alt+O,P,对工作参数进行设置,运行命令后,屏幕弹出 Preferences对话框,更改工作平面的格点颜色即Grid Color选项,改为白色,颜色数为323,缺省为灰色,颜色数为215.更改工作平面格点颜色的目的是为了避免将工作图纸的灰色网格一起粘贴到Word 文档中去。然后再更改Add Template to Clipboard项,缺省设置是打钩,其意义在于,在执行Copy或Cut命令时,除复制被选择的图件到Windows剪贴板中,以WMF格式存储,但是对于是Protel程序本身的剪贴板,图纸样板是不会被一起复制的。因此,如要将Protel图形复制到Word文档中,就一定不要选择此项,这一点非常关键,否则,复制到Word文档中的图形将是一整张Protel图纸,它将已打印好的Word文档完全遮盖住了。 4)执行选单命令Options/Sheet,或按功能键Alt+O,S,屏幕弹出绘图纸属性设置对话框,选择Sheet项,更改图纸底色,改为白色,颜色数为323,缺省为淡黄色,颜色数为216.更改图纸底色的目的是避免将工作图纸淡黄色的底色粘贴到Word文档中去。 2、图件或原理图的选择要同时复制多个图件,首先要介绍如何选择(Select)图件,因为复制一组图件,是以被选到的图件为目标物,选择图件的方法有三种:1)单个选 如要选择一组图件中的多个图件,一般采用以下两种方法:① 按住Shift键,再用鼠标单击目标图件,被单击到的图件会变成黄色(缺省色),即已被选择。 ② 执行选单命令Edit/Toggle Selection,或按功能键Alt+E,T,此时光标由箭头变为十字,用十字光标单击目标图件,被选择到的会变成黄色。 如果解除选择状态,可按住Shift键,再用鼠标左键单击目标图件,被单击到的图件就会解除选择状态。 2)鼠标框选一组图件首先将光标移到目标物左上方,按住鼠左键不放,拖拽到目标物右下方后松开鼠标左键即可,被框选起来的图件变色和被加上方框,那些图件即被选中。同时也可用另外一种方法实现一组图件的选取:执行选单命令Edit/Selection/Inside Area,或按功能键Alt+E,S,I,出现十字光标后,在目标物左上方单击一下鼠标左键,放开后将光标移置目标物的右下方,再单击鼠标左键,好可将方框内的图件加以选择。 如要解除一组图件的选择状态,执行选单命令Edit/DeSelect/Inside Area,或按功能键Alt+E,E,I.执行命令后,十字光标会出现在工作区,用鼠标框选目标物,被框选到的图件就会解除被选择状态。 3) 选择整个工作区中的图件如果要复制整张图中的图件,可执行选单命令Edit/Select/All ,或按功能键Alt+E,S,A.执行后全部的图件都会变色和被加上方框,此时所有图件均被选中。如要解除整张图中所有图件的选择,可执行选单命令 Edit/DeSelect/ All,或按功能键Alt+E,E,A,即可解除被选择状态,使所有图件恢复原来的颜色。 3、图件或原理图的复制和粘贴当选择好目标物后,执行选单命令Edit/Copy,或按快捷键Ctrl+Ins对目标物进行复制。然后进入Word97程序,执行选单栏文件/打开命令,或按快捷键Ctrl+O对将编排文档进行编辑,将鼠标光标移置要插入的位置,接着执行选单栏编辑/粘贴命令,或按快捷键 Ctrl+V,把已复制好的图件或原理图插入到Word97文档中,利用鼠标调节图形框的大小,使要插入的Protel图形适中。 至此,通过以上三大步骤的操作,就完成了Protel图形在Word97文档中的嵌入。这种方法的优点是操作简便,不需格式转换,插入的图形可随意缩放、移动,同时丝毫不会影响输出图形的分辩率,在Word97中打印出的图形与在Protel Design System打印出的图形毫无分别。不足之处是:有时粘贴到Word97文档中的原理图的个别图件(全部在四周)会失去元件脚,这时不必担心,只要记住图件的位置,用电路图编辑器Schematic Editor 的绘图工具(Drawing Tools)中的画直线工具或按功能键Alt+P,D,L,画上丢失的元件脚即可。这样粘贴上的Protel图形就非常完美了。顺便提一下,如将 Protel98中的图形嵌入Word97文档中的方法与上面介绍的方法大致相同,稍微的差别是Add Template to Clipboard和工作平面的格点颜色即Grid Color 选项在选单命令Options/Preferences/Grapthical下选择,图纸底色 的设置选项在选单命令Options/document Options/Sheet Options选择,其它操作与Protel Design System V2.3 完全相同。[!--empirenews.page--]

    时间:2014-05-22 关键词: 电路设计 实现 Protel word文档

  • 音频滤波器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

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

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

    上世纪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 关键词: 以太网 电路设计 实现 印制电路板

  • 基于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 视频采集 实现

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

技术子站

更多

项目外包

更多

推荐博客