嵌入式学习内容有哪些?嵌入式要学什么?
大致分为三个阶段:基础篇、进阶篇、大咖篇。 入门嵌入式工程师此阶段主要是前期的入门过程,主要针对入行没多久的新人。其实成功没有捷径,所以打好基础才是关键。嵌入式开发要学什么主要包含以下4个方面的内容:1.电路知识 首先你要学习电路、模电、数电,认识电阻、电容、三极管,基础器件要知道,放大电路、集成运放、时序电路基本电路能看懂,不然看电路图一定是云里雾里,也就无法进行后续的工作。硬件产品的设计实现,包括器件选型、原理图和PCB设计、电路调试,都需要过硬的电路基础。2.C语言C语言是嵌入式开发中最重要的编程语言,要对这门语言有深入的理解,毕竟不仅仅要会写程序,看懂他人程序也很重要。最基本的数据类型、数组、指针、结构体,链表、文件操作等都要会,掌握基本语法和语句,不然你要能区分指针数组与数组指针吗?3.单片机 单片机入门相对简单,通过单片机的学习可以熟悉单片机的硬件结构,包括I/O口、AD转换、通信(串口、并口、I2C、CAN、USB、以太网、ZigBee技术等)、显示(LED、LCD等)、控制(PWM等控制技术)、数据处理(图形、图像、语音、视频等的处理或识别)等,学好单片机可以为采用嵌入式系统奠定良好的基础。4Linux基础Linux的源码和架构都是开放的,在嵌入式系统中应用尤为广泛,学习Linux对于系统的开发会有很大的帮助。详细了解Linux下的目录结构、基本命令、编辑器VI、编译器GCC、调试器GDB和 Make 项目管理工具,Shell Makefile脚本编写等知识,以及嵌入式开发环境的搭建。中级嵌入式工程师经过第一个阶段的学习,你已经可以进行嵌入式开发工作了,但是要进阶依旧还有很多知识要学,而这个阶段也将是第一个分水岭,使得优秀的嵌入式工程师得以脱颖而出。此阶段虽然只有三项,但涉及的知识非常广,要想学好需要花费大量的精力。1.Linux编程系统编程可以直接跟内核及核心系统程序库对话,深入了解Linux内核。掌握Linux系统编程主要提升对Linux应用开发的理解和代码调试的能力。由于网络应用开发越来越广泛,通过Linux网络发展、TCP/IP协议、socket编程、TCP网络编程、UDP网络编程、Web编程开发等方面入手,可以全面了解Linux网络应用程序开发。2数据结构与算法 数据结构及算法在嵌入式底层驱动、通信协议及各种引擎开发中得到了广泛的应用,语言编译要使用栈、散列表以及语法树;操作系统中用队列、存储管理表及目录树等;数据库系统运用线型表、多链表及索引表进行数据管理等等,对其掌握的好坏直接影响程序的效率、简洁及健壮性。3.QT、DSP、FPGALinux没有自己界面,学习QT编程可以创建艺术级的图形用户界面所需的所有功能,从而更好的实现人机交互控制。而如今用户对于图形图像的要求也越来越高,这就需要DSP、FPGA技术来设计开发更好的嵌入式视觉系统。高级嵌入式工程师学习了前两个阶段的知识,你已经可以胜任大部分嵌入式工作了,但是距离大咖仍有一定的差距,其实已经到了第二个分水岭。这部分更多涉及系统层面,没有全方位的知识将会很难下手。1操作系统平台开发 除了Linux外,嵌入式操作系统还有ARM、WINCE、uC/OS II、Vxworks、uClinux等,不同的系统有着不同的使用环境,你需要学习掌握系统的各个模块,为底层平台搭建做好准备。熟悉各个操作系统的特点以及系统的内核移植,确保操作系统能在某个微处理器或微控制器上运行。随着手机智能硬件的快速兴起,Android操作系统开发也越来越重要。2驱动开发 驱动程序设计是嵌入式Linux开发工作中非常重要的一部分。不仅要熟悉Linux的内核机制、驱动程序与用户级应用程序的接口,掌握系统对设备的并发操作。还要具备ARM硬件接口的基础知识,熟悉ARM Cortex处理器各资源、掌握Linux设备驱动原理框架,以及工程中常见Linux高级字符设备、块设备、网络设备、USB设备的驱动开发。 当你到达这个位置的时候,可以说你已经是一个人生赢家了,而真正的学习过程如同一场漫长的修行,在这个过程中,必定有各种各样的困难。当然了,嵌入式工作中更多的需要实践以及经验的积累,相信守得云开见月明,你也可成为一名优秀的嵌入式工程师。需要嵌入式培训,可以来到华清的星创客精英训练营,专门培训中高端嵌入式工程师。
学习嵌入式开发分两种,单片机无操作系统的,直接对寄存器或者利用库函数操作的。还有可以运行Linux或者安卓操作系统的嵌入式软件系统开发。更推荐粤嵌IT培训,该机构与国内上百所高校成功建立合作伙伴关系,值得信赖。是国内嵌入式学习知名品牌!十余年开发经验的双师型老师(工程师型导师)亲自教学,丰富的育人与研发经验,17年教育与技术沉淀为嵌入式技术学习提供强大教学质量保障!科学的学习管理模式,最大化提升学习效率。 嵌入式开发主要学习内容包括:①C语言,Java核心编程。c语言核心编程,Java核心编程;②Linux核心操作与算法。Linux系统使用,Linux-c编程核心技术,精品数据结构,Linux-c编程精髓;③核心操作与算法。Linux系统编程,Linux网络编程核心技术,UI编程,Java核心编程,安卓核心技术;④ARM+Linux底层开发。数字电路,ARM编程核心,Linux系统开发,嵌入式Linux驱动开发;想要了解更多关于嵌入式开发的更多信息,推荐咨询粤嵌IT培训。粤嵌创立于于2005年,2016年正式挂牌上市,在职员工近800人,其中技术工程师占比超过60%;同时,拥有自主研发产品60多款,拥有发明专利和使用新型专利50多款,拥有软件著作权140多项;专业性强大,助力学员更好的学习。

