在VIM中实现对嵌入式软件的调试

发布者:脑洞飞扬最新更新时间:2013-03-18 来源: dzsc关键字:VIM  S3C2440  ARM9架构 手机看文章 扫描二维码
随时随地手机看文章

  引言

  GNU免费提供了一整套工具链,为嵌入式Linux程序的开发和调试提供了完整的支持。其强大的gdb调试工具可以方便地对嵌入式平台上的程序进行跟踪调试;而Linux下强悍的VIM编辑器,不仅可以方便地调用make文件对代码进行编译,而且通过脚本的配置还可轻松地成为高效的代码编辑环境。流传着这样一种说法,“世界上的程序员分三种,一种使用Emacs,一种使用VIM,剩余的是其他。”不去辩论这句话的对与错,单纯从字面意义上来理解,也足见VIM的魅力了。因此,在VIM中实现对嵌入式软件的调试,我们便得到了一个高效、稳定的嵌入式Linux的开发环境。

  1  gdb对嵌入式软件的调试模式

  许多非Linux的嵌入式系统已经在使用gdb与gdb stub对目标板进行远程“交叉调试”;然而,因为Linux内核实现了ptrace()系统调用,所以在对嵌入式应用程序进行调试的时候并不需要gdb stub,而采用gdb套件提供的gdb服务器来对目标板上的嵌入式应用程序进行调试。

  目标板上的gdb服务端gdbserver与主机上的gdb调试器的通信方式主要有两种:使用串口通信的“交叉串行连接”和使用网口的“TCP/IP”联机。鉴于PC端的方便性以及串口资源有限,尤其是现在的笔记本电脑甚至已经不存在串口,所以,大多采用TCP/IP方式,即PC主机与目标板通过网线直连或者PC机与目标板通过路由或者hub等组成局域网通信。这种调试模式如图1所示。

  2  在VIM中实现对嵌入式软件的调试

  我们知道,gdb的功能虽然强大,但由于其基于命令行的操作,所以调试过程不直观,而且Windows下的调试环境集调试与代码编辑为一体,当出现bug的时候,可以方便地对源代码进行修改,相比而言,gdb在这方面又有些失色。既然VIM和gdb的功能如此强大,又完全免费,而且完全适合嵌入式这种特殊的开发模式,那么有没有将二者强强联合的方法呢?有,那就是vimgdb。

  vimgdb是给VIM提供一个可选特性的补丁。它可以在VIM编辑器里提供完整的gdb调试器支持,比如设置断点、查看变量值、gdb命令补全等等,并且这些操作可以在VIM中直观地显示出来。下面阐述在VIM中实现对嵌入式软件调试的具体过程。

  2.1  系统环境及所用软件包版本

  PC操作系统:Ubuntu8.10。

  PC编译器:GNU gcc4.3.1。


 

  PC调试器:GNU gdb6.8。

  目标板Linux内核:2.6.13。

  目标板CPU:S3C2440(ARM9架构)。

  交叉编译器:armlinuxgcc3.4.1。

  交叉调试器:自编译GNU gdb6.8。

  目标板gdb服务端:自编译 GNU gdbserver6.8。

  跨平台开发工具路径:~/buildtools/armlinux,且已经设置好系统路径变量。

  测试代码及程序路径:~/test,包含程序代码test.c及Makefile。

  所用软件包存放路径:~/down。

  所用软件包:VIM编辑器源码vim7.1.tar.bz2、vimgdb711.13.tar.gz、GNU gdb源码gdb6.8.tar.bz2。

  2.2  对VIM源码打vimgdb补丁并编译安装

  ① 运行下面的命令,解压VIM源码及vimgdb补丁文件,并对VIM源码打补丁:

  cd ~/down

  tar jxvf vim7.1.tar.bz2

  tar zxvf vimgdb711.13.tar.gz

  patch d vim71 backup p0 < vimgdb/vim71.diff[page]

  ② 运行下面命令,对VIM编译器进行编译和安装:

  cd ~/down/vim71/src

  make

  make install

  执行完上述操作后,VIM将会被安装在/usr/local路径下。如果想修改安装路径,可在上述的编译安装前,打开~/down/vim71/src/Makefile文件的862行安装路径选项并修改。如将VIM安装在/usr路径下,则将 862 #prefix = $(HOME)修改为862 prefix = /usr。

  ③ 安装vimgdb的runtime文件,运行下面的命令:

  cd ~/down/vimgdb

  tar zxfv vimgdb_runtime.tgz C /usr/share/vim/vimfiles

  2.3  建立交叉调试嵌入式软件的gdb组件

  ① 编译嵌入式gdb调试器服务端gdbserver,运行如下的命令:

  cd ~/down/gdb6.8/gdb/gdbserver

  ./configure??host=armlinux ??target=armlinux

  CC=armlinuxgcc make

  将当前目录下的gdbserver拷贝到目标板文件系统的/bin目录下,以备交叉调试用。

  ② 编译安装交叉调试器gdb,运行如下命令:

  cd ~/down/gdb6.8

  ./configure ??target=armlinux ??prefix=/home/popeye/buildtools/armlinux/

  注意,这里的prefix的值必须填写绝对路径,而不能用“ ~”来替代用户路径/home/popeye,否则会提示prefix路径赋值错误。然后运行:

  make

  这个过程中,可能会出现图2所示的错误。

  出现这种情况的原因是,编译规则中选择了警告选项“Werror”。它会将所有的警告转变为错误,而且出现的有关“getwd”函数的提示信息表明,这里编译器检测到的应该是一个“警告”,而不是真正的语法错误。所以,需改正编译选项:

  cd~/down/gdb6.8/gdb

  gedit Makefile

  注意,此处的Makefile是在执行完上述的make命令后才产生的,在最初的代码包里不含有这个文件。对文件的145行进行修改,去掉WERROR_CFLAGS的赋值,即将“145 WERROR_CFLAGS = Werror”修改成“145 WERROR_CFLAGS =”。然后:

  cd ~/down/gdb6.8

  make

  make install

