跳至主要内容

【转】嵌入式系统开发面临的问题

1. 嵌入式系统开发所面临的问题

  嵌入式软件开发有别于桌面软件系统开发的一个显著的特点,是它一般需要一个交叉编译和调试环境,即编辑和编译软件在主机上进行(如在 PC 机的 Windows 操作系统下),编译好的软件需要下载到目标机上运行(如在一个 PPC 的目标机上的 VxWorks 操作系统下),主机和目标机建立起通讯连接,并传输调试命令和数据。由于主机和目标机往往运行着不同的操作系统,而且处理器的体系结构也彼此不同,这就提高了嵌入式开发的复杂性。

  总的来说,嵌入式开发所面临的问题主要表现在以下几个方面:

  1.1 涉及多种 CPU 及多种 OS

  嵌入式的 CPU 或处理器可谓多种多样,这包括了 Pentium、MIPS、PPC、ARM,XScale 等,而且应用都很广,在其上运行的操作系统也有不少,如 VxWorks、Linux、 Nuclears、WinCE等等,即使在一个公司之内,也会同时使用好几种处理器,甚至几种嵌入式操作系统。如果需要同时调试多种类型的板子,每个板子上又运行着多个任务或进程,那复杂性是可想而知的。

  1.2 开发工具种类繁多

  不仅各种操作系统有各自的开发工具,在同一系统下开发的不同阶段也有不同的开发工具。如在用户的目标板开发初期,需要硬件仿真器来调试硬件系统和基本的驱动程序,在调试应用程序阶段可以使用交互式的开发环境进行软件调试,在测试阶段需要一些专门的测试工具软件进行功能和性能的测试,在生产阶段需要固化程序及出厂检测等等。一般每一种工具都要从不同的供应商处购买,都要单独去学习和掌握,这无疑增加了整个公司的支出和管理的难度。

  1.3 对目标系统的观察和控制

  由于嵌入式硬件系统千差万别,软件模块和系统资源也多种多样,要使系统能正常工作,软件开发者必须要对目标系统具有完全的观察和控制能力,例如硬件的各种寄存器、内存空间,操作系统的信号量、消息队列、任务、堆栈等。

  此外,嵌入式系统变化更新比较快,对开发时间要求比较紧,尤其是消费类产品更是如此,如果有一套功能强大的嵌入式软件集成开发工具可以满足嵌入式软件开发各个阶段的需求,同时又使用方便,界面友好,那是最理想不过了。美国风河系统公司新近推出的"Workbench"嵌入式软件开发平台正是这样一个"全能选手"。

  2.Workbench 嵌入式开发平台的特点和优势

  风河公司一直致力于嵌入式软件领域的研究,其 Tornado 开发环境和 VxWorks 嵌入式操作系统产品在嵌入式领域中应用非常广泛。风河公司的新一代 Workbench 开发平台继承了其原有的 Tornado 集成开发平台的一贯优势,并且功能更加强大,由于新采用了先进的 Eclipse软件框架结构,从而使整个系统更加开放和易于扩展。它的主要优势表现在:

  2.1 以开放的 Eclipse 平台为框架,调试环境可充分进行客户化定制

  Eclipse 软件框架结构是一个完整和开放的基础平台,它能够将图形工具以及任何必须的功能通过标准的接口集成到同一个开发环境中。目前 IBM,HP 及 Borland 等商业开发工具提供商均支持 Eclipse 开发平台,网上也存在着大量的为 Eclipse 平台开发插件的社区。由于Workbench 符合 Eclipse 框架,所以这些商用的和免费的符合 Eclipse 平台接口的插件均可以集成到 Workbench 开发环境中,这极大扩展了 Workbench 的功能。例如,如果用户想使用自己熟悉的配置管理工具或者编辑器,就可以找到这样一个插件并集成进来,这样用户就会感到开发过程非常适合自己的需要。

  不仅如此,风河公司还对 Eclipse 做了多方面的增强,从而显著提高了系统的性能。例如Workbench 实现了异步接口功能,需要长时间运行的任务可以在后台运行,与此同时还能继续接收开发人员的调试请求,这样不至于使开发人员做长时间的等待;另外,Workbench 还优化了对目标机数据的请求机制,即系统只检索在集成开发环境的当前视图中所需要的少量数据,看不见的数据则不向目标机索取,这样就大大提高了交叉调试时系统的响应速度并减少了系统负荷。

  2.2 单一的全功能平台,涉及到产品的整个开发周期

  一个嵌入式产品的软件开发,其"实质性"的过程包括了从开始的硬件启动,BSP(板级支持包)及驱动的开发,到应用程序的开发,再到后来的测试、验证,直至最后的生产阶段。一般来说,每个阶段都可以找到不同的工具来使用(实际情况也大都如此)。而风河公司的Workbench 开发平台改变了这一现状,它以一个单一的 Workbench 平台,提供了上述开发阶段所需要的几乎所有功能。具体来说,这包括了硬件系统仿真功能(有配套的硬件仿真器),工程管理和构建系统,编辑器,版本管理,命令解释器,调试工具,系统分析工具,系统观察工具,FLASH 编程工具等等,再加上风河公司自己开发的和第三方厂家提供的各种软件功能模块和开发工具的插件,所有这一切,都集成在 Workbench 这个统一的平台之下,这必将大大改善嵌入式软件的开发环境。对一个企业来讲,更可以提高效率,减少投资,简化管理。

  2.3 广泛的适用性,特别适合复杂的目标系统

  Workbench 平台的广泛适用性主要体现在七"多"上,即多任务、多目标、多模式、多 OS、多 CPU、多连接形式、多主机环境。

  多任务:在 Workbench 调试环境下,可以同时连接目标系统上的多个不同的任务(或者进程),每个任务都可以单独设置断点,进行单步调试。开发者再也不用象以前那样,为了调试多个任务,先断开一个任务的连接,再连接到另外一个任务上去。这就给具有多任务的目标系统开发提供了便利,尤其是需要查看多个任务之间的配合关系时体现的优势更加明显;

  多 CPU:我们知道,风河公司的 Tornado 开发环境可以说已经支持了全系列的主流 CPU(或处理器),而 Workbench 也将继承这个传统,目前推出的 Workbench 2.2 版本已经可以支持 PENTIUM、PPC、MIPS 系列的所有主流 CPU。对 ARM、XSCALE、SH 等系列的支持正在移植和测试中,不久即将发布正式版本(Workbench 2.3)。

  多 OS:目前的 Workbench 2.2 不仅支持 VxWorks 嵌入式操作系统(6.0 以上版本),而且支持Linux 操作系统,这确实给广大的 Linux 嵌入式开发人员带来了福音。大家知道,由于 Linux 操作系统的"免费"性质,使得其上的软件开发系统一直比较分散和孤立,用起来不是特别方便,有了 Workbench 以后,嵌入式 Linux 的开发就同 VxWorks 的开发一样方便和快捷了。并且以后,如果有必要的话,还可以增加对其它类型嵌入式操作系统的支持,因为 Workbench 本身是开放和可扩展的。

  多目标:Workbench 对复杂目标系统的强有力的支持还表现在它可以支持同时连接多块目标板进行调试开发,更为可贵的是这些目标板上处理器可以各不相同,并且在目标板上运行的操作系统也可任意(既可以运行 VxWorks,也可以运行 Linux),而调试工作都可以在同一个 Workbench 界面中同时进行,这无疑给一些复杂系统的调试带来了极大的便利。

  多连接:所谓多连接,是指 Workbench 所在的主机和目标机之间可以有多种连接方式进行通讯,如果目标系统中存在以太网接口,那就应该首选以太网连接,因为这种方式速度比较快;如果目标系统中不存在以太网接口,那也可以选用串行口进行通讯连接,除了速度较慢以外,功能上与以太网连接没有什么区别。另外,在目标板初始调试阶段,还可通过风河的硬件仿真器(WindRiver ICE / WindRiver Probe)进行连接,观察硬件状态,以迅速定位硬件问题。

  多模式:在 Workbench 中调试程序,即可以采用任务模式,也可以采用系统模式。所谓任务模式,是指各个任务之间独立运行,暂停其中一个任务的运行不影响其他任务的运行(主要用于调试各个任务);而系统模式则是指只要暂停了系统的任何一处,整个系统都停止下来(主要用于调试中断程序)。

  多主机:这是指 Workbench 可以在 Windows、Linux、Solaris 这三大流行的主机操作系统下运行,这不仅可以适合不同开发者的使用习惯,而且在一定程度上有利于某些目标系统的开发,如使用 Linux 主机环境调试运行 Linux 系统的目标板(但这并不是必须的)。