红外通信协议的在嵌入式系统中的实现
采用Sitronix公司的ST2204电路板为硬件平台,处理芯片内核为65C02。ST2204电路板使用了集成的8位处理器,寻址能力达到了44M字节,并提供了低电压检测功能。由于2204集成了上述这些功能,非常适合省电、支持长电池寿命的手持移动设备嵌入式设计实现方案。在固件设计、软件设计方面采用了汇编语言。65C02上的汇编采用存储器映象方式,并广泛使用了零页寻址,因此使用起来十分方便、高效。整个设计实现可分为硬件设计和软件设计两部分。硬件设计包括电路设计和固件程序(Firmware)的编写;软件设计包括CRC数据编码校验、数据收发及主站(Primary)、辅站(Slave)状态要流程实现等。在硬件设计方面根据对设备的需求和硬件板芯片性能,可以设计出相应的电路在仿真板上进行实验。固件程序和编写可采用分块的方法,例如初始化(Initilize)模块、中断处理(Interrupt)模块、时钟(Timer)事件处理模块等。初始化模块可根据硬件板的指南说明(Specification)提供的各个寄存器值设备初始化参数;中断处理模块可按照中断向量表提供的入口地址编写,其基本要求短小精悍,运行的时钟周期与微处理器频率和设备需求的波特率紧密相关。时钟事情处理可根据硬件板提供的基本时钟设备不同的时钟精度,以满足不同的需求。在红外传输实际设计中定时器主要用于三个方向:第一是sniff探查过程中主站发广播帧后辅站超时未响应的处理;第二是超时重发控制;最后一个是数据传输过程中轮转时间片的控制。其中第三个方面要求的精度比较高,红外协议制定的标准是在25ms~85ms之间。因此有必要把超时处理放在中断处理。在程序编写时使用信号量和程序计数器进行时间控制。其基本思路得设备一个程序计数器进行累加计时,当各自事情时间到达时分别设置三个信号量来标志事件处理,当事件处理完毕后重置各自信号量,转入重新计时。在软件设计方面,要对发送的数据进行帧包装(FrameWrapper),添加CRC16校验,用汇编实现CRC算法比C稍微复杂些。一个主要的技巧是将要进行校验的数据地址和CRC数据表的索引地址置入一个零页的内存地址中,采用通用寄存器对其进行间接寻址。这样就实现了C语言中的指针效果,可以比较方便地查询CRC表。在数据收发应用中,分为主站(Primarystation)和辅站(slavestation)两种角度。主站角度负责发起,建立连接,进行时间片轮转调度等。辅站主要负责应答,响应命令。在一定条件下主站辅站角度可以互换,主辅站均可收发数据。收发数据的中断函数最重要也是底层的核心所在。在接收方首先公进行硬件初始化,设置UART接收初始化状态并进行中断允许标志设置(具体设置可以参考所选择的电路板说明)等。当红外数据到达后即会触发一个UART中断,系统处理完当前事件后便会根据中断向量表提供的入口地址调用接收中断处理接收数据。在接收过程中,UART会搜索匹配开始位和结束标志。接收完毕后,返回系统调用程序。在实际应用中,当接收完数据后,即可安装收帧控制域判断帧类型,并结合接收站所处的相应状态机进行流程处理。下面是红外接收数据的中断程序源码:/********************************************UARTReceiverInterruptServiceRoutine********************************************/ISR_URX:phaphx;压栈,保存通用寄存器值cld;清空十进制标志位ldx#00001100B;允许接收,并设置可以接收下一字节stxldxmBagLencpx#IrDAb_BAG_LEN;一个包的长度bcsferr_over;溢出否ldastamReadBuff,x;写数据ldastamIrdaByteFlag;保存状态标志位incmBagLen;计数器bra?exit?err_over;smb0?exit;plx;出栈,恢复通用寄存器值plaRTI该中断处理程序在硬件收到一个字节时触发。它先将通用寄存器值压栈保存,接下来进行状态寄存器的控制,并检查一些状态标志,然后进行数据的接收;将数据保存在一个缓存里,并进行溢出等状态的检测和控制。最后恢复通用寄存器的值,返回中断调节函数。按照类似的原理可以编写出红外发送方程序。编写数据收发中断程序有一点要注意,程序代码量和处理器主频以及选择的红外波特速率是密切相关的。若不注意就很容易造成“丢中断”的现象,这是应该避免的。还有一点要说明:UART是工作在半双工模式下,在一些实时系统和时间精度要求较高的应用中是不能同时进行收发数据的。但由于其收发时间片较短(最长为500ms),在一些普通应用中可以模拟成同时收发。在程序编写完后对其进行编译/连接定位,用调试器以16进制的形式加载在主机开发系统中即可进行模拟调试。但是模拟调式不能百分之百地模拟硬件的全部特性。它主要用于调试软件逻辑、状态机流程。对于调试UART数据收发等实时性较强的硬件特征还需到目标系统上进行验证。