make过程中的错误提示

  最后进入~/buildtools/armlinux/bin中,发现交叉调试器armlinuxgdb已经存在了。

  2.4  在VIM中实现对嵌入式软件调试前的准备

  在嵌入式软件开发过程中的习惯做法是: 首先,在PC机上编译调试程序,如果在PC机上运行正常,再进行交叉编译。然后,将软件移植到目标板上,如果在目标板上出现bug,再用交叉调试器armlinuxgdb进行调试。

  简而言之,对嵌入式软件的调试过程包含两个部分:PC机上调试部分和嵌入式平台上的调试部分。在这个过程中,可能既用到PC机上的调试器gdb,又用到交叉调试器armlinuxgdb,而对应的是同一个源代码程序和运行在不同平台上的两个可执行程序。同时涉及两个调试器转换的问题,但vimgdb只能对字符串为“gdb”的系统命令进行调用。

  下面,将这个比较困难的问题简单化:

  ① 编辑适用的Makefile,控制生成对应不同平台的可执行程序:

  cd ~/test

  其中,test.c为实验代码,Makefile为编译规则,我们简单编写Makefile的内容为:

  testpc: test.c

  gcc g Wall o testpc test.c

  testem: test.c

  armlinuxgcc g Wall o testem test.C

  当执行“make testpc”命令时,就会生成可运行在PC机上的可执行程序;执行“make testem”则生成可运行在嵌入式目标板上的可执行程序。[page]

  ② 修改vimgdb的快捷键映射脚本,在VIM中实现PC调试器与交叉调试器的轻松切换。

  首先,针对vimgdb只能对字符串为“gdb”的系统命令进行调用,做如下的工作:

  mv /usr/bin/gdb /usr/bin/gdbpc

  cd ~/buildtools/armlinux/bin

  ln s /usr/bin/gdbpc gdb

  由于已经将~/buildtools/armlinux/bin添加到了系统路径里面,所以执行完上述操作后,在任何时候,运行“gdb”命令时,真正运行的调试器取决于这里gdb所连接的调试器。

  其次,编辑文件/etc/vim/macros/gdb_mappings.vim。主要修改和添加的部分为:

  a. 添加调试器转换函数,并设置转换开关为大写“E”键(Shift+E实现):

  let s:emOS_k = 1

  nmap E :call emOS()

  function! s:emOS()

  if s:emOS_k

  let s:emOS_k = 0

  exec ":!ln sf ~/buildtools/armlinux/bin/armlinuxgdb ~/buildtools/armlinux/bin/gdb"

  echohl ErrorMsg

  echo "NOW! Gdb is ready for Embedded System !!!"

  echohl None

  else

  let s:emOS_k = 1

  exec ":!ln sf /usr/bin/gdbpc ~/buildtools/armlinux/bin/gdb"

  echohl ErrorMsg

  echo "Gdb is ready for PC,, Now"

  echohl None

  endif

  Endfunction

  b. 在语句if s:gdb_k行下添加代码:

  nmap :bel 25vsplit gdbvariables

  nunmap E

  即在进入调试状态后,屏蔽掉调试器转换快捷键E,并设置快捷键F8来显示变量值监测窗口。

  c. 在let s:gdb_k = 1行下添加代码:

  exec ":!ln sf /usr/bin/gdbpc ~/buildtools/armlinux/bin/gdb"

  nmap E :call emOS()

  即在退出调试状态后,还原gdb命令为gdbpc的调用,并还原“E”的调试器转换开关作用。

  d. 在/etc/vim/vimrc中添写语句:

  run macros/gdb_mappings.vim

  使得启动vim后,便会在vim中启动对gdb进行调用的快捷键映射。

  至于在gdb_mappings.vim中具体设定的其他快捷键,由读者自己分析或设定即可。

  2.5  在VIM中对嵌入式软件进行调试

  下面设定目标板上的嵌入式软件调试时所用的快捷键: E为调试器转换开关;F9为进入调试模式;F8为开启变量监视窗口;空格键为开启命令行输入窗口;调试模式为PC通过超级终端对嵌入式目标板进行输入输出,Ubuntu8.10通过TCP/IP方式对嵌入式软件进行调试;PC机Linux IP为222.31.51.147;目标板IP为222.31.51.180;调试连接端口为1234。

  ① 用VIM打开~/test/test.c,运行命令“:make testem”,将生成的testem文件拷贝到嵌入式平台的文件系统下,并在嵌入式平台运行命令,指定等待连接的交叉调试器地址、连接端口以及要调试的嵌入式程序:

  gdbserver 222.31.51.147:1234 testem

  嵌入式端会出现如下的类似提示信息,进入等待连接状态:

  Process testem created; pid = 801

  Listening on port 1234

  ② 按下大写“E”键(Shift+按键E),根据VIM窗口下方的提示信息,确定所选调试器。

  提示信息为“NOW! Gdb is ready for Embedded System!!!”或者“Gdb is ready for PC,, Now”。

  ③ 按下F9,在出现的命令窗口输入命令“file testem”后,会在VIM中的另一个窗口出现以下类似的调试信息:

  GNU gdb 6.8

  Copyright (C) 2008 Free Software Foundation, Inc.

  ……

  This GDB was configured as "host=i686pclinuxgnu target=armlinux".

  (gdb) file testem

  Reading symbols from /home/popeye/test/testem...done.

  (gdb)

  可以发现,在VIM中已经成功调用交叉调试器armlinuxgdb了。以后的调试命令,都是通过先按下空格键,调出命令窗口,输入命令,回车后传递给调试器。[page]

  按下空格,在命令窗口输入命令,连接嵌入式目标板端:

  target remote 222.31.51.180:1234

  此时,VIM中的调试信息窗口出现信息:

  (gdb) target remote 222.31.51.180:1234

  Remote debugging using 222.31.51.180:1234

  [New Thread 801]

  0x40000dd0 in ?? () from /lib/ldlinux.so.2

  (gdb)

  而在嵌入式端出现提示信息:

  Process testem created; pid = 801

  Listening on port 1234

  Remote debugging from host 222.31.51.147

  至此,PC交叉调试器与嵌入式软件的连接完成,现在可以在VIM中对程序运行进行例如断点一类的设置动作;而嵌入式软件的输入输出,需要在嵌入式端来完成。这里先通过命令对代码设置断点,然后用命令continue继续程序运行(注意,这里不用run开始,因为当调试器与嵌入式端连接完成时,被调试的嵌入式软件已经开始运行),用命令next对程序实现步进调试。调试过程中的VIM如图3所示。