评论

此博客中的热门博文

【转】cs8900网卡的移植至基于linux2.6内核的s3c2410平台

cs8900网卡的移植至基于linux2.6内核的s3c2410平台(转) 2008-03-11 20:58 硬件环境:SBC-2410X开发板(CPU:S3C2410X) 内核版本:2.6.11.1 运行环境:Debian2.6.8 交叉编译环境:gcc-3.3.4-glibc-2.3.3 第一部分 网卡CS8900A驱动程序的移植 一、从网上将Linux内核源代码下载到本机上,并将其解压: #tar jxf linux-2.6.11.1.tar.bz2 二、打开内核顶层目录中的Makefile文件,这个文件中需要修改的内容包括以下两个方面。 (1)指定目标平台。 移植前:         ARCH?= $(SUBARCH) 移植后: ARCH            :=arm (2)指定交叉编译器。 移植前: CROSS_COMPILE ?= 移植后: CROSS_COMPILE   :=/opt/crosstool/arm-s3c2410-linux-gnu/gcc-3.3.4-glibc-2.3.3/bin/arm-s3c2410-linux-gnu- 注:这里假设编译器就放在本机的那个目录下。 三、添加驱动程序源代码,这涉及到以下几个方面。(1)、从网上下载了cs8900.c和cs8900.h两个针对2.6.7的内核的驱动程序源代码,将其放在drivers/net/arm/目录下面。 #cp cs8900.c ./drivers/net/arm/ #cp cs8900.h ./drivers/net/arm/ 并在cs8900_probe()函数中,memset (&priv,0,sizeof (cs8900_t));函数之后添加如下两条语句: __raw_writel(0x2211d110,S3C2410_BWSCON); __raw_writel(0x1f7c,S3C2410_BANKCON3); 注:其原因在"第二部分"解释。 (2)、修改drivers/net/arm/目录下的Kconfig文件,在最后添加如...

