嵌入式计算机系统的设计 毕业论文.doc_第1页
嵌入式计算机系统的设计 毕业论文.doc_第2页
嵌入式计算机系统的设计 毕业论文.doc_第3页
嵌入式计算机系统的设计 毕业论文.doc_第4页
嵌入式计算机系统的设计 毕业论文.doc_第5页
免费预览已结束,剩余26页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

29吉林大学远程教育2009届专科生毕业设计(论文) 吉林大学远程教育专科生毕业论文(设计)中文题目 嵌入式计算机系统的设计 学生姓名 专业 层次年级 学号 指导教师 职称 学习中心 成绩 年 月 日 摘 要 嵌入式系统是以应用为中心,以计算机技术为基础,软、硬件可裁剪,适应应用系统,对功能、可靠性、成本、体积、功耗等有严格要求的专用计算机系统。它具有以下特点:1、 与应用密切相关 嵌入式系统作为机器或设备的组成部分,与具体的应用密切相关。2、 实时性 嵌入式系统必须在实时方式下工作,若在规定的时间内某一请求得不到处理或者处理没有结束,可能会带来严重的后果。3、 复杂的算法 对不同的应用,嵌入式系统有不同的算法。4、 制造成本 在某些情况下,制造成本决定了含有嵌入式系统的设备或产品能否在市场上被成功地销售。5、 功耗 许多嵌入式系统采用电池供电,因此对功耗有严格的要求。6、 开发和调试 必须有相应的开发环境、开发工具和调试工具,才能进行开发和调试。7、 可靠性 嵌入式系统应该能够可靠地运行,比如能在规定的温度、湿度环境下连续运行、有一定的抗干扰能力。8、 体积 嵌入式系统一般都要求体积尽可能地小。 随着计算机技术、信息技术和数据技术的发展,嵌入式系统的将向着更加小、更快速、功耗更低以及互联网的方向发展。关键词:可靠性 实时性 抗干扰29第一章绪论1.1嵌入式系统1.1.1嵌入式系统简介随着计算机技术和微电子技术的迅速发展,嵌入式系统应用领域越来越广泛。当今,嵌入式系统已成为一个时髦的名词,就像当初的计算机热潮,似乎比当初的计算机热潮涉及的领域更广泛,应用技术人员更多,相关国民经济产值也更庞大。报纸、杂志、网络都把嵌入式系统当作讨论的热门话题。1.1.2 实时多任务操作系统rtos(real time multi-tasking operation system),即实时多任务操作系统是嵌入式应用软件的基础和开发平台。目前在中国大多数嵌入式软件开发还是基于处理器直接编写,没有采用商品化的rtos,不能将系统软件和应用软件分开处理。rtos是一段嵌入在目标代码中的软件,用户的其它应用程序都建立在rtos之上。不但如此,rtos还是一个可靠性和可信性很高的实时内核,将cpu时间、中断、i/o、定时器等资源都包装起来,留给用户一个标准的api,并根据各个任务的优先级,合理地在不同任务之间分配cpu时间。 tos是针对不同处理器优化设计的高效率实时多任务内核,优秀商品化的rtos可以面对几十个系列的嵌入式处理器mpu、mcu、dsp、soc等提供类同的api接口,这是rtos基于设1.1.3嵌入式操作系统的发展状况国外嵌入式操作系统已经从简单走向成熟,主要有vmware、qnx、palmas、windows ce、嵌入式linux等。国内的嵌入式操作系统研究开发有2种类型,一类是基于国外操作系统2次开发完成的,如海信的基于windows ce的机顶盒系统;另一类是中国自主开发的嵌入式操作系统,如凯思集团公司自主研制开发的嵌入式操作系统hope os(“女娲计划”)等。 1.1.4嵌入式系统软件的特点嵌入式处理器的应用软件是实现嵌入式系统功能的关键,对嵌入式处理器系统软件和应用软件的要求也和通用计算机有所不同。 1.软件要求固态化存储。为了提高执行速度和系统可靠性,嵌入式系统中的软件一般都固化在存储器芯片或单片机本身中,而不是存贮于磁盘等载体中。 2.软件代码高质量、高可靠性。尽管半导体技术的发展使处理器速度不断提高、片上存储器容量不断增加,但在大多数应用中,存储空间仍然是宝贵的,还存在实时性的要求。为此要求程序编写和编译工具的质量要高,以减少程序二进制代码长度、提高执行速度。 3.系统软件(os)的高实时性是基本要求。在多任务嵌入式系统中,对重要性各不相同的任务进行统筹兼顾的合理调度是保证每个任务及时执行的关键,单纯通过提高处理器速度是无法完成和没有效率的,这种任务调度只能由优化编写的系统软件来完成,因此系统软件的高实时性是基本要求。 4.多任务操作系统是知识集成的平台和走向工业标准化道路的基础。1.2嵌入式开发概述1.2.1 嵌入式系统开发需要开发工具和环境 通用计算机具有完善的人机接口界面,在上面增加一些开发应用程序和环境即可进行对自身的开发。而嵌入式系统本身不具备自举开发能力,即使设计完成以后用户通常也是不能对其中的程序功能进行修改的,必须有一套开发工具和环境才能进行开发,这些工具和环境一般是基于通用计算机上的软硬件设备以及各种逻辑分析仪、混合信号示波器等。 1.2.2 嵌入式系统软件需要rtos开发平台 通用计算机具有完善的操作系统和应用程序接口(api),是计算机基本组成不可分离的一部分,应用程序的开发以及完成后的软件都在os平台上面运行,但一般不是实时的。嵌入式系统则不同,应用程序可以没有操作系统直接在芯片上运行;但是为了合理地调度多任务、利用系统资源、系统函数以及和专家库函数接口,用户必须自行选配rtos开发平台,这样才能保证程序执行的实时性、可靠性,并减少开发时间,保障软件质量。 1.2.3 嵌入式系统开发人员以应用专家为主 通用计算机的开发人员一般是计算机科学或计算机工程方面的专业人士,而嵌入式系统则是要和各个不同行业的应用相结合的,要求更多的计算机以外的专业知识,其开发人员往往是各个应用领域的专家。因此开发工具的易学、易用、可靠、高效是基本要求。1.2.4嵌入式系统高级编程语言ada语言是20世纪70年代美国国防部开发并投入使用的功能强大的通用系统开发语言,最初为ada83。它支持模块化、独立编译、协处理等功能。其可靠性、可维护性、可读性都是相当好的。后来,为了更好地支持oop(object-oriented programming),对其进行了改进,形成了目前广泛使用的ada95。使用ada语言可以大大改善系统的清晰性、可靠性、可维护性等性能指标2,3。它是美国国防部指定的唯一一种可用于军用系统开发的语言。第二章arm处理器结构和arm指令集 2.1arm处理器结构arm(advanced risc machines)是微处理器行业的一家知名企业,该企业设计了大量高性能、廉价、耗能低的risc处理器、相关技术及软件。技术具有性能高、成本低和能耗省,适用于多种领域,比如嵌入控制、消费/教育类多媒体、dsp和移动式应用等。arm处理器的框架如图2-1所示乘法器指令解码地址自增器nresetnmreqseqabortnirqnfiqnrwmas1:0lockncpicpacpbnwaitmclknopcbigendisyncntransnm4:0桶形移位器32 位 alu写数据 寄存器读数据 寄存器地址寄存器寄存器a31:0abe及控制 逻辑pc update解码站指令 解码incrementerpcabusbbus 图2-1arm处理器架构2.1.1寄存器和处理器模式1.arm 有7个基本工作模式:user:非特权模式,大部分任务执行在这种模式。限制你的内存访问并且你不能直接读取硬件设备正常程序执行的模式fiq:当一个高优先级(fast)中断产生时将会进入这种模式高速数据传输和通道处理irq:当一个低优先级(normal)中断产生时将会进入这种模式通常的中断处理supervisor:当复位或软中断指令执行时将会进入这种模式供操作系统使用的一种保护模式程序计数器构造如下图2-2: 2731n z c v q2867i f t mode1623 815 54024fsxc u n d e f i n e dj图2-2 程序计数器构造n 条件位:n n = 1-结果为负,0-结果为正或0n z = 1-结果为0,0-结果不为0n c =1-进位,0-借位n v =1-结果溢出,0结果没溢出n q 位:n 仅arm 5te/j架构支持n 指示增强型dsp指令是否溢出n j 位n 仅arm 5te/j架构支持n j = 1: 处理器处于jazelle状态n 中断禁止位:n i = 1: 禁止 irq.n f = 1: 禁止 fiq.n t bitn 仅arm xt架构支持n t = 0: 处理器处于 arm 状态n t = 1: 处理器处于 thumb 状态n mode位(处理器模式位):n 0b10000usern 0b10001fiqn 0b10010irqn 0b10011supervisorn 0b10111abortn 0b11011undefinedn 0b11111systemn 当处理器执行在arm状态:n 所有指令 32 bits 宽n 所有指令必须 word 对齐n 所以 pc值由bits 31:2决定, bits 1:0 未定义 (所以指令不能halfword / byte对齐).n 当处理器执行在thumb状态:n 所有指令 16 bits 宽n 所有指令必须 halfword 对齐n 所以 pc值由bits 31:1决定, bits 0 未定义 (所以指令不能 byte对齐).n 当处理器执行在jazelle状态:n 所有指令 8 bits 宽n 处理器执行 word 存取一次取4条指令2.2arm指令集2.2.1arm存贮访问指令arm存贮访问指令如下表2-1: 表2-1 arm存贮访问指令助记符说明操作条件码位置mul rd,rm,rs32位乘法指令rdrm*rs (rdrm)mulcondsmla rd,rm,rs,rn32位乘法指令rdrm*rs+rn (rdrm)mlacondsumull rdlo,rdhi,rm,rs64位无符号乘法指令(rdlo,rdhi)rm*rsumullcondsumlal rdlo,rdhi,rm,rs64位无符号乘法指令(rdlo,rdhi)rm*rs+(rdlo,rdhi)umlalcondssmull rdlo,rdhi,rm,rs64位无符号乘法指令(rdlo,rdhi)rm*rssmullcondssmlal rdlo,rdhi,rm,rs64位无符号乘法指令(rdlo,rdhi)rm*rs+(rdlo,rdhi)smlalconds2.2.2数据处理指令数据处理指令如下表2-2 表2-2 数据处理指令助记符号说明操作条件码位置mov rd,operand2数据转送rd-operand2mov condsmvn rd,operand2数据非转送rd-(not)operand2mvn condsadd rd,rn,operand2加法运算指令rd-rn+operand2add condssub rd,rn,operand2减法运算指令rd-rn-operand2sub condsrsb rd,rn,operand2逆向减法指令rd-operand2-rnrsb condsadc rd,rn,operand2带进位加法rd-rn+operand2+carryadc condsrsc rd,rn,operand2带进位减法rd-rn-perand2-(not)carryrsc condsand rd,rn,operand2带进位逆向减法rd-rn&operand2and condsorr rd,rn,operand2逻辑或操作指令rd-rn|operand2orr condseor rd,rn,operand2逻辑异或操作指令rd-rnoperand2eor condsbic rd,rn,operand2位清除指令rd-rn(operand2)bic condcmp rd,rn,operand2比较指令标志n、z、c、v-rn-operand2cmp condcmn rd,rn,operand2负数比较指令标志n、z、c、v-rn+operand2cmn condtst rd,rn,operand2位测试指令标志n、z、c、v-rn&operand2tst condteq rd,rn,operand2相等测试指令标志n、z、c、v-rnoperand2teq cond2.2.3乘法指令乘法指令如下表2-3:表2-3 乘法指令助记符说明操作条件码位置mul rd,rm,rs32位乘法指令rdrm*rs (rdrm)mulcondsmla rd,rm,rs,rn32位乘法指令rdrm*rs+rn (rdrm)mlacondsumull rdlo,rdhi,rm,rs64位无符号乘法指令(rdlo,rdhi)rm*rsumullcondsumlal rdlo,rdhi,rm,rs64位无符号乘法指令(rdlo,rdhi)rm*rs+(rdlo,rdhi)umlalcondssmull rdlo,rdhi,rm,rs64位无符号乘法指令(rdlo,rdhi)rm*rssmullcondssmlalcondssmlalcondssmlalcondssmlalconds2.2.4 跳转指令跳转指令如下表2-4: 表2-4 跳转指令助记符说明操作条件码位置b label跳转指令pclabelbcondbl label带链接的跳转指令lrpc-4,pclabelblcondrx rm带状态切换的跳转指令pclable,切换处理状态bxcond2.2.5杂项指令杂项指令如下表2-5: 表2-5 杂项指令助记符说明操作条件码位置swi immed_24软中断指令产生软中断,处理器进入管理模式swicondmrs rd,psr读状态寄存器指令rdpsr,psr为cpsr或spsrmrscondmrs psr_fields,rd/#immed_8r写状态寄存器指令psr_fieldsrd/#immed_8r,psr为cpsr或spsrmsrcond2.2.6thumb指令集thumb指令可以作是arm指令压缩形式的子集,是针对代码密度的问题而提出的,它具有16位的代码密度。thumb不是一个完整的体系结构,不能指望处理只执行thumb指令而不支持arm指令集。thumb指令集没有协处理器指令。arm和thumb之间切换使用bx 指令。 thumb指令与arm指令在实现上差别不大,在此就不再对thumb指令集进行详细的介绍了。第三章c/os-的移植3.1移植的要求和准备这一章介绍如何将c/os-移植到不同的处理器上。所谓移植,就是使一个实时内核能在某个微处理器或微控制器上运行。为了方便移植,大部分的c/os-代码是用c语言写的;但仍需要用c和汇编语言写一些与处理器相关的代码,这是因为c/os-在读写处理器寄存器时只能通过汇编语言来实现。由于c/os-在设计时就已经充分考虑了可移植性,所以c/os-的移植相对来说是比较容易的。要使c/os-正常运行,处理器必须满足以下要求:3.2移植具体过程3.2.1 c/os-的软硬件结构体系samsung s3c44b0x微处理器是三星公司专为手持设备和其它嵌入式应用提供的高性价比的微控制器解决方案。它使用arm公司的16位/32位risc结构,内核是arm7tdmi,工作在66mhz,片上集成了以下部件:8k cache、外部存储器控制器、lcd控制器、4个dma通道、2个uart、1个多主i2c总线控制器、1个i2c总线控制器,以及5通道pwm定时器和1个内部定时器、8通道12位adc等,能够与常用的外围设备实现无缝连接,功能强大。目前,国内应用较为广泛。c/os-应用程序c/os-处理器无关代码os-core.c os-q.cos-mbox.c os-men.cos-task.c c/os-.cos-time.c c/os-.hos-sem.cc/os-设置(应用相关)os-cfg.hincludes.hc/os-处理器相关代码os_cpu.h os_cpu_a.asmos_cpu_c.cc/os-编译器相关定义存储器系统时钟外围设备处 理 器图3-1 c/os-软硬件体系结构 图3.1说明了c/os-ii的软硬件体系结构。应用程序处于整个系统的顶层,每个任务都可以认为自已独占了cpu,因而可以设计成为一个无限循环。c/os-ii处理器无关的代码提供了c/os-ii的系统服务,应用程序可以使用这些api函数进行内存管理、任务间通信及创建、删除任务等。大部分的c/os-ii代码是使用ansi c语言书写的,因此c/os-ii的可移植性好,然而仍需要使用c和汇编语言写一些处理器相关代码。c/os-ii的移植需要满足以下要求:1.处理器的c编译器可以产生可重入代码;2.可以使用c调用进入和退出临界区代码;3.处理器必须支持硬件中断,并且需要一个定时中断源;4.处理器需要能够容纳一定数据的硬件堆栈;5.处理器需要有能够在cpu寄存器与内核和堆栈交换数据的指令。s3c44b0x处理器完全满足上述要求。3.2.2 实时内核c/os-ii在s3c44b0x上的移植我们使用arm sdt编译器,移植c/os-ii主要包括以下几个步骤。1.设置os_cpu.h中与处理器和编译器相关的代码*与编译器相关的数据类型*typedef unsigned char boolean;typedef unsigned char int8u; /8位无符号整数typedef signed char int8s; /8位有符号整数typedef unsigned short int16u; /16位有符号整数typedef signed short int16s; /16位无符号整数typedef unsigned long int32u; /32位无符号整数typedef signed long int32s; /32位有符号整数typedef float fp32; /单精度浮点数typedef double fp64; /双精度浮点数typedef unsigned int os_stk; /*堆栈入口宽度为16位与arm处理器相关的代码:*/#define os_enter_critical () armenableint() /开启中断#define os_stk_growth 1 /堆栈由高地址向低地址增长2.用c语言编写6个操作系统相关的函数(os_cpu_c.c)void ostaskstkinit(void(task)(void *pd),void *pdata,void *ptos,int16u opt) unsigned int *stk;*-stk=0; /*r9*/ldmfd sp!,r4msr spsr_cxsf,r4ldmfd sp!,r0-r12,lr pc完成上述工作后,c/os-ii就可以运行在arm处理器上了。3.2.3 使用c/os-ii系统应注意的问题1.c/os-ii和linux等分时操作系统不同,不支持时间片轮转法。它是一个基于优先级的实时操作系统。每一个任务的优先级必须不同(分析它的源码会发现,c/os-ii把任务的优先级当作任务在标识来使用,如果优先级相同,任务将无法区分)。进入就绪态的优先级最高的任务首先得到cpu的使用权,只有等它交出cpu的使用权后,其它任务才可以被执行。所以,它只能就是多任务,不能就是多进程,至少不是我们所熟悉的那种多进程。2.c/os-ii对共享资源提供了保护的机制。c/os-ii是一个支持多任务的操作系统。我们可以把一个完整的程序划分成几个任务,不同的任务执行不同的功能。对于共享资源(比如串口),c/os-ii也提供了很好的解决办法,一般情况下使用的是信号量方法。我们创也第四章网络转串口驱动的开发4.1lwip在c/os-上的移植4.1.1开源tcp/ip协议栈lwip简介随着嵌入式系统与网络的日益结合,在嵌入式实时操作系统中引入tcp/ip协议栈,以支持嵌入式设备接入网络,成为嵌入式领域重要的研究方向。uc/0s ii是近年来发展迅速的一tcp/ip实现的重点是在保持tcp协议主要功能的基础上减少对ram的占用,一般它只需要几十k的ram和40k左右的rom就可以运行,这使lwip协议栈适合在低端嵌入式系统中使用。4.1.2基于uc/0s ii的网络平台概述 嵌入式操作系统uc/0s ii是一个公开源代码的占先式多任务的微内核rtos,其性能和安全性可以与商业产品竞争。uc/0s ii的特点可以概括为以下几个方面:公开源代码,代码化的,用户需要付费才能获得,很少给出源代码,这影响了uc/0s ii的研究和推广。通过把开放源代码的tcp/ip协议栈lwip移植到uc/0s ii上来,就获得了一套可免费研究、学习的嵌入式网络软件平台。系统示意图如下图4-1: 图4-1 uc/0s iilwip系统示意图4.1.3 lwip在uc/0s ii下的实现 lwip协议栈在设计时就考虑到了将来的移植问题,因此把所有与硬件、os、编译器相关的部份独立出来,放在/src/arch目录下。因此lwip在uc/0s ii上的实现就是修改这个目录下的文件,其它的文件一般不应该修改。下面分几部份分别说明相应文件的实现原理和过程。现在网上最新的版本是v0.6.41.lwip的进程模型(process model)tcp/ip协议栈的process model一般有几种方式.(1)tcp/ip协议的每一层是一个单独进程.链路层是一个进程,ip层是一个进程,tcp层是一个进程。这样的好处是网络协议的每一层都非常清晰,代码的调试和理解都非常容易.但是最大的坏处数据跨层传递时会引起上下文切换(context switch).对于接收一个tcp segment要引起3次context switch(从网卡驱动程序到链路层进程,从链路层进程到ip层进程,从ip层进程到tcp进程).通常对于操作系统来说,任务切换是要浪费时间的.过频的context swich是不可取的.(2)另外一种方式是tcp/ip协议栈在操作系统内核当中.应用程序通过操作系统的系统调用(system call)和协议栈来进行通讯。这样tcp/ip的协议栈就限定于特定的操作系统内核了.如windows就是这种方式.。2.port lwip to ucos (其实在ucos的实现中我们使用的是message queue来实现lwip中的”mbox”,下面大家可以看到这一点) operating system emulation layer的原代码在/lwip/src/core/sys.c中.而和具体的操作系统相关的代码在./lwip/src/arch/sys_arch.c中.操作系统封装层的主要函数如下:void sys_init(void) /系统初始化sys_thread_t sys_thread_new(void (* function)(void *arg), void *arg,int prio)/创建一个新进程sys_mbox_t sys_mbox_new(void) /创建一个邮箱rch.txt.文件. (2) lwip在ucos上的移植. 系统初始化sys_int必须在tcpip协议栈任务tcpip_thread创建前被调用.#define max_queues20#define max_queue_entries20 &lwip_task_stkcurr_prio_offsetlwip_stk_size-1,lwip_start_prio+curr_prio_offset );curr_prio_offset+; return 1; else / print( lwip task prio out of range ! error! );从代码中可以看出tcpip_thread应该是最先创建的.lwip中的定时事件。在tcp/ip协议中很多时候都要用到定时,定时的实现也是tcp/ip协议栈中一个重要的部分.lwip中定时事件的数据结构如下. struct sys_timeout struct sys_timeout *next; /指向下一个定时结构u32_t time;/定时时间sys_timeout_handler h; /定时时间到后执行的函数void *arg; /定时时间到后执行函数的参数.;struct sys_timeouts struct sys_timeout *next;struct sys_timeouts lwip_timeoutslwip_task_max;lwip中的定时事件表的结构如下图,每个和tcp/ip相关的任务的一系列定时事件组成一个单向链表.每个链表的起始指针存在lwip_timeouts的对应表项中,如下图4-2 图4-2lwip中的定时事件表的结构函数sys_arch_timeouts返回对应于当前任务的指向定时事件链表的起始指针.该指针存在lwip_timeoutsmax_lwip_tasks中.struct sys_timeouts null_timeouts;struct sys_timeouts * sys_arch_timeouts(void)u8_t curr_prio;s16_t err,offset;os_tcb curr_task_pcb;null_timeouts.next = null;/获取当前任务的优先级err = ostaskquery(os_prio_self,&curr_task_pcb);curr_prio = curr_task_pcb.ostcbprio;offset = curr_prio - lwip_start_prio;/判断当前任务优先级是不是tcp/ip相关任务,优先级5-9if(offset = lwip_task_max)return &null_timeouts;return &lwip_timeoutsoffset;ping 5 l 2000 t,不间断用长度为2000的数据报进行ping测试,同时使用tftp客户端软件给5下载一个十几兆程序,同时再使用telnet连接5端口7(echo端口),往该端口写数测试echo功能.在运行一段时间以后,开发板进入不再响应.我当时也是经过长时间的分析才发现是因为在低优先级任务运行ys_arch_timeouts()时被高优先级任务打断改写了curr_task_tcb的值,从而使sys_arch_timeouts返回的指针错误,进而导致系统死锁.函数sys_timeout给当前任务增加一个定时事件:void sys_timeout(u32_t msecs, sys_timeout_handler h, void *arg)struct sys_timeouts *timeouts;struct sys_timeout *timeout, *t;timeout = memp_malloc(memp_sys_timeout); /为定时事件分配内存if (timeout = null) return;timeout-next = null;timeout-h = h;timeout-arg = arg;timeout-time = msecs;timeouts = sys_arch_timeouts(); /返回当前任务定时事件链表起始指针if (timeouts-next = null) /如果链表为空直接增加该定时事件timeouts-next = timeout;return;/如果链表不为空,对定时事件进行排序.注意定时事件中的time存储的是本事件/时间相对于前一事件的时间的差值if (timeouts-next-time msecs) *data = null;/单位转换,从ucos tick-mstimeout = (ucos_timeout -ucerr)*(1000/ os_ticks_per_sec);return timeout;semaphone的实现和mbox类似,这里就不再重复了.4.2mac和ip地址设置4.2.1嵌入式网络设备中mac及ip地址的特点 mac地址在这里特指以太网定义的一个48位(6字节)地址。每台连到以太网网络的计算机分配一个唯一的48位(6字节)数字,即它的以太网地址。为分配地址,以太网硬件制造商购买以太网地址块,在生产以太网接口硬件时顺序给它们分配。mac地址属于物理层的地址,对于不同类型的网络,其物理址分配方式不同,但本论文中介绍的设置方法都适用。ip地址(ip address)也叫互连网地址(internet address)。它是tcp/ip的设计人员选择的一个类似于物理网络的编址地址。互连网上的每个主机都分配了一个唯一的32位(4字节)整数地址。ip地址属于软件协议层的地址。只要主机上运行tcp/ip协议,其ip地址的编址方式就符合这个统一标准。在嵌入式系统中,操作系统和所有的应用软件都被固化到flash等存储设备中。在嵌入式系统中很少使用外存。嵌入式系统的启动往往也是“自动”的,即从上电到处于工作状态,不用人的介入。这是嵌入式设备应用的要求和特点嵌入式网络设备中的mac及ip地址的设置有它的特点:1.关心和接触嵌入式网络设备mac地址的人比关心和接触通用计算机mac地址的人多得多。 件。4.2.2mac及ip地址的设置 本嵌入式网络设备系统的mac及ip地址设置的基本思想是:把mac及ip地址存放在flash的未用扇区(一般在高扇区),嵌入式操作系统启动后,自动运行一个程序去读取mac及ip地址并设置它。用户如何把mac及ip地址放到flash中?通过计算机串口与网络设备的rs232接口(即串口)相连,使用超级终端的方式,运行网络设备中的程序把数据写入flash中。先运行提供的tftpd32文件出现界面如下图4-3所示: 下图4-4是下载并运行 test.bin 的一个例子(提供源码) 图4-3 tftpd32文件出现界面 图4-4 利用tftp下载并运行 test.bin 的一个例子3:参数设置和程序自动装载运行:到了这儿就不得不提参数的设置了:输入 printenv 命令,如下图4-5:有几条是常用的设置,说一下:设置pc 机 的ip地址:setenv severip 0存储一下: saveenv 如下图4-6: 图4-5输入 printenv 命令的结果界面设置波特率:setenv baudrate 115200saveenv(不存入flash 下次启动无效)设置下载文件名:setenv bootfile “44btest.bin”(加上引号)saveenv设置启动时倒记时(单位秒)setenv bootdelay 9saveenv也可以一次设置多个参数最后再 saveenv其中 bootcmd 参数是设置启动后倒记时到后的自动执行命令的,非常有用, 可以用批处理的方法来执行,象 dos 的autoexec.bat例如:设置启动后显示帮助文件,并且自动从网口下载 bootfile设置的文件并运行:setenv bootcmd ? ; tftp ; go 0x0c008000saveenv其中“ ; ”表示一个命令的延续 “ ”是转义符。“;”表示多命令隔开这样也可以实现依次执行多命令 如: ?;go 0x0c008000 表示显示帮助,再转到0x0c008000执行 图4-6输入 saveenv 命令的结果界面4.3串口驱动的实现4.3.1串口原理简介 1. 异步串行i/o 异步串行方式是将数据的每一个字符一位接一位(例如先低位、后高位)地传送。数据的各不同位可以分时使用同一传输通道,因此串行i/o可以减少信号连线,最少用一对线即可进行。接收放对于同一根线上一连串的数字信号,首先要分割成位,再按位组成字符。为了恢复发送的信息,双方必须协调工作。在微型计算机中大量使用异步串行i/o方式,双方使用各自的时钟信号,而且允许时钟频率有一定误差,因此实现较容易。但是由于每个字符都要独立确定起始和结束(即每个字符都要重新同步),字符和字符间还可能有长度不定的空闲时间,因此效率较低。 图4-7异步串行通信中一个字符的传送格式图4-7给出异步串行通信中一个字符的传送格式。开始前,线路处于空闲状态,送出连续“1”。传送开始时首先发一个“0”作为起始位,然后出现在通信线上的是字符的二进制编码数据。每个字符的数据位长可以约定为5位、6位、7位或8位,一般采用asc编码。后面是奇偶校验位,根据约定,用奇偶校验位将所传字符中为“1”的位数凑成奇数个或偶数个。也可以约定不要奇偶校验,这样就取消奇偶校验位。最后是表示停止位的“1”信号,这个停止位可以约定持续1位、1.5位或2位的时间宽度。至此一个字符传送完毕,线路有进入空闲,持续为“1”。经过一段随机的时间后,下一个字符开始传送又发出起始位。每一个数据位的宽度等于传送波特率的倒数。微机异步串行通信中,常用的波特率为50,95,110,150,300,600,1200,2400,4800,9600等。接收芳按约定的格式接收数据,并进行检查,可以查出以下三种错误:奇偶错 在约定奇偶检查的情况下,接收到的字符奇偶状态和约定不符。贞格式错 一个字符从起始位到停止位的总数不对。溢出错 若先接收的字符尚未被微机读取,后面的字符又传送过来,则产生溢出错,每一种错误都会给出相应的出错信息,提示用户处理。串口寄存器如下表4-1和4-2所示: 表4-1串口寄存器registoraddressr/wdescriptionulcon00x01d0000r/wuart channel 0 line control registorulcon10x01d4000r/wuart channel 1 line control registor 表4-2串口寄存器ulcon nbitreserved 7 infra-red mode 6 partity mode 5:3 number of stop bit 2 word length 1:0 由上表可以看出,该串口寄存器的第六位决定是否使用红外模式,为53决定校验方式,位2决定停止位长度,位1,0决定每帧的数据位数。uart控制寄存器uconn,该寄存器决定uart的各种模式。uart fifo控制寄存器ufconn,ufconn的第0位决定是否启用fifo,umconn的第0位是请求发送位。最重要的两个寄存器是发送寄存器utxh 和接收寄存器urxh,我们最终实现串口通信就要用到这两个寄存器的相关函数。4.3.2在c/os-操作系统上实现arm串口功能 (1)在main函数中添加串行口的寄存器初始化代码,并添加串行口扫描任务。串口扫描任务如下:void uart_scan_task1(void *id)char c1;posmsg pmsg1;for (;)if(uart_getch(&c1,0,1)pmsg1=oscreatemessage(null,osm_serial,0,c1);if(pmsg1)sendmessage(pmsg1);(2)当系统收到串口信息时,将会自动向主任务发送一个串口消息。主任务接收到该消息,将会调用响应函数。响应函数如下:void onserial(int portn, char c)lcd_changemode(dsptxtmode);lcd_printf(%cn,c);uart_sendbyte(0,c);(3)添加主任务void main_task(void *id) /main_test_taskposmsg pmsg=0;clearscreen();/消息循环for(;)pmsg=waitmessage(0); /等待消息switch(pmsg-message)case osm_key:onkey(pmsg-wpar

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论