程序天使

    1. Tolapai究竟能够满足哪些需求,在未来的应用中存在哪些机遇?未来市场前景是怎么样的?
    2. C语言嵌入式系统编程—屏幕操作篇 1/3416 编程基础 2008-10-23
      面向对象,真神了! 模拟MessageBox函数   MessageBox函数,这个Windows编程中的超级猛料,不知道是多少入门者第一次用到的函数。还记得我们第一次在Windows中利用MessageBox输出 "Hello,World!"对话框时新奇的感觉吗?无法统计,这个世界上究竟有多少程序员学习Windows编程是从MessageBox ("Hello,World!",…)开始的。在我本科的学校,广泛流传着一个词汇,叫做"’Hello,World’级程序员",意指入门级程序员,但似乎"’Hello,World’级"这个说法更搞笑而形象。 http://www.armforum.cn [/url]  [url=http://www.armforum.cn/upimg/allimg/080110/1429232.jpg][url=http://www.armforum.cn/upimg/allimg/080110/1429232.jpg][/url] http://www.armforum.cn 图2 经典的Hello,World! http://www.armforum.cn   图2给出了两种永恒经典的Hello,World对话框,一种只具有"确定",一种则包含"确定"、"取消"。是的,MessageBox的确有,而且也应该有两类!这完全是由特定的应用需求决定的。   嵌入式系统中没有给我们提供MessageBox,但是鉴于其功能强大,我们需要模拟之,一个模拟的MessageBox函数为: ARM开发论坛 /****************************************** /* 函数名称: MessageBox /* 功能说明: 弹出式对话框,显示提醒用户的信息 /* 参数说明: lpStr --- 提醒用户的字符串输出信息 /* TYPE --- 输出格式(ID_OK = 0, ID_OKCANCEL = 1) /* 返回值: 返回对话框接收的键值,只有两种 KEY_OK, KEY_CANCEL /****************************************** typedef enum TYPE { ID_OK,ID_OKCANCEL }MSG_TYPE; extern BYTE MessageBox(LPBYTE lpStr, BYTE TYPE) {  BYTE keyValue = -1;  ClearScreen(); /* 清除屏幕 */  DisplayString(xPos,yPos,lpStr,TRUE); /* 显示字符串 */  /* 根据对话框类型决定是否显示确定、取消 */  switch (TYPE)  {   case ID_OK:    DisplayString(13,yPos High 1, " 确定 ", 0);    break;   case ID_OKCANCEL:    DisplayString(8, yPos High 1, " 确定 ", 0);    DisplayString(17,yPos High 1, " 取消 ", 0); 字串8    break;   default:    break;  }  DrawRect(0, 0, 239, yPos High 16 4); /* 绘制外框 */  /* MessageBox是模式对话框,阻塞运行,等待按键 */  while( (keyValue != KEY_OK) || (keyValue != KEY_CANCEL) )  {   keyValue = getSysKey();  }  /* 返回按键类型 */  if(keyValue== KEY_OK)  {   return ID_OK;  }  else  {   return ID_CANCEL;  } }http://www.armforum.cn   上述函数与我们平素在VC 等中使用的MessageBox是何等的神似啊?实现这个函数,你会看到它在嵌入式系统中的妙用是无穷的。   总结    屏幕乃嵌入式系统生存之重要辅助,面目可憎之显示将另用户逃之夭夭。屏幕编程若处理不好,将是软件中最不系统、最混乱的部分,笔者曾深受其害。本篇是本系列文章中技巧性最深的一篇,它提供了嵌入式系统屏幕显示方面一些很巧妙的处理方法,灵活使用它们,我们将不再被LCD上凌乱不堪的显示内容所困扰。  
    3. 基于PCI总线的数据采集系统设计与实现 2/5860 测试/测量 2008-10-15
      PCB布板 PCI总线时钟频率只有33MHz,所以频率不是很高,但是需要注意的一点是PCI时钟采用的是反射升压的原理,也就是说PCI时钟是通过终端反射来提升信号幅度,这里利用了传输线的原理。这就对PCI时钟线的长度提出了要求,必须符合规范中的2.5 英寸长度要求,否则会导致多块PCI板在同一个系统中出现无法正常工作的情况。为了达到这样的长度,时钟线的布线往往采用蛇形走线,细心的朋友可能已经看出我设计的PCB存在问题,PCI接口上没有蛇形线,PCI时钟线肯定在B面(元件面)的,为什么没有看到蛇形线呢?其实,这是第一版PCI数据采集系统设计中的一个问题,只不过问题没有表现出来罢了。 设备驱动程序 在开发第一版PCI设备过程中,非常得益于PLX提供的评估驱动和PLX调试工具,否则我的本科毕设不知道是否能如期完成~~在毕设完成之后的那个暑期,我开始自己编写PCI数据采集卡的设备驱动程序,该驱动的开发基于driverstudio平台,采用C++的方法进行开发,开发过程阅读了三本Windows驱动书籍,其中对我最有效的是武安河的《WDM设备驱动程序开发》。 PCI数据采集卡的驱动主要完成了IO读写、DMA中断事务的处理以及DMA的数据传输。在Driverstudio中将Window DDK进行了封装,所以编写设备驱动时直接采用封装的类库就可以了,例如使用DMA传输的方法,采用KDmaTransfer。关于Windows平台下的设备驱动编写在后继的blog中将会有相应的博文进行讨论。 PCI数据采集卡设计心得 对于数据采集部分的心得我不想多说了,其与应用相关,对于不用的应用具有不同的信号特征,针对不同的信号特征,可以采用五花八门的数据采集方法。例如,并行高速采样、等效采样、高分辨率采样、浮点采样等等。这里再说两句PCI总线的设计心得: 1、 得益于PCI总线控制器,PCI设备卡的设计、实现并不是十分复杂,无论是DMA数据传输还是IO数据读写都可以相对比较容易的完成,设计的重点就在于local bus时序方面的设计(通常采用FPGA实现local bus的时序接口)。传统的PCI总线频率只有33MHz,所以对于PCB设计难度不是很大。总的而言,PCI设备卡的开发应该是一个大众化的技术。 2、 对于硬件设计人员而言,设备驱动是PCI设备开发过程中遇到的一个技术高峰。对于自学、开发设备驱动,我大概用了一年左右的时间,对于系统内核的真正理解、把握是在我工作之后。当我从事软件开发一段时间过后,回过头来看看我曾经开发的PCI设备驱动,原来是如此简单!但是对一个纯硬件人员而言,的确有难度,因为硬件人员对操作系统的机制不熟悉,导致理解设备驱动处于“空中楼阁”的状态,只知其然,但不知所以然。如果要战胜这一技术高峰,需要硬件人员在软件方面的知识积累。 3、 PCI系统开发的核心技术在于总线控制器,总线控制器一般分成两大类,一类为PCI桥;另一类为PCI设备控制器。国内搞PCI总线控制器的有,但是做成产品的好像没有。PCI总线控制器分两部分,一部分为物理层的收发器,传统的PCI总线不需要,如今的PCI-E就需要了,所以更是提高了设计难度;另一部分为PCI logic core,这一部分的设计难度相对小点,实现控制通道和数据通道。对于搞高速互联技术方面研究的人员而言,这一点是需要我们去关注和投入智慧的地方。
    4. 1 引言 汽车发生追尾的真正原因是因为前后车“刹车不同步”。急刹车时,后车司机始终滞后于前车,对于120 km/h的车速,需要向前多冲17米。哪怕向前少冲1米,也许就少发生一场追尾事故。LED车灯具有反应速度快,辨识效果好,耐震性强等特性。智能LED紧急刹车灯系统是在车辆紧急刹车时,利用LED车灯优异的特性快速点亮刹车灯,警示后车,从而避免事故发生。本文以ATmega8L单片机为核心给出一种智能LED刹车灯的设计方案,该系统设计利用加速度传感器迅速获取车辆加速度的变化,并将结果传输至ATmega8L单片机,ATmega8L单片机再对接收到的信息进行判断、处理,并根据结果决定是否点亮紧急刹车灯。 2 器件选型 2.1 ATmega8L简介 本系统设计选用美国Atmel公司推出的AT-mega8L器件,它是基于增强的AVR RISC 结构的低功耗8位CMOS微控制器,增强型RISC内载Flash的单片机,片上Flash存储器附在用户产品中,可随时编程,易于用户产品设计,便于产品更新。AT-mega8L具有先进的指令集和单时钟周期指令执行时间,其数据吞吐率高达1 MIPS/MHz,从而缓解系统在功耗和处理速度之间的矛盾。同时,ATmega8L内部集成有增强RISC 8位CPU与在线系统编程和应用编程的Flash存储器,使其成为功能强大的单片机,为许多嵌入式控制应用提供了灵活且低成本的解决方案。 ATmega8L内含8 KB的系统内可编程Flash(具有同时读写的能力,即RWW),512字节EEPROM,1KB SRAM,32个通用I/O端口线,32个通用工作寄存器,3个具有比较模式的灵活的定时器/计数器(T/C),片内/外中断,可编程串行USART,面向字节的两线串行接口,10位6路(8路为TQFP与MLF封装)A/D转换器,具有片内振荡器的可编程看门狗定时器,1个SPI串行端口,以及5种可通过软件选择的省电模式。 2.2 MMA1260D简介 本系统设计选用MMA1260D作为加速度传感器。MMA1260D是一款1.5 g的z轴向加速度传感器,它由G-单元和信号调理ASIC电路两部分组成。其中,G-单元是机械结构,采用半导体制作技术、由多晶硅半导体材料制成,并且密封。而信号调理ASIC电路是由积分、放大、滤波、温度补偿、控制逻辑和EEPROM相关电路、振荡器、时钟生成器、以及自检等电路组成,用于完成G-单元测量的电容值向电压输出的转换。 G-单元相当于在两个固定的电容极板中间放置一个可移动的极板。当加速度作用于系统时,中间极板偏离静止位置。利用中间极板偏离静止位置的距离测量加速度,中间极板与一个固定极板的距离增加,而与另一个固定极板的距离减少,且距离变化值相等。距离的变化使得两极板间的电容改变,电容值的计算公式:C=Ae/D,其中A是极板的面积,D是极板间的距离,e是电介质常数。信号调理ASIC电路将G-单元测量的两电容值转换为加速度值,并使加速度与输出电压成正比。滤波单元由二阶开关电容滤波器组成,用Bessel实现平稳的延时响应,从而将脉冲完整保留。自检单元用于保证G-单元和加速计中的电路工作正常,在G-单元中有4个极板,当ST引脚施加高电平时,校准电压加在自检极板和中间极板之间,在电场的作用下使中间极板移动,由信号调理ASIC电路测得的偏移应与输出电压成比例。 3 硬件电路设计 本系统设计的硬件电路主要是由单片机控制电路、传感器与单片机的接口电路、电源电路、发光二极管阵电路等组成。图1所示为系统硬件结构原理图。 http://www.mcuwork.com/data/2008/09_img/200892723581185977801.jpg3.1 单片机控制电路 单片机控制电路由Atmel公司的ATmega8L型单片机、滤波电容和A/D转换电路构成,用于采集加速度传感器信号,将采集到的信号与预先设置的阈值相比较,控制发光二极管的闪烁,如图2所示。ATmega8L每个端口引脚都有3个寄存器位:DDxn、PORTxn和PINxn。DDxn位于DDRx寄存器,PORTxn位于PORTx寄存器,PINxn位于PINx寄存器。DDxn用于选择引脚方向,DDxn为“1”时,Pxn设置为输出,否则设置为输入。当引脚置为输入时,PORTxn为“1”,上拉电阻使能。如果需要关闭该上拉电阻,可将PORTxn清零,或者将该引脚置为输出。复位时各引脚为高阻态,即使此时并没有时钟在运行。当引脚配置为输出时,若PORTxn为“1”,引脚输出高电平,否则输出低电平。ATmega8L判断和处理加速度传感器MMA1260D测得的信息,若能满足条件则通过PD0、PD1、PD2引脚产生3路信号施加到3个继电器依次对内、中、外三圈的LED灯进行点亮与熄灭控制。若不满足条件,则ATmega8L不 输出信号。 http://www.mcuwork.com/data/2008/09_img/200892723581190677802.jpg3.2 传感器与单片机的接口电路 MMA1260D加速度传感器对汽车加速度数据进行采集并通过ATmega8L的PC0端口(ADC0)传输至ATmega8L,MMA1260D加速度传感器的输出电压与加速度成正比。为了测量加速度传感器的输出电压,通常使用带有A/D的微控制器,具体连接如图3所示。VOUT与A/D IN引脚之间的RC具有滤波,用于减小时钟噪声。加速度传感器与微控制器之间不能存在大电流。电源与地之间的0.1 μF电容为去耦电容。加速度传感器要尽可能的靠近微控制器放置。同时为了使体积尽可能小,器件通常选用表贴封装。 http://www.mcuwork.com/data/2008/09_img/200892723581195377803.jpg3. 3 稳压电源电路 稳压电源电路由7805组成,可将外接电源转换为稳定的+5 V电源,并由VOUT输出,向ATmega8L和MMA1260D提供稳定的5 V电源。该电路主要由二极管、电阻、三端稳压管、电容构成。当紧急刹车时,+12 V先通过电阻降压(主要是为了三端稳压管散热),然后再通过三端稳压管电路稳定于+5 V,并与单片机、发光二极管及加速度传感器电路连接。 3.4 发光二极管阵电路 发光二极管电路由LED、二极管和电阻构成,LED车灯的放置遵循由内到外摆成3圈,用于紧急刹车灯时由内→中→外→内循环点亮熄灭,且亮度较高,以此警示后面的司机注意刹车。该电路主要由ATmega8L单片机的3个引脚控制,其LED车灯放置如图4所示。 http://www.mcuwork.com/data/2008/09_img/2008927235812077804.jpg4 软件设计 根据系统硬件设计的相关要求,软件设计用于完成系统的初始化、对加速度传感器信号提取与分析,并根据设置的门限来决定是否点亮紧急灯。系统软件流程设计如图5所示。通过对ATmega8L进行嵌入式C语言编程,实现紧急刹车灯功能。一旦系统满足门限条件,软件编程可使内、中、外三圈灯通过延时不断以高亮度闪烁,并循环判断条件来决定是否继续点亮刹车灯,这样就易于引起后面汽车司机的警觉。一旦门限条件不满足,刹车灯熄灭,单片机继续等待中断。 http://www.mcuwork.com/data/2008/09_img/20089272358124677805.jpg5 结束语 本文讨论基于ATmega8L的智能LED紧急刹车灯的方案,简要介绍了系统各个硬件模块,利用中断控制来增强小车的智能性,并给出系统软件设计流程。该系统各部分功能模块化,易于调试,易于扩展其他功能。本设计应用前景良好。避免汽车追尾事故的发生,尤其是在夜晚,具有良好的安全效应。
    5. LPC2114串口通信实现 控制系统通过LPC2114的两个UART实现和LD4以及中心站的数据交换,两个UART具备触发点可调的16B收发FIFO。其中,UART1比UART0增加了调制解调器接口。UART的基本操作方法和传统51内核单片机相似。 首先,设置I/O连接到UART;然后设置串口波特率(如U0DLM、U0DLL);接着设置串口工作模式(如U0LCR、U0FCR);这时就可以通过寄存器U0THR和U0RBR发送/接收数据了,发送/接收模块的状态信息可以通过U0LSR寄存器读取。 字串8 系统通过RS-485总线和LD4板卡通信,采用MAX3485作为RS-485总线控制器和 LPC2114的UART1通信。MAX3485是3.3V供电的半双工收发芯片,将差分RS-485总线信号转换成ARM核能够接受的串口信号。为了实现和PC机通信,系统采用3.3V工作电压的MAX3232作为RS-232电平转换芯片。 LPC2114设计注重事项 LPC2114在开发的过程中有一些需要非凡注重的问题,总结如下: (1) 当用户程序写入Flash后不能运行时,首先,需要考虑中断向量表是否正确,中断向量表累加和必须为0。其次,需要考虑向量表的定位,向量表是否已经定位在0x00000000地址。然后,需要考虑MEMMAP寄存器的设置是否正确,否则中断无法执行。此外,还需要考虑ISP硬件条件是否满足,LPC2114的P0.14脚在#RESET为低时,该引脚线上的低电平将强制芯片进入ISP状态,硬件设计时必须在该引脚加10KW上拉电阻,否则,该引脚不稳定,对设备启动将会有影响。 (2) LPC2114共有46个GPIO,这些I/O可以任意配置,但是个别引脚开漏输出(P0.2、P0.3),需加上拉电阻。另外,Flash存储器K9F2808状态输出引脚R/#B开漏输出,需加10KW的上拉电阻。 (3) LPC2114芯片加密后,只能通过ISP对芯片全局擦除后才能恢复JTAG调试以及下载等功能。当#RESET为低时,P1.26的低电平使P1.26~P1.31复位后作为调试端口,注重在P1.26引脚和地之间需接一个弱偏置电阻。  字串4 系统软件设计思想及注重事项 车辆检测系统ARM软件采用分层设计思想,整个软件由驱动程序和应用软件两部分构成。驱动程序部分封装了Flash操作、RS-485操作、实时时钟(RTC)操作、RS-232操作和I/O等操作。应用软件分成基本函数库和主程序。其中,主程序流程如图4所示。 在32位ARM核应用系统中,为了进行系统初始化,往往采用一个汇编文件作为启动代码,来实现堆栈、中断、系统变量、I/O初始化以及地址重映射等操作。开发平台ADS的策略是不提供完整的启动代码,不足部分需要开发人员自己编写。 系统设计的启动代码包含中断向量表、堆栈初始化以及相应的中断服务程序与C语言的接口。对LPC2114而言,为了使向量表中所有数据32位累加和为0 ,向量表中设置保留向量值,将中断向量表中的32个字节数累加,其中,保留向量值不用累加,然后取累加值的补码,这个补码的低32位就是保留向量的值。该保留向量值将被BOOT装载程序用作有效的用户程序要害字。当向量表中所有数据累加和为0时,且ISP外部硬件条件不满足时,BOOT装载程序将执行用户程序。 ARM 结语 本文基于PHILIPS公司最新的ARM7内核微处理器LPC2114实现了高速公路车辆检测系统的控制单元部分的设计。LPC2114使用简单、开发轻易、具有较高的性价比,非常适用于嵌入式系统中。目前本系统已经推向市场,并取得了较好经济效益。 ARM开发论坛 参考文献 1周立功等. ARM微控制器基础与实践.北京航空航天大学出版社. 2003. 11 2马忠梅等. ARM嵌入式处理器结构与应用基础.北京航空航天大学出版社.2002 字串5
    6. ISV时代我们如何破局 4/4096 安防电子 2008-09-18
      开发openVone 智能融合预警通讯平台有什么优势? 黄少军:作为开发者,我们具备十余年的安防行业服务经验和系统开发经验,拥有一支几十人的高素质的专业研发队伍,它的核心成员都是有着十年或以上的安防或IT行业从业经验的精英人士,有十分丰富的行业应用服务经验和技术积累。对应用和技术发展趋势的把握十分敏锐。也正是由于这些积累,使得我们的openVone 智能融合预警通讯平台在设计与实现上能够具备其它厂商的产品无法比拟的先进性、稳定性、易用性、可扩展性、开放性、安全性和易维护性。 openVone 智能融合预警通讯平台采用当前最先进的层次化的、面向服务(SOA)的技术体系架构,使用微内核加插件式的开发技术,支持容器技术,所有功能模块采用插件式开发,由容器将插件和核心程序组装成完整应用程序,任何功能模块的修改或增加都不会影响已稳定运行的核心程序。 同时openVone 智能融合预警通讯平台为用户提供了可视化的开发工具和标准化的二次应用开发接口(API),利用可视化开发工具,用户在短短的几分钟内,即可象搭积木一样开发出功能强大而又个性化十足的监控应用程序,用户也可利用二次开发接口进行深度的应用开发,使openVone 智能融合预警通讯平台能与实际用户的行业应用信息系统进行紧密结合,为客户进行个性化的安防应用解决方案的定制提供很好的技术支撑。 openVone 智能融合预警通讯平台还能让用户体验到优秀平台超强的可伸缩性,利用openVone 智能融合预警通讯平台,用户既可以搭建一个单机型的监控应用系统,又可以组建成一个跨区域、分布式的多级联网大型安防监控系统,享受最先进的网格计算所带来的无所不在的安防服务。 虽然能组成如此复杂的网络系统,但openVone 智能融合预警通讯平台维护起来却相当地简单方便,系统采用统一的管理维护界面,在一个界面上对系统中的人员、设备、组织机构进行设置、配置、维护和管理,无论用户身处何地,只要能连入系统,即可对系统实施管理维护工作。 系统还支持标准的SIP通信和WebService标准接口,使系统能方便地与外部的第三方系统进行通信和互操作。同时整个系统实施严格的权限认证管理,对系统的每一个操作都须经过权限认证管理中心的鉴权许可,对权限的任何一个修改,都能马上反映到整个系统中去,充分保障整个系统的安全可*性。 开发openVone 智能融合预警通讯平台是主动顺应这个时代,还是被动的盲从? 黄少军:开发openVone 智能融合预警通讯平台,完完全全是我们对市场需求的积极主动的响应,通过在以往的多个项目里为用户服务的过程中,我们了解和掌握了用户对安防监控系统提出的各种应用需求,也很清楚处在整个产业价值链中各个环节上的厂商们所面临的困惑和窘境,再加上我们拥有十余年的安防行业从业经验和技术积累,有了这些核心优势作为我们的后盾,我觉得开发openVone 智能融合预警通讯平台是我们必然的选择。因为我们有这个能力去完成这个工作。当然我们也怀着一份为产业发展效绵薄之力的使命感,这份使命感使我们觉得更有必要,也更努力地去完成这个工作。 openVone 智能融合预警通讯平台是怎么开发的? 黄少军:这个问题让我们又回到“熔·引”开发思想这个话题,十余年来,我们公司的产品成功地在银行金融、工厂企业、矿山、轨道交通、高速公路、海港码头、部队、平安城市等各个领域有着广泛的应用,这些应用为我们积累了宝贵而又丰富的应用需求,丰富了我们的产品线,现在我们的产品除了监控系统中心平台软件外,还有视频指挥调度系统,数字化庭审系统、智能图像分析系统四大系列。有了这些应用与系统作为基础,再加上我们多年积累的软件开发实力和对大型系统设计的驾驭能力,使openVone 智能融合预警通讯平台的开发具备了强有力的领域理论积累和研发人才积累。我们对各种安防业务应用进行了充分的分析,将其中的每一个业务模式进行完整的抽象,形成了系统中一个一个功能模块的需求模型,再结合先进的面向服务(SOA)的软件体系架构设计,就形成了整个系统四个层次的体系结构:设备接入层、网络通讯层、平台基础服务层、业务应用组件层。然后我们在实现时采用微内核加插件式的开发技术,将每一个功能模块设计成服务型的插件,再通过容器技术将它们与核心应用程序组装到一起形成完整的应用程序。而且我们还考虑到平台须与用户具体业务应用相结合的需求,以及用户个性化需求所要求的系统定制能力,我们在openVone 智能融合预警通讯平台中为用户提供了一个可视化开发工具和二次开发接口,让用户也能够使用这些工具很快地形成自己独特的个性化解决方案。 对于openVone 智能融合预警通讯平台,在ISV时代起到的作用有什么展望? 黄少军:前面我已说过,ISV时代实际上是一个行业细分的时代,是行业内每一个价值环节进行分工、合作进而共赢的时代,我希望openVone 智能融合预警通讯平台能够成为这个时代的催化剂,为安防行业的终端用户和从业者,也为我们自己,带来价值上的最大回报。我相信,openVone智能融合预警通讯平台 ,一定能成为让用户安心、更让用户省心的安防软件平台。
    7. ISV时代我们如何破局 4/4096 安防电子 2008-09-18
      ISV时代我们该怎么做? 黄少军:ISV是独立的专业安防软件开发供应商,以其特有的独立性和专业性有别于其它软件厂商,它生产的平台软件产品不偏向于任何一家设备生产厂商,保证了平台软件的独立性、中立性和公平性。而在ISV时代,已上升为整个安防产业的主导者的ISV,应当充分利用自身的优势,积极发挥出领头羊的作用,通过提供优秀的软件产品和服务,作整个安防产业价值链条的纽带和驱动者,为产业走上良性发展之路贡献绵薄之力。 正是基于上面的价值考虑,我们公司利用自己有着十年的安防行业软件开发的经验和行业领域积累,在“熔·引”和“五赢加一提升”思想的指导下,设计并开发出了“openVone 智能融合预警通讯平台”这一具备全新设计思想与理念的安防系统平台软件。 openVone 智能融合预警通讯平台是什么? 黄少军:我从两个维度来解释一下这个优秀产品,首先它是一个网络视频与安防监控综合管理平台软件,它解决了“大安防”形势下大规模、分布式、多级联网管理的网络监控业务管理需求,实现对联网系统中不同种类的模拟视频系统、数字视频系统、防范报警系统、门禁与通道管理系统、巡更系统、以及其它第三方系统和设备的集中监控与整合管理,以满足行业客户高可*性、复杂性和灵活性的安全防范管理需求。 其次,它是一个安防监控应用解决方案的开发与定制工具。它提供可视化的开发工具和二次开发接口,通过利用可视化开发工具,和工具中由引擎提供的几十个业务应用功能组件,工程商或系统集成商可以自由定制个性化的监控业务应用程序,帮助快速响应终端用户个性化需求的同时,还能帮助集成商塑造自身的品牌形象。开发能力强的集成商,还可以利用开发引擎的二次开发接口,将openVone 智能融合预警通讯平台与不同行业应用信息管理系统作完美的融合,实现系统间的信息融合和资源共享。利用开发引擎提供的标准化接口,设备厂商通过简单的开发即可将它的设备集成到openVone 智能融合预警通讯平台平台中来,集成商也可开发自己的专用业务应用组件,并将其作为标准组件插入到openVone 智能融合预警通讯平台中来,形成自己的行业专用安防软件平台。 为什么要开发openVone 智能融合预警通讯平台? 黄少军:简要地说,是三个方面的原因驱动我们作出这种决策。 一是市场因素,随着社会的进步和行业的发展,监控系统的规模越来越大,系统中的设备数量和种类越来越多,业务应用越来越复杂,监控联网的需求越来越突显,系统运行的网络环境也变得复杂起来,且要求能与用户的行业业务应用进行紧密结合,在这种需求的要求下,市面上现行的监控平台软件已经不能满足市场的需要。 二是技术因素,我们公司从99年开始一直从事安防行业应用软件开发,曾经为国内贡献了一百多个DVR品牌,积累了丰富的行业应用经验,同时我们也是国内最早从事监控中心平台管理软件开发的公司之一,我们的平台软件在国家级的一些重大项目得到了成功的运用,这些大项目的实施检验了我们系统的稳定性、可*性、可扩展与可扩充性、以及易维护性,也使公司积累了大量超大规模系统的运维和服务能力。同时,十几年来,公司一直执力于产品研发与技术积累,在硬件与软件研发方面形成了相当深厚的沉淀,特别是这种大型平台软件,公司的研发团队在软件的体系架构、底层的音视频编解码、网络通讯和标准协议栈、硬件设备兼容等研发领域已积累了丰富的实作经验,具备了足够的实力进行大型软件系统的研发实施。 三是公司发展理念,作为一家从业经验相当丰富的产品供应商,应当能够为整个行业的发展贡献自己的一份力量,正是基于这种思考,公司领导层提出了“熔·引”和“五赢加一提升”的产品开发理念,所谓“熔·引”有三个主题意思:溶解、提炼、整合,即利用我们十余年的行业应用积累和技术优势,对我们现有的平台和应用进行充分的分析和分解,提取出其中的核心优势,再将其整合成一个基于标准的、组件化、搭建式的开放性平台软件。而“五赢加一提升”即是借力于我们新的平台软件,将安防产业价值链条上的五个环节,即设备厂商、行业应用开发商、工程商/系统集成商、平台软件厂商和终端用户,能够很好地衔接起来,使每个环节能够专注于自身的核心优势,并分工合作,一起为整个产业的发展助力,从而达到整个行业的价值得到提升,各个环节共赢的理想局面。
    8. 机器人领军焊接自动化 1/4415 工控电子 2008-09-16
      三、焊接机器人技术现状 近几年,焊缝跟踪控制系统中弧焊机器人的控制器正由专用的控制器向基于PC机的开放通用型控制器过渡。PC机与焊缝机器人的结合应用,不但能够解决专用控制器计算负担重、实时性差等问题,同时能够将图像处理、最优控制、人工智能等先进的研究成果应用到该系统的实时操作中。另外,PC机具有良好的开放性、联网性、标准的总线结构及标准接口等,可以打破机器人专用控制器结构封闭的局面,开发出结构开放、功能模块化的标准化焊接机器人系统。 随着人工智能技术的发展,神经网络和模糊逻辑技术的融合已成为当前焊接机器人技术的研究热点。神经网络具有很强的自学习、自适应、大规模并行运算和精确计算的能力,而模糊逻辑在专家可预见的领域上有很好的收敛性,在进行模糊量的运算上有优势。因此,二者结合可以优势互补,从而大大提高综合性能。神经网络模糊控制器的快速实时算法、稳定性、鲁棒性等问题,需要结合弧焊机器人系统及弧焊工业加以深入的研究。 目前的工业生产系统正在向大型、复杂、动态和开放的方向发展,为了解决在传统工业系统和多机器人技术相结合的许多关键问题上遇到的严重挑战,人们采用了将分布式人工智能和多智能体系统理论充分应用于工业生产系统和和多机器人系统——多智能体机器人系统。焊接是工业生产的一大领域,焊接机器人的发展基本上同步于整个机器人行业的发展。所以,多智能体机器人的研究与发展将要很快应用于焊接机器人领域。随着工业生产系统向大型、复杂、动态和开放的方向发展,多智能体焊接机器人系统终将成为热点的研究领域。 四、焊接机器人的发展趋势 2006年,焊接机器人拥有量达到8000多台,年拥有量将突破1500台。“十五”期间焊接机器人的总需求量约为3000台,预计到2010年工业机器人拥有量奖达到17300台,2015年将达到十几万台(套)。为保障企业的产品与技术与世界水平同步发展,新松公司充分利用自身的技术优势和行业地位,除了开发具有自主知识产权机器人自动化系列产品外。公司还与国外众多知名的机器人公司形成了紧密的商业合作伙伴关系,紧紧围绕客户需求,公司把国外先进的机器人自动化技术、产品与自身强大的研发设计能力、先进的技术装备与完善的服务体系进行完美整合,充分发挥各自的技术和资源优势,为客户提供完整的技术解决方案和交钥匙工程,保证了公司的产品技术水平始终与世界先进水平同步,为广大客户提供最大增值服务,形成了以机器人和先进装备为主体的核心技术,从而形成了较强的综合竞争优势和差异化比较竞争优势。 正是伴随着北京·埃森焊展20年的进程,我国的焊接机器人市场也迎来的前所未有的机遇,对未来大量采用焊接机器人的生产企业在高技术、高质量、低成本条件下必将获得高速发展,真正实现了与国际接轨,也必将为民族工业的发展带来新的生机。
    9. 基于SOC应用的运算放大器IP核设计 2/4037 模拟电子 2008-09-16
      2.2 Rail-to-Rail输出级及共栅补偿技术  在Rail-to-Rail输出级中,AB 类传输函数可通过保持输出管栅极间电压恒定来实现。采用带有前馈AB类控制的推挽输出结构,它能够在低压下实现全摆幅的输出,并 且可以在保证低失真的情况下,得到较高的电源效率。   用晶体管耦合直接前馈通路实现的AB 类前馈式输出级如图2 所示。M7、M8为Rail-to-Rail 输出管,M1、M2 组成晶体管耦合的AB 类控制电路。Iin1和Iin2为同相位的小信号电流源。电路中的两个回路M2-M7 和M1-M8控制输出管的静态电流。当一个输出管电流非常大时,另一个输出管能够保持一个最小值,而不是截止为零,避免了从截止到导通所需要的时间延迟,也减少了交越失真。 http://pagesadmin.ednchina.com/images/article/76c4ba72-c930-44aa-a394-a2e11e06c076/2.jpg  通常Rail-to-Rail运放是多级放大器,需要两个(或两个以上) 电容作为Miller 补偿以提供足够的相位裕度,这不仅会占用大量的面积,也限制了单位增益带宽;而且多级放大器作为输出缓冲器时,电路的稳定性还容易随负载电容大小的变化而改变,产生震荡。Miller补偿要求在M23 和M24 栅漏两端分别接入两个补偿电容,其输出极点可简单的表示为(假设gm7等于gm8, CL 是负载电容) :   由于电容的前馈通路,Miller 补偿引入了一个右半平面零点zc,该零点减小了相位裕度,同时也限制了单位增益带宽。   如图2所示,针对特殊的AB类输出级,采用M9,M10和电容CC组成的共栅频率补偿结构,可以阻止通过电容的前馈电流,并将右半平面零点移至高频,同时也减少了一个补偿电容,节省了芯片面积。假设只考虑晶体管M8 所构成的NMOS 共源输出级,通过小信号分析可以得到,该电路引入了一个位于左半平面的零点: http://pagesadmin.ednchina.com/images/article/76c4ba72-c930-44aa-a394-a2e11e06c076/05.jpg  整个放大器主极点可以近似等于: http://pagesadmin.ednchina.com/images/article/76c4ba72-c930-44aa-a394-a2e11e06c076/06.jpg  其中Rout1为第一级放大电路的输出电阻,RL为负载电阻,对于较大的RL ,输出极点可以近似为: http://pagesadmin.ednchina.com/images/article/76c4ba72-c930-44aa-a394-a2e11e06c076/07.jpg  从式中看出,输出极点增大了约gm10Rout1倍,增加M10 (和M9) 的跨导还可将此极点移至高频,因此采用较小CC就能实现频率补偿,获得较高的单位增益带宽。但是,增加gm9, gm10将会导致M9 和M10 的漏电流增加,从而减少流经M1 和M2 的电流,进一步减小M1和M2的源漏端的饱和压降Vdsat,而流经M7和M8的电流将增加,输出阻抗减小,最终导致放大器开环增益的降低。此外,增大gm9 , gm10还会增加等效的输入噪声和放大器的功耗。因此M9、M10的设计只需使得两个极点分离足以满足稳定性所需的相位裕度即可。流经M9 和M10 的漏电流总是相等,M9和M10的引入并不会影响放大器总体的失配;同时(7)式也说明采用较小的补偿电容CC 还可以减少负载电容CL 的增加对电路频率特性的影响。   3整体电路实现与仿真   综上所述,电路的整体实现结构如图3所示,由晶体管M18-M22构成的电流镜和由M28-M31构成的电流镜为整个电路提供偏置电流。为了减小输入失调,尽量增大输入晶体管面积,减小其有效栅源电压,同时尽可能减小电流镜和电流源的宽长比。通过减小电流开关M15的宽长比将失调变化扩展到整个共模输入范围,可以增加共模抑制比。   电路采用TSMC 0.18μm 1P6M CMOS数模混合工艺,基于BSIM3V3 Spice模型,10pF电容负载的条件下,用Hspice对整个电路进行仿真,电源电压为1.8V,偏置电压为0.8V。   输入级跨导随输入共模电压变化的结果如图4所示,可以看出,输入级跨导大约为290μS,在整个输入共模电压范围内只变化3%,基本保持恒定。在0~0.4V,PMOS差分输入对导通,NMOS差分输入对截止,输入级跨导为PMOS输入对的跨导;在0.9~1.8V,输入级跨导为NMOS输入对的跨导;在0.4~0.9V,PMOS和NMOS差分输入对同时导通,电流开关抽取电流会引起跨导变化,主要是由NMOS和PMOS差分输入对的宽长比以及弱反型斜率因子的不同引起的。   该运放的频率特性如图5所示,整个电路的直流开环增益为103.5dB,相位裕度为60.5度,单位增益带宽为18.9MHz。相比之下,采用传统miller补偿其带宽只有9.5MHz。 http://pagesadmin.ednchina.com/images/article/76c4ba72-c930-44aa-a394-a2e11e06c076/4.jpg  整个放大器的设计结果如下表所示,运算放大器的整体性能较好,并且能够在1.8V低电压下工作,功耗低,芯片面积也大大节省。 http://pagesadmin.ednchina.com/images/article/76c4ba72-c930-44aa-a394-a2e11e06c076/0.jpg  4结束语   随着电源电压的降低以及芯片集成度的增加, 以IP核形式的Rail to Rail运算放大器设计较有优势,它可以节省成本和缩短系统设计周期。本文基于0.18μm CMOS工艺设计了一个恒跨导Rail to Rail运算放大器,整个电路结构简单紧凑,功耗低,非常适合做成SOC的IP核。   本文作者创新点:   (1) 从IP核的角度进行运算放大器的设计,使其更具有应用价值。   (2) 采用一倍电流镜方式进行跨导控制,和新型的共栅频率补偿技术,使整个电路结构简单紧凑,适合与其它电路模块集成应用于SOC。   参考文献:   [1] Trung K N, Sang G L. Low-voltage, low-Power CMOS operation transconductance amplifier with Rail-to-Rail differential input range [J]. IEEE ISCAS. 2006; 10:1639-1642   [2] 候卫卫,冯全源.一种高性能单位增益放大器[J].微计算机信息,2007;2-2:291-293   [3] Juan. M. Carrillo, Francisco J, Duque-carrillo, et al. Constant-gm constant-slew-rate high-bandwidth low-voltage Rail-to-Rail CMOS input stage for VLSI cell libraries [J]. IEEE International Symposium on Circuits and Systems, 2003; 38(1): 165-168   [4] Loikkanen M, Kostamovaara J. Low voltage CMOS power amplifier with rail-to-rail input and output [J]. Analog Integral Circuits Process, 2006, 46(2) :183   [5] 王为之,靳东明. 一种采用共栅频率补偿的轨到轨输入/输出放大器[J]. 半导体学报,2006;27(11):2026-2028   [6] 杨银堂,李晓娟,朱樟明等. 低压低功耗运算放大器结构设计技术[J]. 电路与系统学报,2005;10(4):95-101
    10. L波段低噪声放大器的设计 1/4031 模拟电子 2008-09-16
      低噪声放大器设计中,输入、输出匹配网络的设计是在获得噪声系数、增益指标的前提下,将晶体管的输入阻抗、输出阻抗分别变换到标准的50Ω。通常低噪声放大器的最大增益和最佳噪声系数不可能同时获得,因此,在设计的过程中需要对增益和噪声系数等指标取折衷,以满足设计指标的要求。设计中采用的基板是厚度为1 mm,相对介电常数为2.7的F4B介质板。   第一级放大电路的设计根据ATF54143的小信号S参数计算出放大器中心频率的输入、输出阻抗,输入阻抗Zin=50×(0.999+j3.928E-4),输出阻抗Zout=50×(1.017+j0.064),采用共轭匹配的方法,即ZS=Z*in,ZL=Z*out,从而进行输入和输出匹配电路的设计,并采用ADS软件对设计的匹配网络微带电路尺寸进行优化、仿真。放大器的噪声系数频率响应如图4所示,从图中可以看出放大器的噪声系数在中心工作频率大约为0.6dB;图5为放大器增益/频率曲线,可以看出,设计的第一级放大器增益在工作频率范围内大于10dB。 http://pagesadmin.ednchina.com/images/article/aae3f742-8770-4697-82f8-22359ab78df2/4.jpg  放大电路第二级的MGA86576由于本身就是一个内匹配的增益模块,可直接与第一级进行级联。但为了减小输入/输出回波损耗,所以在此级放大电路加入了匹配电路的设计,步骤与第一级类似,级间用电容相连。   仿真结果   电路设计完成后,使用ADS软件对设计的低噪声放大器进行仿真,其中,图6为低噪声放大器的噪声系数仿真结果,可以看出在1.90GHz~2.10GHz频段中噪声系数NF≤0.67dB;图7为低噪声放大器的增益特性频率响应,在2.0GHz频点上,增益大约为38dB;图8为整个低噪声放大器的输入、输出回波损耗频率响应,其中的虚线是输入回波损耗,实线是输出回波损耗,在整个工作频段内输入回波损耗小于-15dB,输出回波损耗小于-22dB。   结语   本文介绍了一种采用源极串联负反馈提高低噪声放大器稳定性的方法,并设计了一个中心频率为2GHz、带宽为200MHz的L波段低噪声放大器,仿真结果表明,源极串联负反馈可以提高放大器的低频稳定性。
    11. 基于DSP的PCI高速测控系统结构的研究 1/3045 工控电子 2008-09-09
      控制逻辑芯片CPLD 本系统采用Altera公司的EPM7 128来实现系统的逻辑控制,主要包括DSP控制逻辑、FIFO控制逻辑、PCI9054接口控制逻辑三个部分,其中,对PC219054的逻辑控制是设计的重点。设计中利用MaxPlusⅡ软件进行VHDL语言编程、仿真和调试。 PCI9054及外部接口分析 PCI与板载CPU的桥接有两种设计方案,一种是采用FPGA,通过软件编程实现硬件功能。另一种是利用专用PCI桥接芯片,适合快速开发的场合。 本系统采用PLX公司的PCI总线专用接口控制芯片PC19054。它符合PCIV2.1和PCIV2_2规范;可同时支持3.3V和5V两种信号环境;提供了两个独立的可编程DMA控制器;内部有6种可编程FIFO,以实现零等待突发传输及局部总线和PCI总线之间的异步操作;在PCI总线端支持33MHz/32位,传输速率最高可达132MB/s;在局部端可编程实现8/16/32位的数据宽度,支持复用/非复用的32位地址/数据,时钟最高可达50MHz。 PCI9054局部总线可工作在M、J、C三种模式,M模式是专门为Motorola公司的 MPC850和MPC860提供直接非复用的接口;J模式地址/数据线复用;C模式与J模式差别不大,但地址/数据线非复用,更符合连接习惯。本设计采用C模式。 PCI9054的数据传输模式可分为主模式、从模式、DMA模式。模式的选择主要根据硬件设计者对硬件的设计需要而定。本系统采用DMA模式,在DMA传输模式下,PCI9054既是PCI端的主控方,又是局部端的主控方。 PCI9054集成了两个互相独立的DMA通道,每个通道都支持Block DMA和Scatter/(3ather DMA,其中通道0还支持请求(Demand)DMA传输方式。当有通道进行DMA传输时,DMA控制器将发起对局部总线和PCI总线操作,其传输过程如图2所示。 PC219054提供了三个物理总线接口:PCI总线接口、EEPROM接口、局部总线接口。PCI总线接口依照PCI扩展板上定义的引脚分配情况将彼此对应的信号连接在一起即可。本系统采用的EEPROM为4K、3.3V串行的93LC66B,通过对PCI时钟分频来产生EEPROM时钟,内部存放PCI9054的配置信息,系统加电时PCI9054自动加载EEPROM中的配置信息,并由BIOS通过PCI总线对配置寄存器读写,来完成各种控制功能。接口电路如图3所示。 PCI9054在DMA传输方式下,通过设置其DMA控制器内部的寄存器即可实现两总线之间的数据传送。传输过程由以下几个步骤实现: 1.设置传输方式寄存器:通过寄存器DMA MODE0或DMAMODE1的位9来设置DMA通道的传输方式,置0表示Block传输,置1表示Scatter/Gather传输; 2.设置命令/状态寄存器:启动/停止DMA操作,并读此寄存器返回DMA状态; 3.设置描述寄存器:设置DMA的传输方向; 4.设置传输计数寄存器:以字节为单位设置传输数据量; 5.设置PCI地址寄存器:设置PCI总线侧的地址空问; 6.设置局部地址寄存器:设置局部总线侧的地址空间。 当进行数据采集时,由应用程序或通过DSP的外部引脚(pin21)向DSP发出采集命令,同时复位FIFO,在13SP内部程序和CPLD的控制下,数据经DO-31源源不断地输入到FIFO中,当FIFO半满时发出半满标志信号(HF#),CPLD接到半满信号后,立即向PCI9054发出中断请求信号(LINT),驱动程序响应中断,在中断响应程序内,发出读命令、要读取的字节数、传输方向、地址信号等,PCI9054设定“DMA传输开始位”启动数据传输,当ADS#为低(有效),BLAST为高(无效),LW/R为低(有效)时,表明PCI9054开始一个有效的读数据周期,CPLD产生一个低电平信号REN#给FIFO,同时作为Ready信号返回给PCI9054, 表明已准备就绪。直到ADS#为高(无效)且BLAST#为低(有效)时,表明PCI9054已经开 始最后一个周期,同时设定D M A“传输结束位”结束DMA操作,此时REN#信号再次变高电平(无效),完成一次数据突发传输。接口电路如图4所示。 该系统的软件设计主要包括DSP测控程序、PCI设备驱动程序和Windows应用程序三个部分。驱动程序是连接硬件系统和应用程序的桥梁,是整个测控系统开发中的关键一步。在此简单介绍一下PCI设备驱动程序开发过程。 在Windows环境下共有三种类型的驱动程序,分别是VXD、NT、WDM。因为WDM可以应用在windows98/2000/XP下,支持即插即用、电源管理、WMI等功能,是Windows NT驱动体系基础上发展起来的未来主流驱动程序体系,所以为这里选择设计WDM驱动程序。 开发工具选择Compuware公司提供的DriverStudio完成驱动程序的开发,DriverWorks是DriverStudio中的一个部分,DriverWorks中的类库封装了针对驱动程序的各种通用操作,使用其中的DriverWizard向导功能,能够非常方便地实现WDM驱动程序的开发。 其中PCI配置空间的访问采用KPciConfiguration实现。I/O访问采用DriverStudio中的KIoRange类实现。硬件中断响应的处理可以采用Kinterrupt类实现。DMA读主要是利用三个类来实现数据传输,分别为:KDmaTransfer、KdmaAdapter和K C o m m o n D m a B U ff e r。KDmaTransfer用于DMA传输控制。KdmaAdapter用于建立一个DMA适配器来说明DMA通道的特性。KCommonDmaBuffer用于申请系统提供的公用缓冲区。 执行过程中驱动程序首先设置PCI9054的工作方式和中断寄存器、DMA配置寄存器,然后等待本地中断的到来。当FIFO半满时表明本地中断到来,在设备成员函数Isr_IrqO中屏蔽本地中断,在设备成员函数DpcFor_Irq()中调用KDmaTransfer:Continue()函数进行DMA传输。一次数据传输完毕后,驱动程序通过操作系统将内核中的数据拷贝到用户态内存,交给应用软件处理。 结语 在实验室中利用PCI9054作为接口芯片的高速测控系统,可实现持续数据传输速率达50MB/s,且系统运行稳定,具有广泛的应用前景。
    12. 时序电路设计 图3给出了时序电路的一般结构。 首先是库说明语句Library declarations。接着是实体结构,给出实体模块的名称Entity,由Port引出的输入输出的清单。再后面是结构体,然后是内部信号说明。接着设置了一个状态进程,定义存储元件,进程名称为State process,敏感的清单一般是存储元件,reset、next state、Input等信号,是存储元件的输入信号,在这些信号下,进程会激活。然后是状态进程的Begin,开始以后对状态的元件进行VHDL描述,顺序描述完以后,结束状态进程。下面的设置是组合进程,这个进程的敏感清单通常包括所有的输入。接下来是进程的Begin,在Begin里头给出了规定组合逻辑的VHDL描述,最后是进程结束与结构体结束。 前面已经讲过,FPGA设计尽量采用同步设计。这里要考虑同步硬件的RTL描述。描述设计的寄存器到寄存器的功能,即描述寄存器之间组合逻辑的功能。 有效编码方式和If-Then-Else比较 在组合进程和状态进程中,都可能会用到If-Then-Else和case语句,综合出来的结果和组合逻辑情况一样,都会有不同,case语句用一个模块来实现,If-Then-Else用带有特权编码的译码器实现。 在组合进程和状态进程中,用If-Then-Else和case语句带来的问题 对Case语句的要求 一般情况下,如果不需要特权编码,建议用Case语句。组合逻辑上,要求Case语句对所有分支进行定义,如果有几don't care输出也可以利用,能够节省描述方式。Case语句能节省资源,减少延时。 Case语句在组合进程和时序进程中带来的问题 ·Case 语句在组合的进程(VHDL)或在always语句(Verilog)中: 要求在case语句中,对所有分支中的所有输出必须定义,才能防止出现锁存;如果不是所有的分支都定义了,可以在case语句之前利用一个缺省语句来防止锁存的产生。 ·C语句在时序进程(VHDL)或在always语句(Verilog)中: 如果在Case语句的分支中有的输出没有定义,就会产生一个时钟的使能信号,这个信号并不出现错误,但是可能会产生一个很长的时钟使能方程式,使设计不能实现。那么在case语句之前利用一个缺省语句防止不必要的时钟使能产生。 FPGA设计常用的一些模块有:存储单元、全局时钟资源和锁相环、全局复位/置位信号、高速串行收发器等,下面做简要介绍。 锁存器与寄存器 锁存是电平有效,在电平有效的情况下,输入送到输出;寄存器是时钟沿有效,当时钟到的时候才输出。在逻辑单元里头除了查找表外都有寄存器,所以建议大家使用沿有效的寄存器,不要用增加组合逻辑来实现的锁存器。 时钟使能 VHDL程序的编码方式将决定是不是利用时钟使能信号,时钟使能使得时序约束更容易控制。 锁存与变量 推荐分配一个初始值或者信号给变量,就不会有反馈出现,如果一个变量没有分配初始值,获得一个信号锁存就要产生,可能引起设计功能不正确。锁存的产生和变量的情况一样,不要有不确定的条件产生。 DFF利用rising_edge 触发器利用语句rising_edge(clk)时钟的上升沿,如果时钟的上升沿来了,则数据给定,这是寄存。rising_edge是IEEE的函数,是在1164的软件包里定义的一个函数,规定了信号值必须是0和1,X、Z到1转换是不允许的,三态到1的转换是不允许,必须是0到1。 DFF利用clk'event and clk=1 如果用clk'event and clk=十,clk就是信号名称,event是VHDL的一个属性,规定了信号值的变化,那么CLK等于1意味着正沿触发。clk'event and clk=1,信号的名称是clk,event表示信号的数值需要有一个变化,等于1表示正沿触发,是沿触发的语句,综合出来是触发器、寄存器的推论。 移位寄存器 这里的描述是IF的异步清除CLK等于1的时候,Q全置0,然后上升沿到达以后,如果使能等于1,Q等于Q的低七位挪到高七位,补充一个入信号,是一个左移,移位寄存器是并行出,串行入,异步的清除和使能左移,如果增加和移去同步控制,在这个方式出现移动,这个语句里头信号只是表示高七位和进来的信号组合成一个八位的信号。 基本的计数器 基本的计数器主要有带时钟使能的计数器、带同步清零的计数器、上/下计数器、带同步加载的计数器、带同步加载和计数使能的计数器、带同步加载和计数使能的计数器、带同步加载的上/下计数器、模块200计数器、使用整数的模块200计数器等,这里不再一一介绍,详情可登录http://training.chinaecnet.com查询。 信号与变量 信号仅仅用做VHDL实体的连接口。信号仅可以在结构体内说明,它们可以作为参数通过函数和过程。变量在进程块、过程和函数内进行说明。信号赋值通过“<=”实现,变量的赋值通过“:=”实现,见图4和图5。 三态Tri-states IEEE的标准在STD_LOGIC软件包中定义了三态的Z值,仿真就是高阻态,综合的时候转换成三态缓冲器。 Altera器件只有I/0单元有三态缓冲器,其好处是消除了可能的总线连接,解决了内部逻辑的位置问题。因为无需三态缓冲区,减少了器件的测试,节省了成本。其内部的三态必须转换成组合逻辑,复杂的输出使能容易引起错误和低效率逻辑,但是在I/0单元里有三态缓冲器。 双向管脚 当管脚被说明作为方向INOUT的时候,利用INOUT的脚作为输入或者是三态输出,在程序中,设置了一个bi direction,作用双向的INOUT信号。当CE使能信号等于1的时候,来自核的from core信号送到双向脚,否则的话三态,这个时候双向作为一个三态输出,还有一个输入赋给,来自信号送到三态,输入送到内核。 存储器 综合工具有不同的能力来识别各种存储器。为了识别各种存储器,综合工具对特定的译码类型非常敏感,通常在综合工具文件中有说明。综合工具可能在结构实现上有一些限制,如只有同步写、时钟配置的限制、存储器尺寸的限制等,必须说明一个阵列数据类型来保存存储器的值。存储器有单端口Memory,单端口双时钟Memory,双时钟Memcry、ROM等。
    13. ·从资源使用方面考虑,推荐使用同步设计。虽然在ASIC设计中同步电路比异步电路占用的面积大,但是在FPGA中,是以逻辑单元衡量电路面积的,所以同步设计并不比异步设计浪费资源。 ·从延迟设计方面考虑,异步电路的延时靠门延时来实现,比较难预测;同步电路使用计数器或触发器实现延时。 ·同步设计时钟信号的质量和稳定性决定了同步时序电路的性能,FPGA的内部有专用的时钟资源,如全局时钟布线资源、专用的时钟管理模块DUL、PLL等。 ·目前商用的FPGA都是面向同步的电路设计而优化的,同步时序电路可以很好地避免毛刺,提倡在设计中全部使用同步逻辑电路。特别注意,不同的时钟域的接口需要进行同步。 FPGA设计的技巧 乒乓操作 图2是乒乓操作流程图。从图中可以看出,数据经过两个缓冲模块,在向缓冲模块1输入数据的时候,缓冲模块2的数据会送到下一级进行处理,从外部看数据流没有停顿。所以乒乓操作能够提高处理速度。 实际上,乒乓操作是用一种低速模块来处理高速数据流,即用两个缓冲模块实现了串并转换,用两个预处理模块并行,利用面积换速度。 串并转换 串并转换是FPGA设计的一个重要技巧,是数据流处理的常用手段,也是面积与速度互换思想的直接体现。串并转换的实现方法多种多样,根据数据的排序和数量要求,可以选用以下方式:小的设计用寄存器、数据量比较大的用ROM、复杂的串并转换用状态机,或者直接利用功能模块来实现。 流水线操作 流水线操作是高速设计中一个经常用到的设计手段。如果某个数据的处理流程分为若干步骤,而且整个数据处理是“单流向”的,即没有反馈或者迭代运算,前一个步骤的输出是下一个步骤的输入,则可以采用流水线设计方法提高系统的工作频率。 ·流水线设计时,要对时序进行合理安排,每个操作步骤的划分要合理,仔细考虑各个步骤间的数据流量。 ·如果前级操作时间恰好等于后级操作时间,设计最为简单,前级直接输出到后级输入就行了。 ·如果前级操作时间大于后级操作时间,后级会经常空闲,可以对前级的数据进行适当缓存,再输出到后级的输入端。 ·如果前级操作时间小于后级操作时间,必须通过复制逻辑,将数据流分流和并行预处理,或者在前级对数据采用存储、后处理方式、否则会造成后级数据溢出。所以怎样平衡各个模块的处理时间,在设计中要给予适当的考虑。 数据接口的同步 ·如果输入数据的节拍和本系统处理时钟同频,可以直接用本系统的主时钟对输入数据寄存器进行采样,完成输入数据的同步化。 ·如果输入数据和本系统的处理时钟是异步的,要用处理时钟对输入的数据做两次(或多次)寄存器采样,完成输入数据的同步化。两次(或多次)采样的作用是抑制亚稳态的传播,适用于对少量对错误不敏感的功能单元。 ·为了避免异步的时钟域产生错误的采样电平,一般使用RAM、FIFO存储的方法完成异步时钟域的数据转换,在输入端口使用上一级时钟写数据,在输出端口使用本级时钟来读数据,能够非常方便地完成异步时钟域之间的数据交换。
    14. 用ARM运行FFT,速度怎样? 4/12568 ARM技术 2008-04-16
      专门优化过的还可以吧?
    15. 6、循环 8~e Saa (1)、循环语 ^-q^V cN 对于一些不需要循环变量参加运算的任务可以把它们放到循环外面,这里的任务包 ]hzk+ou 括表达式、函数的调用、指针运算、数组访问等,应该将没有必要执行多次的操作 LZp6m 全部集合在一起,放到一个init的初始化程序中进行。 :-jBegW 通常使用的延时函数均采用自加的形式: ODnWPT{x!   void delay (void) g^dQ[=(74   { r;= W66?r unsigned int i; d'V@_HZ_   for (i=0;ih 在使用while循环时也一样,使用自减指令控制循环会比使用自加指令控制循环生 @Y`mR`]|: 成的代码更少1~3个字母。 BL\XjYQv 但是在循环中有通过循环变量“i”读写数组的指令时,使用预减循环时有可能使 w5b`sR\7` 数组超界,要引起注意。 |2pT 用while循环时有以下两种循环形式: [:+ ` unsigned int i; :\)w   i="0"; YU.4AFxub   while (i
    16. 现在嵌入式方面是不是人才过剩了? 5/5859 嵌入式系统 2008-03-25
      我做arm,51,win驱动,linux驱动,会uCLinux,uCOS,vc,vb 熟悉图像处理,模式识别,射频电路 就是岁数大点,不知道好不好找工作?
    17. 嵌入式设计及Linux驱动开发指南 5/9388 Linux与安卓 2008-03-20
      第六章 Linux系统在ARM平台的移植 1、 使某一个平台的代码运行在其它平台上的过程就叫做移植。 2、 Linux内核结构: * /arch包含了所有硬件结构特定的内核代码。 Linux系统能支持如此多平台的部分原因是因为内河把原程序代码清晰的划分为体系结构无关部分和体系结构相关部分。对于任何平台,都必须包含以下几个目录: * boot:包括启动内核所使用的部分或全部平台特有代码。 * kernel:存放支持体系结构特有的(如信号处理和SMP)特征的实现。 * lib:存放高速体系结构特有的(如strlen和memcpy)同用函数的实现。 * mm:存放体系结构特有的内存管理程序的实现。 * math-emu:模拟FPU的代码。对于ARM处理器来说,此目录用mach-xxx代替。 显然,移植工作的重点就是移植arch目录下的文件。 * /drivers包含了内核中所有的设备驱动程序。 * /fs包含了所有的文件系统的代码。 * /include包含了建立内核代码时所需的大部分库文件,这个模块利用其他模块重建内核。该目录也包含了不同平台需要的库文件。比如,asm-arm是arm平台需要的库文件。 * /init包含了内核的初始化代码,内核从此处工作。 不是系统的引导代码,由main.c和version.c两个文件。这是研究核心如何工作的好起点。 * /ipc包含了进程间通信代码。 * /kernel包含了主内核代码。 * /mm包含了所有内存管理代码。 * /net包含了和网络相关的代码。 3、 在移植过程中,定时器、中断、CACHE管理、MMU等和硬件密切相关的地方都是要相关平台的底层代码支持的,要特别注意。 4、 编译内核: 1) 配置内核 make ARCH=arm CROSS_COMPILE=arm-Linux- menuconfig 2) 创建内核依赖关系 make dep 3) 创建内核镜像文件 make zImage 4) 创建内核模块 make modules make modules_install 对每一个配置来说,内核生成以后包括4个文件:没有压缩的内核镜像(zImage或bzImage),压缩的内核镜像(vmlinux),内核符号映射文件(System.map)以及配置文件(config)。 第七章 Linux设备驱动程序开发 1、 设备驱动的任务包括: 1) 自动配置和初始化子程序。这部分程序仅在初始化的时候被调用一次。 2) 服务于I/O请求的子程序。这部分是系统调用的结果。在执行这部分程序的时候,系统仍认为和进行调用的进程属于同一个进程,只是由用户态变成了核心态,并具有进行此系统调用的用户程序的运行环境,所以可以在其中调用sleep()等与进程运行环境有关的函数。 2、 设备类型分类: 1) 字符设备(char device)。字符设备是Linux最简单的设备,可以向文件一样访问。   初始化字符设备时,它的设备驱动程序向Linux登记,并在字符设备向量表中增加一个device_struct数据结构条目,这个设备的主设备标识符用作这个向量表的索引。一个设备的主设备标识符是固定的。chrdevs向量表中的每一个条目,一个device_struct数据结构,包括两个元素:一个登记的设备驱动程序的名称的指针和一个指向一组文件操作的指针。参见include/linux/major.h。 2) 块设备(block device)。是文件系统的物质基础,它也支持像文件一样被访问。   Linux用blkdevs向量表维护已经登记的块设备文件。它像chrdevs向量表一样,使用设备的主设备号作为索引。它的条目也是device_struct数据结构。与字符设备不同的是,块设备分为SCSI类和IDE类。类向Linux内核登记并向河心提供文件操作。一种块设备类的设备驱动程序向这种类提供和类相关的接口。参见fs/devices.c。 每一个块设备驱动程序必须提供普通的文件操作接口和对于buffer cache的接口。每一个块设备驱动程序填充blk_dev向量表中的blk_dev_struct数据结构。这个向量表的索引还是设备的主设备号。这个blk_dev_struct数据结构包括一个请求例程的地址和一个指针,指向一个request数据结构的列表,每一个都表达buffer cache向设备读/写一块数据的一个请求。参见drivers/block/ll_rw_blk.c和include/linux/blkdev.h。 当buffer_cache从一个已登记的设备读/写一块数据,或者希望读写一块数据到其他位置时,他救灾blk_dev_struct中增加一个request数据结构。每个request数据结构都有一个指向一个或多个buffer_head数据结构的指针,每一个都是读/写一块数据的请求。如果buffer_head数据结构被锁定(buffer_cache),可能会有一个进程在等待这个缓冲区的阻塞进成完成。每一个request数据结构都是从all_request表中分配的。如果request增加到空的request列表,就调用驱动程序的request函数处理这个request队列,否则驱动程序只是简单的处理request队列中的每一个请求。 块设备驱动程序和字符设备驱动程序的主要区别是:在对字符设备发出读写请求时,实际的硬件I/O一般紧接着就发生了,块设备则不然,它利用一块系统内存作为缓冲区,当用户进程对设备请求能满足用户的要求时,就返回请求的数据,如果不能就调用请求函数来进行实际的I/O操作。块设备是主要针对磁盘等慢速设备的,以免耗费过多地CPU时间来等待。 3) 网络设备。 3、 设备驱动中关键数据结构: 1) file_operations:内核内部通过file结构识别设备,通过file_operations数据结构提供文件系统的入口点函数。file_operations定义在中的函数指针表。这个结构的每一个成员的名字都对应着一个系统调用。从某种意义上说,写驱动程序的任务之一就是完成file_operations中的函数指针。如果在2.4版本内核下开发的驱动很可能在2.6版本中无法使用,需要进行移植。 2) inode:文件系统处理的文件所需要的信息在inode(索引节点)中。 3) file:主要用于与文件系统对应的设备驱动程序使用。 第八章 网络设备驱动程序开发 1、 网络设备使用网络接口管理表dev_base。dev_base是一个指向device结构的指针,因为网络设备是通过device数据结构来表示的。 2、 网络驱动程序必须解决的两个问题: 1) 不是所有建立在Linux内核的网络设备驱动程序都会有控制的设备。 2) 系统中的以太网设备总是叫做/dev/eth0到/dev/eth7,而不管底层的设备驱动程序是什么。当驱动程序找到它的以太网设备时,它就填充它现在拥有的ethn的device数据结构。这时网络驱动程序也要初始化它控制的物理硬件,并找出它使用的IRQ、DMA等。一旦所有的8个标准的/dev/ethn都分配了,就不会再探测更多的以太网设备。 3、 两个重要的数据结构: 1) device:这个数据结构是在系统中每一个设备的代表,它提供了多个设备方法,供操作系统或协议层使用。这其中就包括设备初始化时调用的init函数、打开和关闭设备的open和stop函数、处理数据包发送的hard_start_xmit函数等。 2) sk_buff:Linux网络各层之间的数据传送都是通过sk_buff(套接字缓冲区)完成的。每个sk_buff包括一些控制方法和一块数据缓冲区,这个区域存放了网络传输的数据包。控制方法按功能分为两种类型,一种是控制整个buffer链的方法,另一种是控制数据缓冲区的方法。sk_buff组成双向链表的形式,对链表的操作主要是删除链表头的元素和添加到链表尾。sk_buff数据结构再include/linux/skbuff.h文件中定义。 4、 内核的驱动程序接口: 1) 打开函数net_open:执行"ifconfig eth0 up"命令时网络层调用它,把设备连到线路上并启用来接受/发送数据。open函数在网络设备驱动程序里是网络设备被激活的时候被调用的,即设备状态由down至up。所以实际上很多在初始化的工作可以放到这里来做。 2) 关闭函数net_close:执行"ifconfig eth0 down"时使网卡进入一个清醒的状态。如果硬件许可那么它会释放中断和DMA通道,并完全关闭以节约能源。 3) 探测函数probe/probe1:在启动时调用以检测网卡存在与否。如果可以通过读取内存等非强制手段进行检查最好,也可以从I/O端口读取。在探测函数的最后它会填充device结构各域。 4) 发送函数:它与dev->hard_start_xmit()连接,在内核想通过设备传送数据时调用它。如果发送成功,hard_start_xmit()方法里释放sk_buff,返回0,否则返回1。如果dev->tbusy置为非0,则系统认为硬件忙,要等到dev->tbusy置0后才会再次发送;也可以不置dev->tbusy为非0,这样系统会不断尝试重发。tbusy的置0任务一般由中断完成,然后用mark_bh()调用通知系统可以再次发送。 5) 接收函数:它把数据从硬件移出,放在sk_buff结构中,执行netif_rx(sk_buff)告诉内核数据所在位置。真正的处理是在中断返回之后,这样可以减少中断时间。在协议层,接收数据包的流程控制分两个层次:首先,netif_rx()函数限制了从物理层到协议层的数据帧的数量;然后,每一个套接字都有一个队列,限制从协议层到套接字层的数据帧的数量。 6) 中断处理函数:需要了解相关的中断状态位以进行相应的操作。 7) 其他函数。 第九章 USB驱动程序开发 1、 OHCI简介:    OHCI规范定义了两个主机控制器(HC)与主机控制器驱动(HDC)的通信通道(Communication Channel)。第一个为主机控制器操作寄存器,第二个为主机控制器通信域(Host Controller Communications Area, HCCA)。    OHCI规范支持USB四种数据通信方式,并根据数据传输特定,将中断数据传输和等时数据传输归为同一类周期性数据传输方式。在HCCA中定义了4个链表。其中除完成数据链表外,其他的周期性数据链表、控制传输数据链表和批量传输数据链表都是二维链表。每个ED(Endpoint Descriptor)描述USB设备的一个端点的所有的数据传输,所有的ED被连接在一起,而TD(Transfer Descriptor)描述的才是最终要在USB总线上传输的数据包。属于同一个USB设备的端点的TD被连接在一起,并挂在相应的ED上。    主机控制器硬件通过寄存器访问该链表来得到相关的USB传输数据包,并将其发送到USB总线上。主机控制器驱动程序则根据实际的数据传输需要,将要发送的数据包添加到相应的链表上。    OHCI定义了两类TD:通用TD(General TD)和等时TD(Isochronous TD)。通用TD被用来支持USB中断、批量和控制三类传输方式,而等时TD被用来支持USB等时数据传输。用一个单独类型的TD来实现USB等时数据传输的目的是为了方便实现DMA数据传输功能。 2、 Linux下USB系统文件节点:同其他外设一样,上层应用软件对连接在系统地USB设备访问是通过文件系统的形式进行的。每个连接到系统总线上的USB设备可以同时对应有一个或者多个驱动程序。即一个USB设备可以在Linux系统上形成一个或多个设备节点,以供应用程序使用。在Linux系统上,每个设备节点都有其相关的主设备号和次设备号。 3、 USB主机驱动结构:Linux USB主机驱动由三部分组成: 1) USB主机控制器驱动(HCD):是USB主机驱动程序中直接与硬件交互的软件模块,其主要功能有:主机控制器硬件初始化;为USBD层提供相应的接口函数;提供根HUB(ROOT HUB)设备配置、控制功能;完成4种类型的数据传输等。 2) USB驱动(USBD):是整个USB主机驱动的核心,其主要实现的功能有:USB总线管理、USB总线设备、USB总线带宽管理、USB的4种类型数据传输、USB HUB驱动、为USB设备类驱动提供相关接口、提供应用程序访问的USB系统的文件接口等。 3) USB设备类驱动:是最终与应用程序交互的软件模块,其主要实现的功能有:访问特定的USB设备、为应用程序提供访问接口等。    应用程序首先通过文件系统(POSIX)接口来访问相应的USB设备类驱动程序和USBD;USB设备类驱动程序则通过USBD提供的相关接口将数据请求包传递给USBD;USBD通过HCD提供的接口,进一步将数据包传递给HCD;HCD最终将数据发送到USB总线上。Linux定义了通用的数据结构URB用来在USB设备类驱动和USBD,USBD和HCD间进行数据传输。统一的URB(Universal Request Block)结构为usb主机驱动程序的开发带来了很大方便。 4、 USB时序: 1) 数据传输时序:在USB总线上,所有的数据传输都是由USB HOST发起的。每个USB设备通过地址过滤出自己要接受的数据包,并根据数据包请求的类型与USB HOST进行数据传输。由于数据传输的时序和总线带宽问题,当应用程序通过设备类提供一个URB时,该数据包并不能立即被送到USB总线上,而只能在USB总线上有足够带宽的情况下,该数据请求才会被传输。因而,HCD层为不同类型的数据传输维护了相应的数据链,当数据链上的数据包传输结束后,HCD通过调用与该数据包相关联的回调函数来通知设备类驱动程序。 2) 设备连接:当一个USB设备连接到USB总线上时,USB HUB驱动程序首先通过中断数据传输获得设备连接信息,然后通过调用USB内核模块所提供的相关函数来完成对USB设备的配置工作。同时USBD不但要为新设备分配在USBD层所需要的资源,同时也要为USB设备分配在HCD层所需要的资源。接着,USBD通过调用所有USB设备类驱动程序提供的Probe函数来查找适合该USB设备的驱动程序。 3) 设备断开:当一个USB设备断开时,USB HUB驱动程序首先通过中断数据传输获得设备断开信息,然后通过调用USB内核模块所提供的相关函数来释放USBD层和HCD层为该设备分配资源。同时通过调用该设备的相关驱动程序提供的Disconnect函数来通知设备驱动程序该设备已经断开。 第十章 图形用户接口 1、 嵌入式系统中几种流行的GUI: 1) MicroWindows; 2) MiniGUI:是我国为数不多的在国际比较知名的自由软件之一。几乎所有的MiniGUI代码都采用C语言开发,提供了完备的多窗口机制和消息传递机制以及众多空间和其他GUI元素。其引人注目的特性和技术创新主要有: * 是一个轻量级的图形系统; * 完善的对中日韩文字、输入法的多字体和多字符集支持 * 提供图形抽象层(GAL)以及输入抽象层(IAL)以适应嵌入式系统各种显示和输入设备 * 提供MiniGUI-Threads、MiniGUI-Lite、MiniGUI-standone三种不同架构的版本以满足不同的嵌入式系统 * 提供了丰富的应用软件,其商业版本提供了手机、PDA类产品、媒体及机顶盒类产品以及工业控制方面的诸多程序; 3) Qt/Embedded:是挪威Trolltech软件公司的产品,Linux桌面系统的KDE就是基于Qt库(不是QtE)开发的。使用QtE苦,开发者可以: * 当移植QtE程序到不同平台时,只需要重新编译代码,而不需要对代码进行修改; * 随意设置程序界面的外观; * 方便地为程序连接数据库; * 使程序本地化; * 将程序与Java集成 同Qt一样,QtE也是用C++写的,虽然这样会增加系统资源消耗,但是却为开发者提供了清晰的程序框架,使开发者能够迅速上手,并且可以方便的编写自定义的用户界面程序。 2、 MiniGUI编程:   它采用类似WINDOWS SDK的窗口和事件驱动机制,MiniGUI的存储空间占用情况如下: 项目 容量 备注 Linux内核 300~500KB 由系统决定 MiniGUI支持库 500~700KB 由编译选项确定 MiniGUI字体、位图等资源 400KB 由应用程序确定,可缩小到200KB以内 GB2312输入法码表 200KB 不是必需的,由应用程序确定 应用程序 1~2MB 由应用程序决定     MiniGUI层次: FrameWork, MMI, Key Apps MiniGUI ANSIC Library Portable Layer Devices Linux/uCLinux, eCos, uC/OS-II, VxWorks, Psos ix86, ARM, MIPS, PowerPC, M68K   MiniGUI是一个典型的消息驱动的GUI系统,每一个MiniGUI程序都从MiniGUIMain函数开始。应用程序先以CreatMainWindow函数创建一个主窗口,由于窗口创建的时候默认是不可见的,所以我们通过ShowWindow函数显现该窗口,最后通过GetMessage(&Msg, hMainWnd)进入消息循环。 3、 Qt/Embedded编程:   Qt是以工具开发包的形式提供给开发者的,这些工具开发包包括了图形设计器、Makefile制作工具、字体国际化工具和Qr的C++类库等。如果不考虑X窗口系统的需要,基于QrE的应用程序可以直接对缓冲帧进行写操作。QtE提供了大约200个可配置的特征,由此再Intel X86平台上库的大小范围为700KB~5MB。大部分客户选择的配置使得库的大小为1.5~4MB。Qt/Embedded与Qt/X11的Linux版本架构比较如下: 应用源代码 Qt API Qt/Embedded Qt/X11 Qt/XLib X Window sever 帧缓冲 Linux内核   信号与插槽机制提供了对象间的通信机制。Qt的窗口在事件发生后会激发信号,程序员通过建立一个函数(称作插槽)然后调用connect()函数把这个插槽和一个信号连接起来,这样就完成了一个事件和响应代码的连接。信号与插槽机制不需要类之间互相知道细节,这样就可以相对容易地开发出代码可高度重用的类。信号与插槽机制是类型安全的,它以警告的方式报告类型错误,而不会使系统产生崩溃。   Qt拥有丰富的满足不同需求的窗体(如按钮、滚动条等)。窗体是QWidget类或它子类的实例,客户自己的窗体类需要从QWidget的子类继承。一个窗体可以包含任意数量的子窗体,子窗体可以显示在父窗体的客户区,一个没有父窗体的窗体称为顶级窗体(一个"窗口"),一个窗体通常有一个边框和标题栏作为装饰。在父窗体无效、隐藏或被删除后,它的子窗体都会进行同样的操作。 第十一章系统设计开发 1、 按照嵌入式系统的工程设计方法,嵌入式系统的设计可以分成7个阶段:产品定义、硬件与软件划分、迭代与实现、详细的硬件与软件设计、硬件与软件集成、接受测试和维护与升级。前三个阶段确定要解决的问题及需要完成的目标,也常被称为"需求阶段";第四阶段主要解决如何在给定的约束条件下完成用户的需求;后三个阶段主要解决如何在所选择的硬件和软件基础上进行整个软/硬件系统的协调实现。 2、 硬件设计主要有以下五个关键步骤: 1) 功能定义; 2) 原理图设计:应尽量做到标准化、通用化、模块化、可扩展化; 3) PCB设计:是硬件设计的难点; 4) 硬件调试; 5) 产品化调整:一个系统的设计样机到产品化是个漫长的过程,单从硬件角度讲,至少要满足功能性、稳定性、可靠性、工艺性等最低要求。 3、 原理图设计中的几点建议: 1) 开关电源和线性电源的优缺点: 优点 缺点 开关电源 * 输入电压范围宽 * 效率高 * 输出功率大 * 应用比较灵活 * 电路相对复杂,外围器件较多 * 对电容电感的要求很高,布线也很讲究 * 开关频率会给系统带来干扰 * 纹波比较难控制 线性电源 * 电路简单,外围器件很少 * 输出精度高,有很好的负载曲线 * 工作在低频状态,不会给系统带来麻烦 * 输入范围比较受限制 * 效率低,这是由于线性电源自身的损耗造成的 * 输出功率相对较小 2) NAND和NOR Flash的速度差异: * NOR得读速度比NAND稍快一些; * NAND的写入速度比NOR快很多; * NAND的4ms擦除速度远比NOR的5s快; * 大多数写入操作需要先进行擦除操作; * NAND的擦除单元更小,相应的擦除电路更少。 4、 PCB设计要点: 1) 元件封装的准备: * 尽量调用标准封装库中的文件; * 严密按照所选器件的数据手册上的规范制作封装,不能忽略累计误差; * 注意二极管、三极管等极性元件及一些非对称元件的引脚定义不能搞错。 2) 合理布局: * 尽量依照参考板的模式进行布局; * 模块化布局; * 要求模拟电路与数字电路分开; * 输入模块与输出模块隔离; * 去隅电容尽量靠近元件的电源/地; * 电源等发热元件要考虑散热,主发热元件靠近出风口,大体积元件的放置避开风路; * 元件分布均匀,避免电流过于密集; * 板上的跳线或按键考虑易操作性; * 元件的排列尽量整齐美观; * 考虑机械尺寸,不要超过结构所允许的范围。 3) PCB分层: * 如果有参考板,按照参考板进行分层; * 多层板安排:顶层和底层为元件面,第二层为地平面,倒数第二层为电源层; * 在不影响性能的情况下,减少PCB层数,降低成本。 4) 电源考虑: * 系统电源入口做高频和低频滤波处理; * 功率较高的器件配备大容量电容去除低频干扰; * 每个器件配备0.1Uf电容过滤高频干扰; * 高频器件电源管脚和电容之间串联磁珠达到更好的效果; * 去耦电容的引线不能过长,特别是高频旁路电容不能带引线。 5) 时钟考虑: * 时钟电路尽量靠近芯片; * 晶体下方不要走线; * 晶体外科接地,增加抗电磁干扰能力; * 频率大于20MHz的时钟信号有地线护送; * 时钟线宽大于10mil; * 时钟输出端串联22~220Ω的阻尼电阻。 6) 高速信号: * 采用手工布线; * 高速总线走线尽量等长,并且在靠近数据输出端串联22~300Ω的阻尼电阻; * 高速信号远离时钟芯片和晶体; * 高速信号远离外部输入输出端口,或地线隔离。 7) 差分信号: * 差分信号要平行等长; * 信号之间不能走其他信号线; * 信号要求在同一层上。 8) 走线规范: * 不同层的信号垂直走线; * 地线和电源层不要走线,否则要保证平面的完整性; * 导线宽度不要突变; * 导线变向时导角要大于90度; * 定位孔周围0.5mm范围不要走线。 5、 硬件调试: * 优先调试电源:保证系统可靠地供电; * 分模块调试:可以分清模块间的问题,不至于混淆; * 结合软件调试:对于复杂的接口,单纯硬件角度不易调试,结合软件从不同的角度测试,能起到更好的效果。 * 正确、合理的使用示波器,提高工作效率; * 对比调试:有条件用评估板或功能相似的电路板作参考,比较差异并找出问题所在; * 系统时钟受干扰或晶体震荡不正常导致系统工作故障; * 复位不可靠,造成个单元未进入预期状态而出现问题; * 因焊接问题引发的各种问题,如方向焊错、虚焊、错焊等; * 因时序不匹配引发的通信故障,如时钟信号通过逻辑器件后产生延时,与读写信号时序搭配不上导致读写错误。 6、 嵌入式文件系统: 目前支持闪存的文件系统技术有以下几种: * JFFS2和Yaffs。这些文件系统可以使用在没有初始化的NAND Flash和有CFI接口的NOR Flash中。JFFS2的特点包括: * 支持数据压缩; * 提供了"写平衡"支持; * 支持多种结点类型; * 提高了对闪存的利用率,降低了闪存的消耗。   JFFS2中最重要的数据结构是jffs2_sb_info,这个数据结构用来管理所有的结点链表和闪存块。它在/src/include/Linux/jffs2_fs_sb.h中定义。   Yaffs/Yaffs2(Yet Another Flash File System)和JFFS相比,它减少了一些功能,因此速度更快、占用内存更少。 * TrueFFS。该文件系统相当于Linux中的MTD层,必须配合其他文件系统。 * FTL/NTFL。它是一种中间层解决方案的统称,为上层文件系统提供接口。 * RAMFS、CRAMFS和ROMFS。这些文件系统用于早期的小容量闪存设备,系统功能比较简单,仅提供基本接口,只属于只读的闪存文件系统。适合存储空间小的系统。 7、 MTD简介: 无论JFFS2还是Yaffs,都需要MTD(Memory Technology Devices,内存技术设备)的支持。MTD是对Flash操作的接口,提供了一系列的标准函数,将硬件驱动设计和系统程序设计分开,硬件驱动人员不用了解存储设备的组织方法,只需提供标准的函数调用,如读、写等。 一个MTD原始设备可以通过mtd_part分割成数个MTD原始设备注册进mtd_table,mtd_table中的每个MTD原始设备都可以被注册成一个MTD设备,
    18. 好像是编译器的原因,一开始随便aaa给它赋个值(不要用位操作赋值),试试看。
    19. 串口资料的无奈 6/5950 单片机 2008-03-17
      多机通讯我肯定是说通讯方式2和3了。 如果其他我好几本书,不可能看不出来。 通讯方式0只能当移位输出
    20. 正在学DSP,但发觉DSP却用处不大!前途也~~ 10/14411 DSP 与 ARM 处理器 2008-03-05
      TI是美国硅谷的象征之一. DSP是TI的主要收入.

最近访客

< 1/2 >

统计信息

已有9857人来访过

  • 芯积分:-87
  • 好友:--
  • 主题:283
  • 回复:163

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言