首页 | 文章中心 | 下载中心 | 本站特供 | 软硬件结合论坛 | 
您现在的位置: 中国软硬件结合技术网 >> 文章中心 >> 软硬件结合 >> 嵌入式系统 >> 正文 用户登录 新用户注册
嵌入系统软件开发讲座            【字体:
嵌入系统软件开发讲座
作者:未知    文章来源:未知    点击数:    更新时间:2007-7-22
因为GPS终端产品有些问题,今天加了一天班问题是这样的:
新的gprs模块总是短信、GPRS间隔的回信息,GPRS容易掉线,老的就没有问题,另外现场GPS终端有死机现象。所以今天累,偷点懒,把去年的讲义发上来吧:

嵌入系统软件开发讲座

杨栋

2006-5

第一章     基础

前言

       由于大家平时接触电气系统方面的知识比较多,因此在讲嵌入软件前,首先需要大家明确的是:什么是嵌入式系统,按照当前最新的定义方式,加上我的理解,我认为嵌入式系统是以微处理系统技术为核心、以应用需求为导向,高可靠、模块化的软硬件技术为基础而形成的稳定的应用系统。大家注意定义中的几个重点词语:微处理器、软硬件、需求、模块化、稳定。这些是区别于一般的非嵌入系统如计算机系统、电气系统的主要特点。由于时间原因,这里我不作详细的讲解,大家可以查找相关的资料自己去了解。

       嵌入软件系统是以嵌入硬件作为支撑,为了完成应用需求而围绕硬件系统进行的开发。在业界通常存在两种不同的划分方法,一种是广义的嵌入软件系统,一种是狭义的,分别定义如下:

广义定义:一切基于嵌入板件,围绕嵌入板件而进行的应用系统开发行为。

狭义定义:以实时嵌入操作系统(RTOS)为核心,围绕嵌入板件进行的应用系统开发的行为。

其中狭义的定义在通信领域、手持设备等应用的一种定义,在这些领域的软件开发几乎全部是基于此的,如大型交换机、路由器、智能手机等,所用到的操作系统包括商用的vxworks、QNX、wince等、开放源码的linux、ucos、ecos等,在ROTS系统开发中一个嵌入软件系统的开发往往划分的很细,如一个简单的嵌入软件系统开发就包含嵌入系统设计工程师、嵌入系统BSP设计工程师、嵌入系统高级软件工程师、嵌入系统软件开发工程师、嵌入系统协议开发工程师、嵌入系统软件测试工程师、嵌入系统软件版本管理工程师等,由于使用了RTOS,上述人员的工作可以按照进度在系统设计阶段由系统设计工程师进行并行设计,大大提高开发效率。关于嵌入操作系统有太多的细节需要讲述,由于时间原因,这里我也不作详细讲解,如果有机会可以单独讲解。

       这里需要详细讲述的是广义的定义,这个定义是在小型系统开发、自动化终端设备开发、特别是51系列的小型单片机起家的开发者中流行的一种定义,这个定义几乎囊括了所有含CPU或准CPU开发的所有软件开发系统,考虑到工程机械领域的特点,我也讲这种定义引入进来,在不需要RTOS的简单系统开发中,分工也没有那么细,大体可以分为软件系统设计、软件系统开发、软件系统测试、应用系统维护等,并且往往不是并行的,因此可以一两个人完成。

       考虑到时间原因,我将重点讲述基于硬件板的相关支持的开发,在嵌入操作系统存在的情况下称为板级支持包的开发,前一段时间我专门总结了一个专题,考虑到工程机械的特点,觉得这次讲不太合适,因此这里仅仅讲解无RTOS支持的简单系统的软件开发,大体分两部分讲解。

1、  嵌入软件开发的流程。

2、  常见驱动的开发

3、  常见调试系统和调试方法

嵌入软件开发的流程

首先在讲流程前,需要强调应当具备的知识:作为一个合格的嵌入软件开发工程师,首先需要具备基本的硬件知识,知道基本的硬件原理和知识,否则无法了解硬件系统,更不要说和硬件工程师沟通了、其次需要知道一定的软件工程知识,这对于软件系统的早期开发是至关重要的,另外需要了解一些通用的软件算法,如各种查找算法等,这不用强调大家也是知道的。

 

第一步、需求总结:研发的产品用来干什么?需要那些外部接口?需要完成的基本功能包括什么?是否要求具有开放性(可扩展)?等等需求,需求分析需要具体入微,这样才能够为后面做准备。

第二步、需求分析:通过需求的总结,需要得出下面的一些问题的结论:RAM需要多少、flash需要多少、需要那些通信口、需要那些扩展协议、需要那些通用软件模块、有那些测量控制量、需要那些算法、可靠性要求如何、是否需要操作系统、选择的软件编程语言如何等等,这里不作一一列举。

第三步、参与硬件CPU选型:经过第二步,可以与硬件工程师协商,告诉他最少需要多少RAM、flash,是否需要外扩存储器,要求的运行速度如何、需要大概多少IO口、需要看什么类型门狗、需要那些外围接口,需要的测控量需要那些特殊的硬件处理、需要的功耗情况、等,经过沟通大体可以确定一个CPU选型的范围,进一步了解相关CPU的资料,进一步结合需求进行细节上的选择。这一步很重要,因为CPU的确定是软件系统开发的最重要的一步,这一步从软件上考虑必须还要考虑cpu的调试特性、是否有仿真板可买、是否主流cpu、技术支持如何等,如果选择操作系统,这里还有更多的工作要做,由于时间有限,本次课程不考虑操作系统的问题。

第四步、其他硬件选型:选定CPU后,需要协助硬件工程师选定其他外围相关硬件,如通信端口的相关器件是否满足通信需求、测控端口相关的器件是否满足测控需求、存储器片选是否够用,如何扩展,cpu速度确定、看门狗器件的选型、通信器件选型、各种器件的综合特性是否满足需求,提出备用方案等。

第五步、工具选型:硬件选型完毕后,需要进行调试工具的选型,如示波器、万用表、信号笔、电气特性测试工具或设备等的具体要求。如果使用嵌入操作系统还要提出如逻辑分析仪、打点或打桩测试工具等。

第六步、软件选型:这一步主要是根据前面确定的硬件系统,选择合适的软件仿真器、软件调试工具、软件编译工具、各种端口调试工具等,需要嵌入的商业软件模块的特殊测试工具、商业协议测试工具等。

如果按照软件工程的说法,上述几步应当叫做需求分析阶段,通过上述几步的反复选择,基本确定开发系统所需要的软件平台和硬件平台,然后下一步就可以进行软件系统的设计。

第七步、软件设计:这一步首先需要仔细研读CPU以及其他硬件器件的用户手册,如果有开发板,首先必须学会使用开发工具、调试工具、编译工具、下载工具等,然后通过开发板让整个CPU能够转起来,并通过开发板确定cpu各种外围端口的操作方式、cpu的程序编译下载方式、cpu的boot方式、特别是与编译器的相关的内存划分方式等,对于特别的某些CPU,还要了解这种CPU的部分汇编语言的特性,因为很多cpu的启动代码都需要用汇编完成,即使有操作系统存在,在写bsp的时候也离不开汇编语言,很多人说汇编语言过时了,实际上并不是,汇编语言在c、java等流行的现在,往往在软件开发的关键点上是必须的。

第八步、关键软件技术点的开发:使用开发板还需要完成的一项重要工作是关键技术点的开发,如关键端口的驱动的开发、关键算法在选定CPU上的验证、关键软件模块的设计、关键外围器件的驱动的开发(如果开发板上有)、其他与开发系统相关的软件关键技术点。

第九步、软件系统结构设计:通过前面两步,了解了cpu的特性、解决了关键的软件技术点,下一步需要将整个系统的软件构架建立起来,并将整个产品的软件划分成若干的软件模块,为每个软件模块提出不同的内存、时间、并行性、耦合性等,软件模块的划分尽量的独立、耦合性小、特点鲜明,在这一阶段还要提出软件系统的测试方案。

第十步、软件编码开发:从这一步开始,软件的开发进入详细的模块开发和编码阶段,整个项目组的人根据各自的软件模块的需求的技术要求完成各自软件模块的设计、编码、测试等工作。

第十一步、软件组装:各个软件模块的测试开发完成后,将各个软件模块根据各自的特点完成组装,形成一个完整的软件系统,组装的过程中特别注意组装的顺序,如初始化的顺序,根据模块的耦合性的特点确定模块的运行方式和在系统中的运行特点。并完成模块的再次划分,将某些复杂的软件模块再次分解或合并某些模块,同时注意需求变化引起的软件模块的变化,也在这一阶段进行调整。组装的最终结果是形成一个可以在硬件板上进行简单的硬件调试的软件系统。

第十二步、软件硬件调试:这时硬件一次样机应当已经开发完毕,需要配合硬件进行硬件的测试,此时将前面的各种软件模块分别在硬件系统上进行运行,这时不要将整个软件在新的硬件上运行,应当慢慢的进行调试,如首先让cpu运行起来,然后是基本的中断处理程序、时钟程序、然后是各种内部的驱动程序,然后是各种外围驱动,根据硬件的情况,或者调整硬件、或者调整软件等,这一步是配合硬件将一次硬件样机调试完毕,发现在设计初期的硬件问题和软件问题,并通过这一步反复将二次样机的硬件系统确定下来,这一步还要完成板级驱动模块的测试工作。

第十三步、应用软件调试:如果硬件系统基本确定,下面就是应用软件的调试了,由于前面硬件的各种驱动模块已经调试完毕,这一步就是应用软件模块的调试、如各种算法模块、各种协议模块、特殊的应用软件模块等,这一步还要完成应用软件模块的测试工作。

第十四步、综合软件调试:通过上面几步可以进入软件的综合测试,将在样机上调试好的各个软件模块进行组装后,调整好各自的逻辑关系,利用开发初期要求的功能需求进行调试,看是否满足需求,并进行最后的调整。在这一阶段还要完成系统的功能测试。

最后作为产品样机,交测试部门进行产品电气特性、功能特性等的测试,并根据测试情况不断完善改进软硬件系统。

常见驱动的开发

       由于时间关系,对于具体的一些软件开发不作讲述了,这里重点抽时间将几种常见的端口的驱动的开发,因为这些开发方式对于不同的CPU来说都是大同小异的,下面我以LPC2292作为例子讲述。

IO:

UART:

SPI:

I2C:

CAN

中断系统:

扩展存储器:

AD通道:

内存重映像:

看门狗:

定时器:

LCD接口:

 

I/O口

       IO口可能是最普遍的一种软件应用方式,通常的Mcu都有很多的IO口,一般一个io口对应一个cpu的引脚,对于软件上来说,通常分为8位、16位、32位的io口,不同的cpu的软件定义是不同的,如lpc2292定义32位的io口,寄存器的每一位表示一个io管脚。

IO口的功能很广泛,但是基本的功能只有两个

1、  cpu可以读取连接到cpu引脚上的电平,例如可以通过DI的外围电路输入到一个IO口,读取外部di的分合。

2、  另外一个基本功能就是在cpu相应的引脚上输出高/低电平,例如可以通过这种功能输出具有一定频率的方波,还可以通过增加外围电路来驱动其他的输入输出芯片或中间继电器等。

通过io口的这两个基本功能,混合使用可以得到很多的扩展功能:可以模拟总线,如与定时器的捕获功能相互结合何以虚拟一个串口、可以通过控制电平的输出或电平读取模拟spi、i2c的时序、可以模拟按键、模拟lcd时序控制简单的显示屏等。

IO口的性能,这是一个在实际应用中注意的问题,也是一个容易被忽视的问题,一般来说在使用的时候需要注意IO的一下几个性能:

1、  输入输出电压:一般看cpu的电压,lpc2292是3.3V供电,那么它的口输入输出电压就是3.3V左右。了解输入输出电压有利于防止出现不对口电平的连接,如一个5V系统的输出电平最好不要连接到一个3.3V的口上,会出现很多的问题。如减小口寿命,引起电平判断出错等。

2、  负载::通常指口上的输入输出的最大电流,如果不了解这个特性,久容易引起口的烧毁。

3、  口的方向:一般来说io口都是双向的,可以作为输入口,可以以作为输出口,但是某些特殊的口可能是单向的,这应当注意。

4、  口内部的电气特性:如是否有内部上拉电阻,内部的源、漏连接方式(MOS管有3个引脚,分别是源极,漏级,栅级开漏输出就是漏极开路输出,),口线悬空时状态(0、1、非零非一的三态)。了解这些有利于我们对口的操作,例如考虑内部上拉电阻在设计外部上拉电阻的阻值时必须考虑、开漏方式用作io口必须加上拉、口的悬空状态可以决定对于不使用的口是直接接地还是上拉或者悬空等。

5、  io口的速度

IO口的操作:

1、 首先确定io口的控制方向,是输入还是输出,如果是复用引脚还要进行其他的配置。配置的寄存器一般叫选择寄存器或方向寄存器,有一些cpu还有控制寄存器,可以设置内部的源漏方式、是否内部上拉等。

2、 然后根据口的方向通过写入或读取数据寄存器输出或获得电平。

UART:

       Uart是一种叫做通用异步收发协议的简称,异步是指在发送数据的时候不需要发送时钟信息,这种协议的典型通信波特率为38400或更低,根据mcu时钟最大可以支持到55K,这是一种面向字符的链路协议,用作低速通信使用。Uart链路在输出的串行数据流中加入奇偶校验位,并对从外部接收的数据流进行奇偶校验。在输出数据流中加入启停标记,并从接收数据流中删除启停标记。

       实际应用中很多mcu本身带有uart控制器,也有一些独立的uart协议芯片如16c552等,uart控制器用途很广,最典型的就是可以用作RS232、RS422、RS485。

       一般来说uart控制器可以用来进行modem模式的通信,但是应用最广泛的还是最简单的232C电气连接模式的串行通信,连接三根线,rxd、txd、gnd。限于时间问题,在原理上不作过多的讲解,下面仅仅讲述与之相关的传输模式。

       一个字符在异步串行模式中的传输依照下面的模式(起止异步模式):起始位+数据位+校验位+停止位,其中起始位1 位,数据位可以是5、6、7、8位,停止位可以是1、1.5、2位,校验位1位或0位。对于正逻辑TTL电平情况下(一般的情况genju GB249,>2V为逻辑1 <0.8V为逻辑0),在线上处于空闲状态的时候是逻辑高电平,因此起始位是一个值为0的位,所以对于正逻辑的TTL电平,起始位是一位时间的低电平;停止位是值为1的位,所以对于正逻辑的TTL电平,停止位是高电平。对于负逻辑(如RS-232电平-5~-15V为逻辑高)则相反。

例如,对于16进制数据55aaH,当采用8位数据位、1位停止位没有校验传输时,它在信号线上的波形如图1(TTL电平)和图2(RS-232电平)所示。

注意没有画时钟并不等于没有时钟,否则就没有波特率了,实际上uart协议中按照管理是以系统时钟(或分频)的时钟作为采样时钟,根据CPU的不同一般约定为8/16/32点采样,取中间某几个连续采样值作为实际值的。

这里需要多讲一点的就是校验位,校验位一般是通过补充校验位使传输的数据的逻辑高电平达到奇数或偶数个,例如前面的0x55如果使用奇校验实际线上传输的位序列就是00101010111。

       Uart的软件驱动操作很简单,通常首先需要利用系统主时钟设置波特率发生器模块的通信波特率、校验方式、停止位、起始位等,然后设置一些数据缓存寄存器以及发送和接收中断,由于现在的uart控制器基本上都带有数据锁存功能,因此数据的发送和接受很简单:发送数据的时候一般将发送数据直接放在在发送缓冲寄存器或发送fifo中即可,接受的时候如果使用中断方式,在接受缓冲区接收到数据的时候会产生接受中断,在接受中断中读取接受缓冲寄存器或者接受fifo久行,如果使用查询方式,只要不断查询接受标志即可。

SPI总线

       SPI通常叫做串行外部器件接口总线,用来和外部器件如E2PROM、键盘、时钟、AD等器件进行数据交换,SPI 是一个全双工、面向字符、同步的串行接口。它可以处理在一个给定总线上多个互连的主机和从机。在一定数据传输过程中,一般情况下,总线上只能有一个主机和一个从机能够通信,当然特别的情况可以允许多主存在但是需要一个中央主节点自己控制其他节点的主从关系,这里不多解释(如管脚漏式输出情况下)。在一次数据传输中,主机总是向从机发送一个字节数据,而从机也总是向主机发送一个字节数据。SPI是一种4线连接的一种片间通信总线。连接的示意图如下:

其中各个引脚解释为:。。。。。SEL一般是低电平有效的。同样芯片中控制spi总线的叫做SPI控制器,控制器有独立的波特率发生器,速率可以达到几M,在spi传输过程中数据的发送和接受是同步的。SPI在实际的传输中存在多种模式,这可以通过软件进行设定,下面是spi总线在某一中传输模式下的典型时序图:

对于sPI的软件操作主要注意下面几个方面:

1、  设置spi波特率发生器的时钟

2、  设置spi的主从模式,因为主从模式下操作是完全不同的。

3、  设置传输模式,电平模式,中断设置等。

4、  主模式下=>如果不需要手动设置主模式发送选择,那么发送数据的时候只要将需要发送的数据写入发送缓冲区即可,然后等待发送完毕状态标志,然后读取接受的数据(根据设置而定)然后发送下一字节,依此类推。

5、  从模式下与主模式相同,只是在总线空闲时将数据放入发送缓冲区,在接受到数据后发送的数据将自动发送出去。

I2c总线

       I2C总线是一种两线制的可寻址串行总线,用来和外部器件如E2PROM、键盘、时钟、AD等器件进行数据交换,I2C的最大特点是多主和可寻址,由于只有两根线,因此连接简单,和spi一样的多主的概念也是总线上同时只能够有一个主控制存在但是可以不需要软件参与主从节点的控制。连接示意图如下:

其中SDA为数据线SCL为时钟线,I2C最高支持的速率达到几百k。一帮情况下有4中工作模式:主发送模式、主接收模式、从发送模式和从接收模式。可以通过软件设定进行切换,I2C的典型时序图如下:

一次i2c的数据传输总是以一个start信号开始,数据线先从高到低电平的跳变,时钟信号再设置为低;一次数据传输或接收结束以一个end信号结束,这是一个钟信号先拉回高,然后数据信号再回到高。传输中按照不同模式存在不同的时序操作,例如数据发送的时候早Start开始后传输首先一个地址,然后等待ack对方应答,然后再传输数据,等待应答等等。。。直到一次数据传输完毕,以end结束。I2c的时序很简单,但是因为只有一根线数据线,因此一次传输的时序控制不容易,在实际操作的时候需要特别注意。

       I2C的软件操作根据不同的器件操作有所不同,这里由于时间原因不作详细的讲述了,如果大家使用到可以看相关的器件手册。

文章录入:Polylove    责任编辑:Polylove 
  • 上一篇文章: C语言测试_嵌入式程序员应知道的0x10个基本问题

  • 下一篇文章: 没有了
  • 发表评论】【告诉好友】【打印此文】【关闭窗口
          最新热点       最新推荐       相关文章
  • 嵌入式系统的总线技术及其应…

  • 嵌入式系统设计中硬件和软件…

  • Linux在嵌入式系统中的应用

  • arm开发(2)

  • arm开发(1)

  • ARM嵌入式系统中断向量表的动…

  • 嵌入式系统设计的新发展及其…

  •   网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)