【转】嵌入式开发中使用DDD进行调试

 在嵌入式程序开发过程中,程序员要进行大量的调试,以此验证程序的正确性,修改潜在的错误。调试器对于程序员来说是不可或缺的必备工具。在Linux环境中,有很多调试工具和调试辅助工具,例如GDB、XXGDB、RHIDE、XWPE、GVD和DDD等。其中,DDD是命令行调试器的图形前端,除了一般的程序调试功能以外,还具有交互式图形数据显示的功能。它在嵌入式应用开发中也十分出色。本文主要讲述DDD(Data Display Debugger)的使用方法。      1.认识DDD     GNU DDD是命令行调试程序,如GDB、DBX、WDB、Ladebug、JDB、XDB、Perl Debugger或Python Debugger的可视化图形前端。它特有的图形数据显示功能(Graphical Data Display)可以把数据结构按照图形的方式显示出来。DDD最初源于1990年Andreas Zeller编写的VSL结构化语言,后来经过一些程序员的努力,演化成今天的模样。DDD的功能非常强大,可以调试用C\C++、Ada、 Fortran、Pascal、Modula-2和Modula-3编写的程序;可以超文本方式浏览源代码;能够进行断点设置、回溯调试和历史纪录编辑;具有程序在终端运行的仿真窗口,并在远程主机上进行调试的能力;图形数据显示功能(Graphical Data Display)是创建该调试器的初衷之一,能够显示各种数据结构之间的关系,并将数据结构以图形化形式显示;具有GDB/DBX/XDB的命令行界面,包括完全的文本编辑、历史纪录、搜寻引擎。     DDD是开源软件,用户可以去 http://www.cs.tubs.de/softech/ddd/ 下载.rpm格式的DDD源码文件。      图1显示的是DDD的主窗口。它主要由选单栏、工具条、数据窗口、源文件窗口、机器码窗口、控制台和命令工具窗口等几部分组成。其中,数据窗口用于观察复杂的数据结构,在删除数据之后,显示仍然有效;源文件窗口显示源代码、断点和当前执行到达的位置,选择该窗口中的"Display"项,可以显示任意表达式的值;机...

【转】函数指针和指针函数

【函数指针】        在程序运行中,函数代码是程序的算法指令部分,它们和数组一样也占用存储空间,都有相应的地址。可以使用指针变量指向数组的首地址,也可以使用指针变量指向函数代码的首地址,指向函数代码首地址的指针变量称为函数指针。 1.函数指针定义 函数类型 (*指针变量名)(形参列表); "函数类型"说明函数的返回类型,由于"()"的优先级高于"*",所以指针变量名外的括号必不可少,后面的"形参列表"表示指针变量指向的函数所带的参数列表。 例如: int (*f)(int x); double (*ptr)(double x); 在定义函数指针时请注意:     函数指针和它指向的函数的参数个数和类型都应该是―致的; 函数指针的类型和函数的返回值类型也必须是一致的。 2.函数指针的赋值 函数名和数组名一样代表了函数代码的首地址,因此在赋值时,直接将函数指针指向函数名就行了。 例如, int func(int x);   /* 声明一个函数 */ int (*f) (int x);    /* 声明一个函数指针 */ f=func;            /* 将func函数的首地址赋给指针f */ 赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,因此经过赋值以后,指针f就指向函数func(x)的代码的首地址。 3.通过函数指针调用函数 函数指针是通过函数名及有关参数进行调用的。 与其他指针变量相类似,如果指针变量pi是指向某整型变量i的指针,则*p等于它所指的变量i;如果pf是指向某浮点型变量f的指针,则*pf就等价于它所指的变量f。同样地,*f是指向函数func(x)的指针,则*f就代表它所指向的函数func。所以在执行了f=func;之后,(*f)和func代表同一函数。 由于函数指针指向存储区中的某个函数,因此可以通过函数指针调用相应的函数。现在我们就讨论如何用函数指针调用函数,它应执行下面三步: 首先,要说明函数指针变量。 例如:int (*f)...