EDN首页   博客首页 用户登陆  |  注册
aaa
发表于 2007/3/20 13:15:24

3

关于投票

LwIp的中文手册

鉴于很多人需要这个手册,我也就不吝啬得发上来,希望大家喜欢!~

LwIp的中文手册

pdf

系统分类: 通信网络  |  用户分类: 转贴  |  标签: LwIp 中文手册 tcp ip 通信协议  |  来源: 整理  | 

点击查看原文

发表评论 阅读全文(3332) | 回复(5)

发表于 2006/11/14 17:45:32

2

关于投票

基于linux的嵌入式无线可视门铃系统的设计

基于linux的嵌入式无线可视门铃系统的设计

来源:电子查询网  作者:许昌满 成志峰等
 1引言


  在当前的电子行业中,无线技术已经渗透到方方面面,无论是电视机的遥控设备,还是计算机的外围设备都是如此,有的键盘和鼠标甚至也使用了无线技术。无线网络技术已经成为热门技术。无线网络产品广泛应用于家庭网络、小型办公室、会展中心、体育中心、飞机厂、医院、学校、港口、住宅小区、酒店、宽带接入。它使人们在
Internet应用中摆脱了无穷无尽电线电缆的束缚,进入真正的无网不在的Internet自由空间。无线网络技术可望成为新的经济增长点。


  近几年来
, 随着市场上智能化楼宇的不断升温, 门铃系统已作为智能化办公室和智能化住宅小区的一个重要组成部分,被各商家和用户所接受。人们已开始习惯用门铃系统代替传统的铁钥匙去管理各通道门, 这使门铃系统得到了飞跃性的发展。在2000, 全世界的门铃系统销量比1999增长了接近10,占整个安防市场的40%

 

2、 linux操作系统介绍


  linux
是一种很受欢迎的操作系统,它与UNIX系统兼容,开放源代码,它原本被设计为桌面系统,现在广泛应用于服务器领域。而更大的影响在于它正逐渐的应用于嵌入式设备。但是它仍保持了桌面Linux操作系统的主要的优点,如稳定性、强大的网络功能和出色的文件系统支持等。linux有一个完整的TCP/IP协议栈,同时对其他许多的网络协议都提供支持。


  这些网络协议都在
linux上得到了很好的实现。linux可以称作是一个针对嵌入式系统的优秀网络操作系统。linux以其优异的性能、免费开放的代码等优点,博得众多嵌入式开发者的青睐,和过去基于简单RTOS甚至没有使用任何操作系统的嵌入式程序设计相比,基于Linux这样的成熟的、高效的、健壮的、可靠的、模块化的、易于配置的操作系统来开发自己的应用程序,无疑能进一步提高效率,并具有很好的可移植性。

 

3、 无线可视门铃系统原理框图

点击看大图

         图2、无线可视门铃系统服务器端的原理框图

31无线可视门铃服务器端基本工作原理


  无线可视门铃是一个基于高性能嵌入式处理器和硬件实时编解码芯片,结合

linux操作系统,由服务器端和客户端两部分组成的系统。主要实现音频视频的高质量编解码和网络转发功能,服务器端具体实现功能如下:


  
CCD Sensor和音视频端口进来的输入信号,经过视频A/D和音频A/D转换后,进行MPEG4视频编码和MPEG MP3音频编码。编码后的视音频码流送到网络复用模块打包后,经过802.11x无线网络送到客户端。具体功能如下:


  1
)基于IDT RC32434高性能嵌入式处理器等硬件系统的加电自举Boot Loader功能,具有系统硬件初始化和检测,嵌入式操作系统或用户程序的装载启动功能。

  2.在嵌入式操作系统环境下,对以VW2010为核心的A/V模块进行初始化配置和VW2010驱动程序加载。

  3.对模拟音频视频进行A/D转换,并以MPEG-4的格式进行压缩编码。

  4.将压缩编码后的数据流通过无线网络进行转发。

  5)可以对压缩编码后的数据流/文件进行保存,对输入的压缩编码音频/视频文件进行


  解码和模拟音频视频播放输出。


3
2无线可视门铃客户端基本工作原理

点击看大图

           图3、无线可视门铃系统客户端的原理框图

由无线网络接收的传送流数据,经过网络解复用模块解复用后,获得的视频码流和音频码流分别送至视频解码模块和音频解码模块进行MPEG4视频解码 MPEG MP3音频解码。解码后的数据经过视频模拟编码、D/A和音频D/A转换后送到可视终端进行显示。

 

4、无线可视门铃系统设计


4.1
系统设计原理


  系统设计包括硬件和软件。硬件主要分控制系统和输入、输出数据源三部分。输入、输出数据源可以是
IDE接口设备(如硬盘)或网络端口。控制系统对系统各部分进行监测和控制、完成数据流的传输等。控制系统主要由主控芯片、FlashSRAM组成。主控芯片通过PCI总线控制系统其他模块,是控制系统的核心;Flash里固化嵌入式Linux操作系统,存放应用软件和备份数据;SDRAM作为内存供系统运行使用。MPEG-4硬件编、解码系统采用硬编、解码方式,负责将输入的MPEG-4数据流编、解码成普通的电视信号,其核心是编、解码芯片。为解决数据流不稳定的问题,编、解码芯片通常使用SDRAM进行数据缓冲才可以保证正常编、解码过程。


  软件主要包括嵌入式
Linux移植、编、解码驱动和应用程序编写。嵌入式Linux移植到由主控芯片Flash控制器控制的Flash里,操作系统程序文件分成五个主要部分:bootloaderkernelramdiskusrboot_param,分别放在Flash内的五个模块中。根据不同模块的具体功能采用不同的文件方式:bootloaderkernelramdiskboot param,开发好后不需要动态改变,且容量小,使用节省空间的ROMFS只读文件系统,usr模块内容较多并需要进行读写操作,要使用支持动态擦写保存的JFFS文件系统。


4.2
系统硬件设计

  
系统的硬件设计主要分两部分:数据源接口设计、控制系统设计。数据流先要从数据源经数据源接口送至PCI总线,此系统数据源接口为PCI总线上的PCIIDE桥芯片和网络控制芯片。


  控制系统调配系统资源、控制系统各个部分以及数据流的传输。主控芯片采用
IDT RC32434。它是一款64MIPS,内部集成了NAND Flash控制器(FlashC)32PCI总线控制器(PCIC)4通道DMA控制器、4通道SDRAM控制器(SDRAMC)、外部总线控制器(EBUSC)、外部总线接口(EBUSI)以及2个通用串口等,并通过内部总线对它们分别进行控制。其工作主频400MHz,处理速度快,功能强,性价比高,能很好满足嵌入式Linux系统的需求。


  MIPS
通过内部的FlashCSDRAMC实现对外围FlashSDRAM的控制,其中SDRAM的数据地址线要与外部总线控制接口(EBUSI)连接,Flash的数据地址线连接到对应的FlashC的数据地址端口。MIPS通过PCI总线控制器(PCIC)控制其他PCI接口设备。


4.3
系统软件设计


  本系统软件设计主要分为嵌入式
Linux操作系统内核移植、编码和解码芯片、PCI桥芯片及网口等系统驱动程序编写和解码应用程序的编写,其体系结构及与硬件的关系如图6所示。


  嵌入式
Linux操作系统是用户控制系统的硬件平台,系统驱动程序采用模块化形式,向上为用户层的应用程序提供API函数,向下通过系统硬件API函数控制系统硬件。编、解码驱动模块采用实时加载方式,其他如网口、I2CPCIIDE接口等驱动通用性强,直接编译入内核。编、解码应用程序则实现系统MPEG-4数据流的传输和编、解码。7和图8分别是无线可视门铃服务器端和客户端主程序流程图。

点击看大图

5、系统软件原理图

6 无线可视门铃服务器端主程序流程图

7 无线可视门铃客户端主程序流程图

 

5、 结论


  上述介绍了一种嵌入式无线可视门铃系统,该系统采用硬件编、解码方式实现
IDE接口设备或网络端口输入和输出的MPEG-4码流。系统采用64MIPS芯片IDT RC32434作为主控制器,以VW2010作为MPEG-4编、解码芯片;采用嵌入式Linux作为操作系统和模块化的VW2010驱动程序,编、解码应用程序简单实用,可扩展性强。实验证明此系统可广泛用于IP电视、卫星电视、无线可视门铃和基于MPEG-4标准的数字电视广播系统中,应用前景十分广阔。

系统分类: 嵌入式  |  用户分类: 转贴  |  标签: linux嵌入式 嵌入式 可视门铃 系统设计 无线  |  来源: 无分类  | 

点击查看原文

发表评论 阅读全文(1340) | 回复(0)

发表于 2006/11/14 17:38:37

2

关于投票

嵌入式软件测试的十大秘诀

嵌入式软件测试的十大秘诀

来源:bbs.21ic.com 人才聘任  作者:bjfarsight 转
 

    在嵌入式软件开发过程中,一般来说,花在测试和花在编码的时间比为3:1(实际上可能更多)。这个比例随着你的编程和测试水平的提高而不断下降,但不论怎样,软件测试对一般人来讲很重要。很多年前,一位开发人员为了对嵌入式有更深层次的理解,向Oracle询问了这样的一个问题:我怎么才能知道并懂得我的系统到底在干些什么呢? Oracle面对这个问题有些吃惊,因为在当时没有人这么问过,而同时代的嵌入式开发人员问的最多的大都围绕“我怎么才能使程序跑的更快”、“什么编译器最好”等肤浅的问题。所以,面对这个不同寻常却异乎成熟的问题,Oracle感到欣喜并认真回复了他:你的问题很有深度很成熟,因为只有不断地去深入理解才有可能不断地提高水平。并且Oracle为了鼓励这位执着的程序员,把10条关于嵌入式软件开发测试的秘诀告诉了他:

  1.懂得使用工具

  2.尽早发现内存问题

  3.深入理解代码优化

  4.不要让自己大海捞针

  5.重现并隔离问题

  6.以退为进

  7.确定测试的完整性

  8.提高代码质量意味着节省时间

  9.发现它,分析它,解决它

  10.利用初学者的思维

  这十条秘诀在业界广为流传,使很多人受益。本文围绕这十条秘诀展开论述。

  1.懂得使用工具

  通常嵌入式系统对可靠性的要求比较高。嵌入式系统安全性的失效可能会导致灾难性的后果,即使是非安全性系统,由于大批量生产也会导致严重的经济损失。这就要求对嵌入式系统,包括嵌入式软件进行严格的测试、确认和验证。随着越来越多的领域使用软件和微处理器控制各种嵌入式设备,对门益复杂的嵌入式软件进行快速有效的测试愈加显得重要。

  就象修车需要工具一样,好的程序员应该能够熟练运用各种软件工具。不同的工具,有不同的使用范围,有不同的功能。使用这些工具,你可以看到你的系统在干些什么,它又占用什么资源,它到底和哪些外界的东西打交道。让你郁闷好几天的问题可能通过某个工具就能轻松搞定,可惜你就是不知道。那么为什么那么多的人总是在折腾个半死之后才想到要用测试工具呢?原因很多,主要有两个。一个是害怕,另一个是惰性。害怕是因为加入测试用具或测试模块到代码需要技巧同时有可能引入新的错误,所以他们总喜欢寄希望于通过不断地修改重编译代码来消除bug,结果却无济于事。懒惰是因为他们习惯了使用printf之类的简单测试手段。下面来介绍一些嵌入式常用的测试工具。

  .源码级调试器[Source-level Debugger]

  这种调试器一般提供单步或多步调试、断点设置、内存检测、变量查看等功能,是嵌入式调试最根本有效的调试方法。比如VxWorks TornadoII提供的gdb就属于这一种。

  .简单实用的打印显示工具[printf]

  printf或其它类似的打印显示工具估计是最灵活最简单的调试工具。打印代码执行过程中的各种变量可以让你知道代码执行的情况。但是,printf对正常的代码执行干扰比较大(一般printf占用CPU比较长的时间),需要慎重使用,最好设置打印开关来控制打印。

  .ICE或JTAG调试器[In-circuit Emulator]

  ICE是用来仿真CPU核心的设备,它可以在不干扰运算器的正常运行情况下,实时的检测CPU的内部工作情况。像桌面调试软件所提供的:复杂的条件断点、先进的实时跟踪、性能分析和端口分析这些功能,它也都能提供。ICE一般都有一个比较特殊的CPU,称为外合(bond-out)CPU。这是一种被打开了封装的CPU,并且通过特殊的连接,可以访问到CPU的内部信号,而这些信号,在CPU被封装时,是没法“看到”的。当和工作站上强大的调试软件联合使用时,ICE就能提供你所能找到的最全面的调试功能。但ICE同样有一些缺点:昂贵;不能全速工作;同样,并不是所有的CPU都可以作为外合CPU的,从另一个角度说,这些外合CPU也不大可能及时的被新出的CPU所更换。JTAG(Joint Test Action Group)虽然它最初开发出来是为了监测IC和电路连接,但是这种串行接口扩展了用途,包括对调试的支持。AD公司为Blackfin设计的Visual Dsp++就支持高速的JTAG调试。

  .ROM监视器[ROM Monitor]

  ROM监控器是一小程序,驻留在嵌入系统ROM中,通过串行的或网络的连接和运行在工作站上的调试软件通信。这是一种便宜的方式,当然也是最低端的技术。它除了要求一个通信端口和少量的内存空间外,不需要其它任何专门的硬件。并提供了如下功能:下载代码、运行控制、断点、单步步进、以及观察、修改寄存器和内存。因为ROM监控器是操作软件的一部分,只有当你的应用程序运行时,它才会工作。如果你想检查CPU和应用程序的状态,你就必须停下应用程序,再次进入ROM监控器。

  .Data监视器[Data Monitor]

  这种监视器在不停止CPU运行的情况下不仅可以显示指定变量内容,还可以收集并以图形形式显示各个变量的变化过程。

  .OS监视器[Operating System Monitor]

  操作系统监视器可以显示诸如任务切换、信号量收发、中断等事件。一方面,这些监视器能够为你呈现事件之间的关系和时间联系;另一方面,还可以提供对信号量优先级反转、死锁和中断延时等问题的诊断。

  .性能分析工具[Profiler]

  可以用来测试CPU到底耗在那里。profiler工具可以让你知道系统的瓶颈在那里、CPU的使用率以及需要优化的地方。

  .内存测试工具[Memory Teseter]

  可以找到内存使用的问题所在,比如内存泄露、内存碎片、内存崩溃等问题。如果发现系统出现一些不可预知的或间歇性的问题,就应该使用内存测试工具测测看。

  .运行跟踪器[Execution Tracer]

  可以显示CPU执行了哪些函数、谁在调用、参数是什么、何时调用等情况。这种工具主要用于测试代码逻辑,可以在大量的事件中发现异常的那些。

  .覆盖工具[Coverage Tester]

  主要显示CPU具体执行了那些代码,并让你知道那些代码分支没有被执行到。这样有助于提高代码质量并消除无用代码。

  .GUI测试工具[GUI Tester]

  很多嵌入式应用带有某种形式的图形用户界面进行交互,有些系统性能测试足根掘用户输入响应时间进行的。GUI测试工具可以作为脚本工具有开发环境中运行测试用例,其功能包括对操作的记录和回放、抓取屏幕显示供以后分析和比较、设置和管理测试过程(Rational公司的robot和Mercury的Loadrunner工具是杰出的代表)。很多嵌入式设备没有GUI,但常常可以对嵌入式设备进行插装来运行GUI测试脚本,虽然这种方式可能要求对被测代码进行更改,但是节省了功能测试和回归测试的时间。

  .自制工具[Home-made tester]

  在嵌入式应用中,有时候为了特定的目的,需要自行编写一些工具来达到某种测试目的。本人曾经编写的视频流录显工具在测试视频会议数据流向和变化上帮了大忙,帮公司找到了几个隐藏很深的bug。

  2.尽早发现内存问题

  内存问题危害很大,不容易排查,主要有三种类型:内存泄露、内存碎片和内存崩溃。对于内存问题态度必须要明确,那就是早发现早“治疗”。在软件设计中,内存泄露的“名气”最大,主要由于不断分配的内存无法及时地被释放,久而久之,系统的内存耗尽。即使细心的编程老手有时后也会遭遇内存泄露问题。有测试过内存泄露的朋友估计都有深刻地体验,那就是内存泄露问题一般隐藏很深,很难通过代码阅读来发现。有些内存泄露甚至可能出现在库当中。有可能这本身是库中的bug,也有可能是因为程序员没有正确理解它们的接口说明文档造成错用。

  在很多时候,大多数的内存泄露问题无法探测,但可能表现为随机的故障。程序员们往往会把这种现象怪罪于硬件问题。如果用户对系统稳定性不是很高,那么重启系统问题也不大;但,如果用户对系统稳定很高,那么这种故障就有可能使用户对产品失去信心,同时也意味着你的项目是个失败的项目。由于内存泄露危害巨大,现在已经有许多工具来解决这个问题。这些工具通过查找没有引用或重复使用的代码块、垃圾内存收集、库跟踪等技术来发现内存泄露的问题。每个工具都有利有弊,不过总的来说,用要比不用好。总之,负责的开发人员应该去测试内存泄露的问题,做到防患于未然。

  内存碎片比内存泄露隐藏还要深。随着内存的不断分配并释放,大块内存不断分解为小块内存,从而形成碎片,久而久之,当需要申请大块内存是,有可能就会失败。如果系统内存够大,那么坚持的时间会长一些,但最终还是逃不出分配失败的厄运。在使用动态分配的系统中,内存碎片经常发生。目前,解决这个问题最效的方法就是使用工具通过显示系统中内存的使用情况来发现谁是导致内存碎片的罪魁祸首,然后改进相应的部分。

  由于动态内存管理的种种问题,在嵌入式应用中,很多公司干脆就禁用malloc/free的以绝后患。

  内存崩溃是内存使用最严重的结果,主要原因有数组访问越界、写已经释放的内存、指针计算错误、访问堆栈地址越界等等。这种内存崩溃造成系统故障是随机的,而且很难查找,目前提供用于排查的工具也很少。

  总之,如果要使用内存管理单元的话,必须要小心,并严格遵守它们的使用规则,比如谁分配谁释放。

  3.深入理解代码优化

  讲到系统稳定性,人们更多地会想到实时性和速度,因为代码效率对嵌入式系统来说太重要了。知道怎么优化代码是每个嵌入式软件开发人员必须具备的技能。就象女孩子减肥一样,起码知道她哪个地方最需要减,才能去购买减肥药或器材来减掉它。可见,代码优化的前提是找到真正需要优化的地方,然后对症下药,优化相应部分的代码。前面提到的profile(性能分析工具,一些功能齐全IDE都提供这种内置的工具)能够记录各种情况比如各个任务的CPU占用率、各个任务的优先级是否分配妥当、某个数据被拷贝了多少次、访问磁盘多少次、是否调用了网络收发的程序、测试代码是否已经关闭等等。

  但是,profile工具在分析实时系统性能方面还是有不够的地方。一方面,人们使用profile工具往往是在系统出现问题即CPU耗尽之后,而profile工具本身对CPU占用较大,所以profile对这种情况很可能不起作用。根据Heisenberg效应,任何测试手段或多或少都会改变系统运行,这个对profiler同样适用!

  总之,提高运行效率的前提是你必须要知道CPU到底干了些什么干的怎么样。

  4.不要让自己大海捞针

  大海捞针只是对调试的一种生动比喻。

  经常听到组里有人对自己正在调试的代码说shit!可以理解,因为代码不是他写的,他有足够的理由去shit bug百出的代码,只要他自己不要写出这种代码,否则有一天同组的其它人可能同样会shit他写的代码。为何会有大海捞针呢?肯定是有人把针掉到海里咯;那针为何会掉在海里呢?肯定是有人不小心或草率呗。所以当你在抱怨针那么难找的时候,你是否想过是你自己草率地丢掉的。同样,当你调试个半死的时候,你是否想过你要好好反省一下当初为了寻求捷径可能没有严格地遵守好的编码设计规范、没有检测一些假设条件或算法的正确性、没有将一些可能存在问题的代码打上记号呢?关于如何写高质量请参考林锐的《高质量c++/c编程指南》或《关于C的0x8本“经书”》。

  如果你确实已经把针掉在海里是,为了防止在找到之前刺到自己,你必须要做一些防范工作,比如戴上安全手套。同样,为了尽能地暴露和捕捉问题根源,我们可以设计比较全面的错误跟踪代码。怎么来做呢?尽可能对每个函数调用失败作出处理,尽可能检测每个参数输入输出的有效性包括指针以及检测是否过多或过少地调用某个过程。错误跟踪能够让你知道你大概把针掉在哪个位置。

  5.重现并隔离问题

  如果你不是把针掉在大海了,而是掉在草堆里,那要好办写。因为至少我们可以把草堆分成很多块,一块一块的找。对于模块独立的大型项目,使用隔离方法往往是对付那些隐藏极深bug的最后方法。如果问题的出现是间歇性的,我们有必要设法去重现它并记录使其重现的整个过程以备在下一次可以利用这些条件去重现问题。如果你确信可以使用记录的那些条件去重现问题,那么我们就可以着手去隔离问题。怎么隔离呢?我们可以用#ifdef把一些可能和问题无关的代码关闭,把系统最小化到仍能够重现问题的地步。如果还是无法定位问题所在,那么有必要打开“工具箱”了。可以试着用ICE或数据监视器去查看某个可疑变量的变化;可以使用跟踪工具获得函数调用的情况包括参数的传递;检查内存是否崩溃以及堆栈溢出的问题。

  6.以退为进

  猎人为了不使自己在森林里迷路,他常常会在树木上流下一些标记,以备自己将来有一天迷路时可以根据这些标记找到出路。对过去代码的修改进行跟踪记录对将来出现问题之后的调试很有帮助。假如有一天,你最近一次修改的程序跑了很久之后忽然死掉了,那么你这时的第一反映就是我到底改动了些什么呢,因为上次修改之前是好的。那么如何检测这次相对于上次的修改呢?没错,代码控制系统SCS或称版本控制系统VCS(Concurrent Version Control,CVS是VCS的演化版本)。将上个版本check in下来后和当前测试版本比较。比较的工具可以是SCS/VCS/CVS自带的diff工具或其它功能更强的比较工具,比如BeyondCompare和ExamDiff。通过比较,记录所有改动的代码,分析所有可能导致问题的可疑代码。

  7.确定测试的完整性

  你怎么知道你的测试有多全面呢?覆盖测试(coverage testing)可以回答这个问题。覆盖测试工具可以告诉你CPU到底执行了那些代码。好的覆盖工具通常可以告诉你大概20%到40%代码没有问题,而其余的可能存在bug。覆盖工具有不同的测试级别,用户可以根据自己的需要选择某个级别。即使你很确信你的单元测试已经很全面并且没有dead code,覆盖工具还是可以为你指出一些潜在的问题,看下面的代码:

  if (i >= 0 && (almostAlwaysZero == 0 || (last = i)))

  如果almostAlwaysZero为非0,那么last="i"赋值语句就被跳过,这可能不是你所期望的。这种问题通过覆盖工具的条件测试功能可以轻松的被发现。

  总之,覆盖测试对于提高代码质量很有帮助。

  8.提高代码质量意味着节省时间

  有研究表明软件开发的时间超过80%被用在下面几个方面:

  .调试自己的代码(单元测试)

  .调试自己和其他相关的代码(模块间测试)

  .调试整个系统(系统测试)

  更糟糕的是你可能需要花费10-200倍的时间来找一个bug,而这个bug在开始的时候可能很容易就能找到。一个小bug可能让你付出巨大的代价,即使这个bug对整个系统的性能没有太大的影响,但很可能会影响让那些你可以看得到的部分。所以我们必须要养成良好的编码和测试手段以求更高的代码质量,以便缩短调试的代码。

  9.发现它,分析它,解决它

  这世界没有万能的膏药。profile再强大也有力不从心的时候;内存监视器再好,也有无法发现的时候;覆盖工具再好用,也有不能覆盖的地方。一些隐藏很深的问题即使用尽所有工具也有可能无法查到其根源,这时我们能做的就是通过这些问题所表现出来的外在现象或一些数据输出来发现其中的规律或异常。一旦发现任何异常,一定要深入地理解并回溯其根源,直到解决为止。

  10.利用初学者的思维

  有人这样说过:“有些事情在初学者的脑子里可能有各种各样的情况,可在专家的头脑里可能就很单一”。有时候,有些简单的问题会被想的很复杂,有些简单的系统别设计的很复杂,就是由于你的“专家思维”。当你被问题难住时,关掉电脑,出去走走,把你的问题和你的朋友甚至你的小狗说说,或许他们可以给你意想不到的启发。

  总结:嵌入式调试也是一门艺术。就想其它的艺术一样,如果你想取得成功,你必须具备智慧、经验并懂得使用工具。只要我们能够很好地领悟Oracle这十条秘诀,我相信我们在嵌入式测试方面就能够取得成功。

系统分类: 嵌入式  |  用户分类: 转贴  |  标签: 嵌入式 测试 秘诀 软件测试  |  来源: 无分类  | 

点击查看原文

发表评论 阅读全文(1957) | 回复(3)

发表于 2006/11/13 10:50:11

3

关于投票

电路与男人

电路与男人
1、好的电路看似普通,却具有优秀的工作表现,经得起实际验证 ——优秀的男人也许不善表达,但却能在实际表现中给人满意的成绩;
2、好的电路有很好的稳定性,能够在恶劣的条件下正常工作——优秀的男人在艰苦的环境下仍不忘奋斗和理想;
3、好的电路有很好的噪声抑制功能,能够屏蔽不必要的噪声和干扰——优秀的男人具有坚定的意志,经得起现实中各种非议和诱惑;
4、好的电路带宽较大,可以适合较宽的频率范围——优秀的男人能屈能伸,在低职位和高职位都可以同样出色;
5、好的电路灵敏度够高,不会忽略掉微小的有用信号——优秀的男人能够敏锐的洞察并抓住机会;
6、好的电路功耗低,可以节省客户的资源——优秀的男人不会浪费你的付出和投资;
7、好的电路一旦设计完成,还有可能开发出更多的功能和应用——优秀的男人一旦被发现,就会越来越多的优点呈现;
8、好的电路结构合理,构思巧妙--好的男人深邃内敛,不用光鲜的外表提升自己的身价!
9、好的电路需要有优秀的工程师开发跟欣赏——优秀的男人需要优秀的女人品味和鼓励;
10、好的电路不容易设计——优秀的男人不容易拥有^_^

系统分类: 自由话题  |  用户分类: 转贴  |  标签: 电路 男人  |  来源: 无分类  | 

点击查看原文

发表评论 阅读全文(1232) | 回复(1)

发表于 2006/11/12 0:50:36

7

关于投票

proteldxp快捷键大全

ProtelDXP 快捷键大全

enter——选取或启动
esc——放弃或取消
f1——启动在线帮助窗口
tab——启动浮动图件的属性窗口
pgup——放大窗口显示比例
pgdn——缩小窗口显示比例
end——刷新屏幕
del——删除点取的元件(1个)
ctrl+del——删除选取的元件(2个或2个以上)
x+a——取消所有被选取图件的选取状态
x——将浮动图件左右翻转
y——将浮动图件上下翻转
space——将浮动图件旋转90度
crtl+ins——将选取图件复制到编辑区里
shift+ins——将剪贴板里的图件贴到编辑区里
shift+del——将选取图件剪切放入剪贴板里
alt+backspace——恢复前一次的操作
ctrl+backspace——取消前一次的恢复
crtl+g——跳转到指定的位置
crtl+f——寻找指定的文字
alt+f4——关闭protel
spacebar——绘制导线,直线或总线时,改变走线模式
v+d——缩放视图,以显示整张电路图
v+f——缩放视图,以显示所有电路部件
home——以光标位置为中心,刷新屏幕
esc——终止当前正在进行的操作,返回待命状态
backspace——放置导线或多边形时,删除最末一个顶点
delete——放置导线或多边形时,删除最末一个顶点
ctrl+tab——在打开的各个设计文件文档之间切换
alt+tab——在打开的各个应用程序之间切换
a——弹出edit\align子菜单
b——弹出view\toolbars子菜单
e——弹出edit菜单
f——弹出file菜单
h——弹出help菜单
j——弹出edit\jump菜单
l——弹出edit\set location makers子菜单
m——弹出edit\move子菜单
o——弹出options菜单
p——弹出place菜单
r——弹出reports菜单
s——弹出edit\select子菜单
t——弹出tools菜单
v——弹出view菜单
w——弹出window菜单
x——弹出edit\deselect菜单
z——弹出zoom菜单
左箭头——光标左移1个电气栅格
shift+左箭头——光标左移10个电气栅格
右箭头——光标右移1个电气栅格
shift+右箭头——光标右移10个电气栅格
上箭头——光标上移1个电气栅格
shift+上箭头——光标上移10个电气栅格
下箭头——光标下移1个电气栅格
shift+下箭头——光标下移10个电气栅格
ctrl+1——以零件原来的尺寸的大小显示图纸
ctrl+2——以零件原来的尺寸的200%显示图纸
ctrl+4——以零件原来的尺寸的400%显示图纸
ctrl+5——以零件原来的尺寸的50%显示图纸
ctrl+f——查找指定字符
ctrl+g——查找替换字符
ctrl+b——将选定对象以下边缘为基准,底部对齐
ctrl+t——将选定对象以上边缘为基准,顶部对齐
ctrl+l——将选定对象以左边缘为基准,靠左对齐
ctrl+r——将选定对象以右边缘为基准,靠右对齐
ctrl+h——将选定对象以左右边缘的中心线为基准,水平居中排列
ctrl+v——将选定对象以上下边缘的中心线为基准,垂直居中排列
ctrl+shift+h——将选定对象在左右边缘之间,水平均布
ctrl+shift+v——将选定对象在上下边缘之间,垂直均布
f3——查找下一个匹配字符
shift+f4——将打开的所有文档窗口平铺显示
shift+f5——将打开的所有文档窗口层叠显示
shift+单左鼠——选定单个对象
crtl+单左鼠,再释放crtl——拖动单个对象
shift+ctrl+左鼠——移动单个对象
按ctrl后移动或拖动——移动对象时,不受电器格点限制
按alt后移动或拖动——移动对象时,保持垂直方向
按shift+alt后移动或拖动——移动对象时,保持水平方向

系统分类: PCB  |  用户分类: 转贴  |  标签: protel dxp 快捷键 大全 protel技巧  |  来源: 无分类  | 

点击查看原文

发表评论 阅读全文(2366) | 回复(2)

发表于 2006/11/12 0:30:43

2

关于投票

一个按键的多次击键组合判别技巧汇编源程序(转贴)

一个按键的多次击键组合判别技巧

此文作者不祥,如有知其作者,请告知。


有时在设计中,往往要用一个按键来输入多种信息。如:单击/双击/三击、短击/长击、
还有各种组合击键方式。可以用以下程序来做。
如果按键闭合时间<500MS,判断为一次短击(0);
如果按键闭合时间>500MS,判断为一次长击(1);
两次击键时间间隔应<700MS,如果按键释放后700MS内无键按下,则结束读键。
读键完毕返回一个键号值KEY_NUM。其意义如下:
KEY_NUM        意义
00000000    无键按下过
00000001    无意义
00000010    单次短击
00000011    单次长击
00000100    短击 + 短击
00000101    短击 + 长击
00000110    长击 + 短击
00000111    长击 + 长击
……        ……
10000000    7次短击
11111111    7次长击
上表中的KEY_NUM值的规律是,从左向右看,第一个"1"后面的每一位代表一次击键;"0
"代表短击,"1"代表长击。掌握该规律后,我们可将任何一个8位的二进制数"翻译"成一
种击键组合。例如:01010101,代表的是:短+长+短+长+短+长。
该程序最多可识别7次连续击键,共254种组合。但并非每个程序中用得上。在大多数程
序中,能判断双击即可以了,这时可将程序中的ZHBIT定义为2。同理,如果要判断3次按
键,将ZHBIT定义为3即可。
当ZHBIT="1"时,程序仅能判断一次击键,包括2种组合(短击/长击);当ZHBIT="2"时,程
序还能判断两次击键,包括6(2+4)种组合(短击/长击/(短+短)/(短+长)/(长+短
)/(长+长));以次类推,当ZHBIT="3"时,程序能判断三次击键,包括14(2+4+8)种
组合。
ZHBIT    组合种类
1    2
2    2+4=6
3    2+4+8=14
4    2+4+8+16=30
5    2+4+8+16+32=62
6    2+4+8+16+32+64=126
7    2+4+8+16+32+64+128=254
下面这段程序摘自小匠的一个智能充电器程序(MCU是EM78P458),如下:
;********************************
;读键子程序
;出口:    KEY_NUM    =键号值
;中间:    KEY_DL    =计数器
;说明:
/*
短击:键按下时间<500MS
长击:键按下时间>500MS
两次按键间隔时间<700MS
键号定义:
    KEY_NUM="00000000":    无键按下
    KEY_NUM="00000001":    无意义
    KEY_NUM="00000010":    单次短击
    KEY_NUM="00000011":    单次长击
    KEY_NUM="00000100":    短击 + 短击
    KEY_NUM="00000101":    短击 + 长击
    KEY_NUM="00000110":    长击 + 短击
    KEY_NUM="00000111":    长击 + 长击
    ...
    ...
    KEY_NUM="11111110":    长击 + 长击 + 长击 + 长击 + 长击 + 长击 + 短击
    KEY_NUM="11111111":    长击 + 长击 + 长击 + 长击 + 长击 + 长击 + 长击
*/
    ZHBIT    EQU    2    ;按键组合位(选择范围1~7)
