近年来微电子技术迅猛发展,处理器技术发展速度也随之加快,嵌入式领域发生了翻天覆地的变化。特别是网络的普及,消费电子异军突起,嵌入式与互联网成为最热门的技术。在所有操作系统中,Linux是发展最快、应用最广泛的一种操作系统。Linux的开放性,以及其他优秀特性使其越来越成为嵌入式系统开发的操作系统首选。
1. 嵌入式系统开发所面临的问题
嵌入式软件开发有别于桌面软件系统开发的一个显著的特点是一般需要一个交叉编译和调试环境,即编辑和编译软件在主机上进行,编译好的软件需要下载到目标机上运行 ,主机和目标机之间建立起通讯连接,并传输调试命令和数据。由于主机和目标机往往运行着不同的操作系统,而且处理器的体系结构也彼此不同,这就提高了嵌入式开发的复杂性。
总的来说,嵌入式开发所面临的问题主要表现在以下几个方面:
1.1 涉及多种CPU 及多种OS
嵌入式的CPU或处理器可谓多种多样,包括MIPS、PPC、ARM,XScale等不同的架构,而且它们都很广泛地应用在众多领域。在这些处理器上运行的操作系统也有不少,如VxWorks、Linux、uC/OS、WinCE等
等。在一个公司之内,可能会同时使用好几种处理器,甚至几种嵌入式操作系统。如果需要同时调试多种类型的板子,那复杂性是可想而知的。这也是我们选用
BDI2000的原因之一。BDI2000是一款功能强大且非常稳定耐用的JTAG/BDM通用仿真器,由瑞士Abatron公司研制生产的性价比非常高的一款仿真器。它支持多种处理器:PPC/MIPS/ARM/XSCALE/ CPU12/CPU32/M-CORE/ColdFire等,支持Windows/Linux系统平台,支持多种第三方调试器,并且对Flash的烧写也很简单方便。
1.2 开发工具种类繁多
通常各种操作系统有各自的开发工具,在同一系统下开发的不同阶段也会应用不同的开发工具。如在用户的目标板开发初期,需要硬件仿真器来调试硬件系统和基本的引导程序,然后进行操作系统及驱动程序的开发调试。在调试应用程序阶段可以使用交互式的开发环境进行软件调试,在测试阶段需要一些专门的测试工具软件进行功能和性能的测试。在生产阶段需要固化程序及出厂检测等等。每一种工具都要从不同的供应商购买,都要单独去学习和掌握,这无疑增加了整个公司的支出和管理的难度。BDI2000可以适应开发的各个阶段,可以节约企业的支出和简化管理难度。
1.3 对目标系统的观察和控制
由于嵌入式硬件系统千差万别,软件模块和系统资源也多种多样,要使系统能正常工作,软件开发者必须要对目标系统具有完全的观察和控制能力,例如硬件的各种寄存器、内存空间,操作系统的信号量、消息队列、任务、堆栈等。
此外,嵌入式系统变化更新比较快,对开发时间要求比较紧,尤其是消费类产品更是如此,如果有一套功能强大的嵌入式软件集成开发工具可以满足嵌入式软件开发各个阶段的需求,同时又使用方便,界面友好,那是最理想不过了。LinuxScope-JTD调试器就是这样一个理想的选择,它是美国 Ultimate Solution, Inc公司开发的专门用于配合BDI2000的一款调试器:基于Eclipse的集成开发环境和插件技术;提供脚本定制功能实现目标机的特殊操作;提供Linux内核调试功能,容易修改和观察硬件寄存器;增强的MI接口提供在Eclipse下识别硬件断点及模块跟踪;支持标准调试特性: 观察/修改内存,观察汇编代码, 观察变量,观察堆栈,跟踪内存断点(watch point);支持Linux应用程序的开发,支持Windows/Linux系统平台。
2. 嵌入式Linux的调试
2.1嵌入式Linux内核的调试
2.1.1 编译内核
本文所调试的是Montavista Linux,硬件是Intel xscale pxa250。已经拥有超过两千多用户和数以千万计的Montavista Linux产品在市场上销售,它们覆盖从智能手机,高清电视,机器人,无线网络设备到3G电信服务器等各种嵌入式应用。Montavista Linux本身就是用BDI2000来开发调试的。
进入内核源码目录下,配置完成相关选项并准备编译。配置时不要选中KGDB,否则会和BDI2000冲突。
为了调试内核,需要在编译时加入调试信息,否则将无法看到源代码。修改内核源码根目录下的Makefile,在CFLAGS宏定义的末尾添加“–ggdb”选项,保存退出。这里加上gdb是为了更好的使代码适合gdb调试器,另外注意Makefile中的优化设置,有些时候优化会调整代码执行的顺序,在内核的调试阶段,不要加入优化选项。
编译:make dep; make zImage