调试过程中的VIM

  图中测试代码要实现的是让用户输入5个数,然后经过排序后输出。对应的输入输出在嵌入式端体现出来。对应图3,此时在嵌入式端需要进行输入动作:

  Listening on port 1234

  Remote debugging from host 222.31.51.147

  Enter 10 numbers:

  a[0]=25

  a[1]=56

  a[2]=……

  从图3中可以直观地看清断点设置在哪里,程序现在步进到哪里。当程序第一次运行到图3中的17行时,按下F8键,开启变量值观测窗口,然后先后执行3个命令“cr i”、“cr j”、“cr a[i]”,这样,就可以在变量观测窗口实时地监测变量的数值了,如图4所示。


在变量观测窗口实时地监测变量的数值

  这种调试方式提供对gdb所有命令功能的支持,而且当发现bug时,可以通过q命令终止调试,然后按F9跳出调试模式,就可以继续对源代码进行修改。

  至于在这之前的嵌入式软件在本地PC机上的调试,其过程比起调试运行在嵌入式设备上的软件来讲,只少了个远程连接的过程,其余调试过程都一样。至此,实现了在VIM中对嵌入式软件的调试。

  结语

  嵌入式Linux系统的广泛应用,对嵌入式软件开发和调试环境的效率提出了更高的要求。GNU所提供的支持交叉编译与调试的工具链是一个很好的选择,尤其是其中的gdb调试工具完全满足嵌入式软件“交叉编译”的这种特殊需要;而且,功能强大的VIM编辑器又可实现对gdb调试器的整合,从而在VIM中实现了对嵌入式软件的调试功能。通过上面的实例可以看到,在VIM中对嵌入式软件进行调试更加直观和高效,从而也促使嵌入式软件的开发效率得到了质的提高。