懂嵌入式的进
目前来说嵌入式软件方向很有前景,最常见的是嵌入式Linux方向。 下面的信息希望对你有所帮助。嵌入式软件方面最重要的课程包括:(1) 嵌入式微处理器结构与应用:这是一门嵌入式硬件基础课程,我们说过,嵌入式是软硬件结合的技术,搞嵌入式软件的人应对ARM处理器工作原理和接口技术有充分了解,包括ARM的汇编指令系统。若不了解处理器原理,怎么能控制硬件工作,怎么能写出节省内存又运行高速的最优代码(嵌入式软件设计特别讲究时空效率),怎么能写出驱动程序(驱动程序都是与硬件打交道的)?很多公司招聘嵌入式软件人员时都要求熟悉ARM处理器,将来若同学到公司中从事嵌入式软件开发,公司都会给你一本该设备的硬件规格说明书 (xxx Specification),你必须能看懂其中的内存分布和端口使用等最基本的说明(就像x86汇编一样),否则怎么设计软件。有些同学觉得嵌入式处理器课程较枯燥,这主要是硬件课程都较抽象的原因。还有同学对ARM汇编不感兴趣,以为嵌入式开发用C语言就足够了。其实不应仅是将汇编语言当成一个程序设计语言,学汇编主要是为了掌握处理器工作原理的。一个不熟悉汇编语言的人,怎么能在该处理器写出最优的C语言代码。在嵌入式开发的一些关键部分,有时还必须写汇编,如Bootloader等(可能还包括BSP)。特别是在对速度有极高要求的场合(如DSP处理器的高速图像采集和图像解压缩),目前还会用到汇编写程序的,尽管用到的机会相对C要小得多。当你在一个嵌入式公司工作时,在查看描述原理的手册时,可能很多都是用汇编描述的,这是因为很多硬件设计人员只会写或者喜欢用汇编描述,此时你就必须看懂汇编程序,否则软硬件人员可能就无法交流。很多嵌入式职位招聘时都要求熟悉汇编。(2) 嵌入式操作系统类课程除了WinCE的实时性稍差外,大多数嵌入式操作系统的实时性都很强,所以也可称为实时操作系统Real TimeOperating System。从事嵌入式的人至少须掌握一个嵌入式操作系统(当然掌握两个更好),这在嵌入式的所有技术中是最为关键的了。目前最重要的RTOS主要包括:第一类、传统的经典RTOS:最主要的便是Vxworks操作系统,以及其Tornado开发平台。Vxworks因出现稍早,实时性很强(据说可在1ms内响应外部事件请求),并且内核可极微(据说最小可8K),可靠性较高等,所以在北美,Vxworks占据了嵌入式系统的多半疆山。特别是在通信设备等实时性要求较高的系统中,几乎非Vxworks莫属。Vxworks的很多概念和技术都和Linux很类似,主要是C语言开发。像Bell- alcatel、Lucent、华为等通信企业在开发产品时,Vxworks用得很多。但Vxworks因价格很高,所以一些小公司或小产品中往往用不起。目前很多公司都在往嵌入式Linux转(听说华为目前正在这样转)。但无论如何,Vxworks在一段长时间内仍是不可动摇的。与Vxworks类似的稍有名的实时操作系统还有pSOS、QNX、Nucleus等RTOS。第二类、嵌入式Linux操作系统:Linux的前途除作为服务器操作系统外,最成功的便是在嵌入式领域的应用,原因当然是免费、开源、支持软件多、呼拥者众,这样嵌入式产品成本会低。Linux本身不是一个为嵌入式设计的操作系统,不是微内核的,并且实时性不强。目前应用在嵌入式领域的Linux系统主要有两类:一类是专为嵌入式设计的已被裁减过的Linux系统,最常用的是uClinux(不带MMU功能),目前占较大应用份额,可在ARM7上跑;另一类是跑在 ARM 9上的,一般是将Linux 2.4.18内核移植在其上,可使用更多的Linux功能(当然uClinux更可跑在ARM 9上)。很多人预测,嵌入式Linux预计将占嵌入式操作系统的50%以上份额,非常重要。缺点是熟悉Linux的人太少,开发难度稍大。另外,目前我们能发现很多教材和很多大学都以ucOS/II为教学用实时操作系统,这主要是由于ucOS/II较简单,且开源,非常适合入门者学习实时操作系统原理,但由于ucOS/II功能有限,实用用得较少。况且熟悉了Linux开发,不仅在嵌入式领域有用,对开发Linux应用软件,对加深操作系统的认识也有帮助,可谓一举多得。据我所知,目前Intel、Philip都在大搞ARM+LINUX的嵌入式开发,Fujitum则是在自己的处理器上大搞Linux 开发。目前在嵌入式Linux领域,以下几个方面的人特别难找,一是能将Linux移植到某个新型号的开发版上;二是能写Linux驱动程序的人; 三是熟悉Linux 内核裁减和优化的人。不过LINUX有一个硬伤,就是没有WINDOWS那样的友好方便美观的交互界面,不然微软帝国早就守不住了。第三类、 Windows CE嵌入式操作系统:Microsoft也看准了嵌入式的巨大市场,MS永远是最厉害的,WinCE出来只有几年时间,但目前已占据了很大市场份额,特别是在PDA、手机、显示仪表等界面要求较高或者要求快速开发的场合,WinCE目前已很流行(据说有一家卖工控机的公司板子卖得太好,以至来不及为客户裁减WinCE)。WinCE目前主要为4.2版(.NET),开发平台主要为WinCE Platform Builder,有时也用EVC环境开发一些较上层的应用,由于WinCE开发都是大家熟悉的VC++环境,所以我院学过Windows程序设计课程的同学都不会有多大难度,这也是WinCE容易被人们接受的原因,开发环境方便快速,微软的强大技术支持,WinCE开发难度远低于嵌入式Linux。对于急于完成,不想拿嵌入式Linux冒险的开发场合,WinCE是最合适了(找嵌入式Linux的人可没那么好找的),毕竟公司不能像学生学习那样试试看,保证开发成功更重要。根据不同的侧重点 ,WinCE还有两个特殊版本,一个是MS PocketPC操作系统专用于PDA上(掌上电脑),另一个是MS SmartPhone操作系统用于智能手机上(带PDA功能的手机),两者也都属于WinCE平台。在PDA和手机市场上,除WinCE外,著名的PDA 嵌入式操作系统还有Palm OS(因出现很早,很有名)、Symbian等,但在WinCE的强劲冲击下,Palm和Symbian来日还能有多长?同学学过VC++后再学 WinCE,非常方便自然,通过学习WinCE同样也可了解嵌入式软件的一般开发过程,对Linux有惧怕心理的同学也很合适。很显然,嵌入式Linux 永远不可能替代WinCE,而且将来谁占份额大还很难讲,毕竟很多人更愿意接受MS的平台,就像各国政府都在大力推LINUX已好长时间,但你能看到几个在PC机上真正使用LINUX的用户?据我观察,目前在嵌入式平台上,LINUX是叫得最响,但还是WinCE实际用得更多。嵌入式LINUX可能更多地是一些有长远产品计划的公司,为降低成本而进行长远考虑。WinCE和多媒体(如MPEG技术)是微软亚洲工程院目前做得较多的项目领域之一,现在社会很需要精通WinCE的人。现在有WINCE的智能手机,金山词霸、WORD、EXCEL、REGEDIT等居然都有 smartphone版的,PC上的MP3、DOC等居然在download时都可被自动转换成smartphone格式,很爽的。完全可用 Windows CE自己开发一些需要的程序download到自己的手机上。现在市面销售PDA智能手机火爆,MS总是财源滚滚。总结关于嵌入式操作系统类课程,若你觉得自己功底较深且能钻研下去,则可去学嵌入式Linux;若你觉得自己VC++功底较好且想短平快地学嵌入式开发,自学WINCE是非常好的选择。(3) 嵌入式开发的相关领域搞嵌入式若能熟悉嵌入式应用的一些主要领域,这样的人更受企业欢迎。主要的相关领域包括:A、数字图像压缩技术:这是嵌入式最重要最热门的应用领域之一,主要是应掌握MPEG编解码算法和技术,如DVD、MP3、PDA、高精电视、机顶盒等都涉及MPEG高速解码问题。B、通信协议及编程技术:这包括传统的TCP/IP协议和热门的无线通信协议。首先,大多数嵌入式设备都要连入局域网或Internet,所以首先应掌握 TCP/IP协议及其编程,这是需首要掌握的基本技术;其次,无线通信是目前的大趋势,所以掌握无线通信协议及编程也是是很重要的。无线通信协议包括无线局域网通信协议802.11系列,Bluetooth,以及移动通信(如GPRS、GSM、CDMA等)。C、网络与信息安全技术:如加密技术、数字证书CA以及各种网络安全设备,包括硬件防火墙、入侵检测IDS、还有防毒墙、IPS等,中国在这方面还是没有自己优势的,我们陈院长好象正在往这方面发展。D、 DSP技术:DSP是Digital Signal Process数字信号处理的意思,DSP处理器通过硬件实现数字信号处理算法,如高速数据采集、压缩、解压缩、通信等。数字信号处理是电子、通信等硬件专业的课程,对于搞软件的人若能了解一下最好。目前DSP人才较缺。如果有信号与系统、数字信号处理等课程基础,对于学习MPEG编解码原理会有很大帮助。(4)嵌入式开发的相关硬件基础对于软件工程专业的学生,从事嵌入式软件开发,像数字电路、计算机组成原理、嵌入式微处理器结构等硬件课程是较重要的。另外,汇编语言、C/C++ 数据结构算法、特别是操作系统等软件基础课也是十分重要的。我们的主要目地是能看懂硬件工作原理,但重点应是在嵌入式软件,特别操作系统级软件,那将是我们的优势。我们的研究生里有些是学电子、通信类专业过来的,有较好的模拟电路和单片机基础,学嵌入式非常合适。嵌入式本身就是从单片机发展过来的,只是单片机不带OS,而现在很多嵌入式应用越来越复杂,以至不得不引入嵌入式操作系统。另外,为追求更高速的信号处理速度,现在在一些速度要求较高场合,有不少公司是将一些DSP算法,如MPEG压缩解压缩算法等用硬件来实现,这就涉及到HDL数字电路设计技术及其 FPGA/IP核实现技术,这方面的人目前市场上也很缺。关于嵌入式领域内的相关专业问题,建议LZ还可以到华清远见的网站上了解一下,也可以具体电话咨询一下华清远见的专业老师,另外,各大书店及图书馆也有华清远见出版的畅销嵌入式专业图书,了解一下相信对你有帮助
电子嵌入式方向

嵌入式以太网中主要处理的协议有哪几种
不知你说的是哪个层次的协议,一般嵌入式系统中硬件都会为你封装好的物理层和MAC层协议,你只需要在软件上移植一些开源的IP协议项目就可以了,比如LIPC。移植完成后就可以进行TCP、UDP通信了,如果你有其他更高级的需求的话,可以移植FTP、HTML等协议。

各位高手,请问xmodem/ymodem/zmodem有什么区别
:XMODEM协议的控制字符 上表中各个缩写也是标准ASCII码的一个字符,在XMODEM协议中需要使用这些字符来表达协议的状态。而其基本含义如表中所述。2.2 数据帧格式与文件分解XMODEM协议每次传送的数据帧长度为132字节,其中文件数据占128字节,其他4个字节分别为开始标志,块序号,块序号的补码和校验字节。其中开始标志,块序号,块序号的补码位于数据块开始,校验字节位于数据块结尾,如:偏移 字节数 名称 描述 说明名称 数值(HEX)0 1 SOH 01 起始字节标志1 1 Seq 1~FFh 块序号2 1 cmpl FFH-seq 块序号的补码3 128 data? 文件内容数据131 1 csum ? 垂直累加和校验 1:XMODEM协议允许使用2种校验码。2:校验码只从128字节的数据进行计算后得出,头部3个字节不参加校验和运算。2 CRC ? 16位循环冗余校验图表 3:XMODEM协议的数据帧格式如果文件长度不是128字节的整数倍,最后一个数据块的有效内容必然小于帧长,剩下部分需要用其他数据来填充,XMODEM建议使用“CTRL-Z”(=26(01aH)),这种情况下,接收方如何区别该帧中属于文件的内容和填充的内容呢?如果传送的文件是只包含字母、数字和可显示符号的文本文件(例如C程序源代码文件),那么根据内容本身接收方是可以区分的(“26”不是字母或者数字的ASCII码),如果传送的是任意数值的二进制文件(如程序目标码),则接收方是无法区分文件内容和填充内容。重要提示:XMODEM协议不能保证接收方接收的文件长度和发送方完全一致,接收方所接收的文件数据长度总是128字节的整数倍,比发送文件的实际长度要大1到127字节。多出的内容位于文件结尾处。XMODEM协议的这种缺点对于用于嵌入式系统的程序代码下装没有实际影响,处理器不会将填充内容当作代码执行,只要程序存储器的容量足够,能存储接收的所有数据就可以了。如果将XMODEM协议用于数据库下装,应当考虑多余内容的影响,一般标准数据库文件中均有表示数据库尺寸、字段数、记录数等数据库结构参数,所以也不会把填充内容当作数据库的记录本身。同样,对于汉字库这种数据库,使用XMODEM协议来下载也不会产生问题。2.3 校验算法校验码是对发送数据进行某种计算得到的编码,为了防止数据在发送途中某些位发生错误,各种数据通信协议规定发送方除了发送应用数据外,还要发送校验码,而数据接收方则根据同样算法从收到的应用数据中计算出校验码,并和发送方发送的校验码比较,如相等,才认为收到了正确的数据。在XMODEM协议中,可使用垂直累加和或者CRC校验,使用CRC校验的通信软件可以自动从CRC校验自动切换到累加和校验模式。在本应用中,我们使用垂直累加和校验。累加和校验码是将所有发送数据的和按字节累加,保留其最低字节作为校验码,例如,发送的3个字节数据分别为255(FFh),5(05h),6(06h), 则:1 1 1 11 1 1 1 FFH0 0 0 00 1 0 1 05H0 0 0 00 1 1 006H10 0 0 01 0 1 0 -> 0000 1010将高位丢弃后,得到累加和校验码为0Ah(10)。在上例中,如果原来数据在途中发生了变化,如FFH变为FEH,06H变为07H, 05H未变,则接收方所计算的校验码为:接收发送1 1 1 11 1 1 0 FEH<- FFH0 0 0 00 1 0 1 05H< - 05H0 0 0 00 1 1 107H<- 06H10 0 0 01 0 1 0 -> 0000 1010校验码也为0AH。可见,在数据中有2位改变时,接收方所计算的校验码仍然与发送方一致,这种校验方式不能检测偶数位的误码。XMODEM协议的校验码只对数据帧中的128字节数据进行计算后得出,头部3个字节不参加校验和运算。2.4 XMODEM协议的启动XMODEM协议开始是文件接收方发出“NAK”字节,文件发送方在收到该信号后发送数据帧,双方开始正常通信过程。而文件发送方进入XMODEN协议后,等待对方发送”NAK”,如果等待时间超过60秒,则退出本次通信。接收方发出“NAK”后,如果10秒后对方还没有发送第一个数据帧,则重复发送“NAK”,这种重复次数最多允许10次,仍然没有收到第一个数据块,则退出本次通信。(A):发送方软件延迟100秒以上工作导致不能启动协议(B):接收方软件延迟60秒发送”NAK”信号导致不能启动协议图表 4XMODEM协议不能启动的2种情况在嵌入式系统通过PC机来下载软件的应用中,嵌入式系统软件是文件接收方,PC机超级终端软件是文件发送方。按照协议规定,嵌入式系统的通信软件进入XMODEM协议状态后,PC机软件必须在100秒内进入协议状态(即执行超级终端的XMODEM文件传输功能),反之,后者先进入协议状态,前者必须在60秒内进入协议状态,显然,通过人工来操作,这种时间差有些紧张。解决办法只有加长嵌入式系统加载软件的启动等待时间,这种修改不会引起协议理解的歧义。重要提示:为了发送和接收方能够更容易启动XMODEM协议,在设计中,将延长嵌入式系统下载软件的启动延时时间,在以下的代码中,将这种延时时间改为600秒(10分钟)。或者将等待时间设置为无限长,一致发出”NAK”信号,直到PC机上的超级终端软件运行为止。2.5 XMODEM的正常传输过程中给出了一次正常的XMODEM通信中收发双方的通信过程。图 5:没有差错的文件传输过程文件接收方每收到一个数据帧后,如没有校验差错、序号差错等情况,均发送一个“ACK”字符作为应答,发送方在收到应答后才开始发送下一个字符,如此反复,直到文件内容传送完毕,发送方传送“EOT”字符表示传送完成,发送方收到后再次以“ACK”回应,至此,整个文件传输过程就结束了。2.6 XMODEM协议的中止在通信进行过程中,双方中的任意一方如果希望中止本次通信,可以发送“CAN”字符给对方,现在很多XMODEM协议软件要求发送2个”CAN”字符来实现,协议软件的主动中止通信一般是人为发起的,例如按下超级终端软件的“取消”按钮。或者通过拔码开关来控制嵌入式系统的下载软件退出通信。2.7 XMODEM协议的异常处理在通信过程中,总是要出现各种异常情况,比如通信线路的突然中断,一方机器停电而导致软件中止执行等;通信软件必须能够检测这些错误,并作出合理的处理。在前面的协议启动一节中已经涉及到了错误检测的问题,XMODEM对错误的规定很详细,共计有8种情况,协议文本没有说明是如何引起的,中给出了可能原因,在嵌入式系统中,考虑到下载软件一般均有人操作的,也可不考虑错误处理,这样实现实现代码会减小。在本文中,考虑到协议的完整性,考虑了各种错误的处理。2.8 CRC校验与累加和校验方式的切换XMODEM协议要求支持CRC校验的通信软件也能支持累加和校验,这样就可以和那些只支持累加和校验的软件进行通信,如果文件接收方只支持累加和,而发送方可支持CRC,接收方发送启动信号为“NAK”,发送方收到后自动按累加和方式发送数据帧;如果相反,接收方支持CRC,而发送方支持累加和,接收方首先发出字母“C”来作为启动信号,这时接收方应不理睬此信号,发送方在3秒后继续发送信号“C”,共三次未收到应答后,改为发送“NAK”信号,表示使用累加和方式进行通信了。如果通信双方均采用CRC校验,上述通信握手信号“NAK”用字母“C来代替,其他过程同上。因为PC机超级终端软件支持CRC模式,嵌入式系统作为文件接收方,只要发送“NAK”信号就能使对方自动按照校验和方式通信了。3 协议分层与层间接口3.1 协议分层我们将协议代码分成3层:物理层,链路层和协议应用层。物理层用于控制UART器件,链路层处理XMODEM协议,应用层负责将收到的单个128字节数据块组合成一个完成的数据块,并写入程序存储器缓冲区。这种分层,在程序移植时只要修改和硬件相关的物理层、应用层代码,无需修改实现XMODEM协议的链路层代码。层与层之间通过消息来通信,XMODEM协议没有规定分层结构和层间消息格式,这里将链路层与应用层之间、链路层和物理层之间的消息格式统一规定如下:typedef struct {int len; /*消息内容长度,即Message中的内容字节数 */char mType;/*层间消息类型, */char Message[MAX_ MESSAGE_LEN];/*消息内容,由发送进程填写*/} MessageOfLayer;考虑到XMODEM数据帧为132字节,定义常量“MAX_MESSAGE_LEN”为132字节,按OSI标准,层间消息原语有数据请求、数据指示、响应、证实4种类型。给出了A方发送数据,B方接收数据时的层间消息类型图 6: 单向数据传送的层间消息顺序:①②③④消息1,2是承载实际数据的数据帧,消息3,4是传送过程中的应答帧,表明数据已经正确传送,必须说明的是,在发送数据的证实消息3不是从对方发出的,物理层在发送出数据后,立即向上一层发出证实消息。在实际应用中,处理正常的数据传送所需要的消息外,也需要定义一些控制管理消息,下面具体说明层间消息类型和作用。3.2 链路层和物理层间的接口n 数据请求:该消息用于向物理层发送XMODEM帧数据,包括132字节的文件数据帧和NAK,ACK,CAN单字节信号帧等,下载软件只是接收文件,不需要发送132字节的文件数据帧。n 数据证实:物理层收到链路层的数据请求帧后,送到UART的缓冲器中,等发送缓冲器为空后,表明该字节数据发送完成,向链路层发送证实消息,链路层接收到此消息后,就可以发送下一个字节,实际上物理层传送是一个无连接,证实消息不是由接收方产生的,不能表明对方已经正确接收到数据,而只表明已经发出数据。物理层协议一般也不提供有应答的传输机制。n 数据指示:物理层在接收缓冲器满后,将数据发送给链路层。除了以上3个消息外,物理层和应用层之间还有以下2个消息:n 启动电路:由链路层向物理层发出,物理层在收到该协议后将串口进行初始化。n 电路出错:由物理层向链路层发出,用于报告物理层在数据传送过程中的错误。“数据响应”消息在本应用中不使用。3.3 链路层和应用层间的接口链路层和应用层之间的数据传输消息有二个:n 数据块指示:由链路层收到一个XMODEM协议帧(128字节)后向应用层发出,应用层收到数据帧后写入flash memory(PC版本写入文件)。n 数据块块响应:应用层收到XMODEM数据帧后,并写入flash memory(PC版本写入文件)后向链路层发出的响应信号。链路层收到响应后,向文件发送方发出“ACK”信号。其他管理控制消息定义了3个:n 协议启动:应用层通知链路层启动XMODEM协议。n 通信结束:链路层在收到对方的EOT信号后向应用层发出,应用层收到此消息后,可以转入应用程序入口,从而执行应用程序。n 通信中止:链路层因为各种情况无法继续进行XMODEM传输时向应用层传送该消息,应用层收到此消息后,丢弃已经收到的数据,发出通信错误指示。4 分层协议实现4.1 协议的OS平台为了实现分层协议,使用中的非抢先式操作系统作为软件平台,各层分别作为一个进程。4.2 应用层软件实现嵌入式系统下载软件只接收代码文件,对于协议中作为文件发送方的处理代码可不编写,应用层的任务是接收链路层的数据包,根据收到数据包的先后次序写入程序存储器,在PC机上模拟实现时,我们将数据存放在一个缓冲区内,完成后写入文件中,使用windiff软件和发送文件进行比较,以判断代码的是否正确。应用层的进程初始化代码的作用是:n 擦除程序存储器所使用的FLASH MEMORY(在本例中按29F010来编写代码)。n 启动一个10秒定时器,10秒后通知链路层启动XMODEM协议。 n

本文由 在线网速测试 整理编辑,转载请注明出处。