;********************************
READKEY:
    CLR    KEY_NUM        ;清键号
    JKOFF    READKEYF    ;键未按下跳
    BS    KEY_NUM,0    ;"1" -> 键号低位
;=================
READKEYA:
    CLR    KEY_DL        ;清计数器
READKEYB:
    CALL    DL10MS
    INC    KEY_DL
    MOV    A,@50
    SUB    A,KEY_DL
    JBC    R3,C
    JMP    READKEYC    ;计数器溢出跳
    JKON    READKEYB    ;键未释放跳
    BC    R3,C        ;C="0"
    JMP    READKEYD
;=================
READKEYC:
    WDTC            ;喂狗
    JKON    READKEYC    ;键未释放跳
    BS    R3,C        ;C="1"
READKEYD:
    RLLC    KEY_NUM        ;键号左移一位,C -> 键号低位
    JBC    KEY_NUM,ZHBIT    ;按键检测未完成继续
    RET
;=================
    CLR    KEY_DL        ;清计数器
READKEYE:
    CALL    DL10MS
    INC    KEY_DL
    MOV    A,@70
    SUB    A,KEY_DL
    JBC    R3,C
READKEYF:
    RET            ;计数器溢出返回
    JKOFF    READKEYE    ;键未按下跳
    JMP    READKEYA    ;再次检测
;=================
;键闭合跳(宏)
;=================
JKON    MACRO    ADDRESS
    JBS    R5,KEY            ;键断开跳
    FJMP    ADDRESS        ;键闭合跳
    CALL    DL10MS            ;延时去抖动
    JBS    R5,KEY            ;键断开跳
    FJMP    ADDRESS        ;键闭合跳
ENDM
;=================
;键断开跳(宏)
;=================
JKOFF    MACRO    ADDRESS
    JBC    R5,KEY            ;键闭合跳
    FJMP    ADDRESS        ;键断开跳
    CALL    DL10MS            ;延时去抖动
    JBC    R5,KEY            ;键闭合跳
    FJMP    ADDRESS        ;键断开跳
ENDM

系统分类: 单片机  |  用户分类: 转贴  |  标签: 按键 源程序 汇编 单片机源程序 技巧  |  来源: 无分类  | 

点击查看原文

发表评论 阅读全文(1922) | 回复(0)

Total , Page /