关键字:VIM  S3C2440  ARM9架构 引用地址:在VIM中实现对嵌入式软件的调试

上一篇:zImage内核镜像解压过程详解
下一篇:NAND Flash的驱动程序设计

推荐阅读最新更新时间:2024-03-16 13:20

s3c2440裸机-内存控制器(一、内存控制器的原理)
1.内存接口概念 S3C2440是个片上系统,有GPIO控制器(接有GPIO管脚(GPA-GPH)),有串口控制器 (接有TXD RXD引脚),有memory controller内存控制器,有Nand控制器等... 1.不同类型的控制器: (1)GPIO控制器属于门电路,不涉及到时序,相对简单。 (2)串口控制器属于协议类接口,类似的协议类接口还有iic、iis、spi等。 (3)前面的GPIO/门电路接口、协议类接口,都不会把地址输出到外部设备,仅仅只是将地址写入到相应的控制器。 接下来的内存类接口,会把地址输出到外部,cpu将地址写入内存控制器,内存控制器还需访问外部设备,比如NorFlash、网卡、SDRAM。 2.
[单片机]
<font color='red'>s3c2440</font>裸机-内存控制器(一、内存控制器的原理)
使用JLink间接烧写S3C2410、S3C2440开发板Nor、Nand Flash的方法
1. 简要说明 JLink的调试功能、烧写Flash的功能都很强大,但是对于S3C2410、S3C2440的Flash操作有些麻烦:烧写Nor Flash时需要设置SDRAM,否则速率很慢;烧写Nand Flash只是从理论上能够达到,但是还没有人直接实现这点。 本文使用一个间接的方法来实现对S3C2410、S3C2440开发板的Nor、Nand Flash的烧写。原理为:JLink可以很方便地读写内存、启动程序,那么可以把一个特制的程序下载到开发板上的SDRAM去,并运行它,然后使用这个程序来烧写。 2. 操作步骤 2.1 连接硬件 对于大多数的S3C2410、S3C2440开发板而言,它们所用的JTAG接口一般有3种(
[单片机]
使用JLink间接烧写S3C2410、<font color='red'>S3C2440</font>开发板Nor、Nand Flash的方法
s3c2440启动过程详细分析
2440启动过程算是一个难点,不太容易理解,而对于2440启动过程的理解,影响了后面裸机代码执行流程的分析,从而看出2440启动过程的重要性。 2440启动方式和启动方式选择 在S3C2440的datasheet《S3C2440A_UserManual_Rev13.pdf》中搜索map,可以在第5章(P195)中搜索到下图。 从此图中,可以得知 OM = 01,10,Not using NAND flash for boot ROM OM = 00, Using NAND flash for boot ROM 而OM 又是什么呢? 从S3C2440的datasheet《S3C2440A_UserManual
[单片机]
<font color='red'>s3c2440</font>启动过程详细分析
s3c2440 移值u-boot-2016.03 第2篇 支持Nand flash启动
1, 要求:在4K 的代码以内,完成 NOR NAND 类型判断,初始化 NAND 复制自身到 SDRAM ,重定向。 2, 在 /arch/arm/cpu/arm920t/ 文件夹里 添加一个 inic.c 的文件,要在这个文件里面做上面说的事情。 修改 /arch/arm/cpu/arm920t/Makefile 加入 inic.c 的 编译。 extra-y = start.o obj-y += init.o obj-y += cpu.o init.c 最后有补丁文件 3, 在 start.S 中初始化 SP 后调用 init.c 中的 初始化 NAND FLASH 和 复制 u-boot 到 SDRAM 清BSS 等
[单片机]
<font color='red'>s3c2440</font> 移值u-boot-2016.03 第2篇 支持Nand flash启动
S3C2440读取NAND Flash的总结
在网上找了一些资料,又结合自己的经历谈一下我对NAND Flash 的了解。 S3C2440 板的Nand Flash 支持由两部分组成:Nand Flash 控制器(集成在S3C2440 CPU)和Nand Flash 存储芯片(K9F1208U0B)两大部分组成。当要访问Nand Flash中的数据时,必须通过Nand Flash控制器发送命令才能完成。所以, Nand Flash相当于S3C2440的一个外设,而不位于它的内存地址区. NAND Flash 的数据是以bit 的方式保存在memory cell,一般来说,一个cell 中只能存储一个bit。这些cell 以8 个或者16 个为单位,连成bit line,
[单片机]
对<font color='red'>S3C2440</font>读取NAND Flash的总结
s3c2440裸机-内存控制器(三-2、norflash编程之适配访问时序)
前面我们了解了 norFlash的特性和原理 ,那么cpu是如何和nor进行通信的呢?下面开始详细介绍。 1.内存控制器适配norflash 如图是S3C2440的内存控制器的可编程访问周期读写时序,里面的时间参数要根据外部norflash的性能进行配置,这里先列出时间参数的含义: Tacs: Address set-up time before nGCSn(表示地址信号A发出多久后才能发出nGCS片选) Tcos: Chip selection set-up time before nOE(表示片选信号nGCS发出多久后才能发出读使能信号) Tacc:access cycle(数据访问周期) Tacp:page模式下的访问周
[单片机]
<font color='red'>s3c2440</font>裸机-内存控制器(三-2、norflash编程之适配访问时序)
移植u-boot-2010.09到S3C2440(六)—— SDRAM地址与容量的计算
对于 GEC2410 开发板,SDRAM 的物理起始地址是 0x30000000,结束地址是0x34000000,大小是64Mbytes。 我有个疑问?为什么SDRAM 的物理起始地址是 0x30000000,结束地址是 0x34000000,得出的大小是64Mbytes? 因为容量是用10进制显示的,故我们得把0x34000000-0x30000000=0x4000000转换成10进制。(转换方法见附) 4*16^6+0*16^5+0*16^4+0*16^3+0*16^2+0*16^1+0*16^0=67108864(Byte) 一般不要用十六进制转成二进制,二进制转成10进制方法算那个比较麻烦: 0x4000000=0
[单片机]
基于S3C2440与EP2S15芯片实现靶场破片测速系统的设计
0 引言 破片速度是战斗部爆炸效能评估的一个重要参数。传统的靶场破片测速系统多使用多路数据采集卡设置好的参数现场采集标靶的试验波形,试验完成后再交由计算机进行后期处理和解读以获取破片速度等参数。但随着军事科技的日新月异,靶场破片测速系统需要根据实际情况现场设置的参数越来越多,参数设置的灵活性越来越强,对系统工作的实时性要求越来越高;另一方面,战斗部爆炸试验在野外进行,条件恶劣,大型设备携带不便,并为靶场破片测速系统设计提供了一个新的思路。 1 系统硬件设计 系统使用ARM+FPGA的设计方式:ARM处理器选用Samsung公司推出的基于ARM920T内核的S3C2440。S3C2440主频高达400 MHz,完全能够胜任系统工
[单片机]
基于<font color='red'>S3C2440</font>与EP2S15芯片实现靶场破片测速系统的设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved