基于Ubuntu的嵌入式开发环境的搭建
一,安装Ubuntu
根据河畔上的
教程
人力资源管理pdf成真迷上我教程下载西门子数控教程protel99se入门教程fi6130z安装使用教程
,先安装Ubuntu(本人完全安装方式)
二,安装交叉编译工具链
1,使用制作好的工具链
刚开始学习时,建议使用已经制作好的工具链,可以从网上下载制作好的工具链,比如arm-linux-gcc-3.4.5-glibc-2.3.6.tar.bz2,使用以下命令解压得到gcc-3.4.5-glibc-2.3.6目录
cd /opt/
sudo tar xjf $你的目录/ arm-linux-gcc-3.4.5-glibc-2.3.6.tar.bz2
执行上述操作后,在/opt/下得到gcc-3.4.5-glibc-2.3.6目录
然后设置环境变量PATH,可以使用命令,如下:
$export PATH=$PATH:/opt/ gcc-3.4.5-glibc-2.3.6/bin
或者在/etc/environment文件修改PATH的值:
sudo gedit /etc/environment
在文件中修改后的
内容
财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容
如下:
PATH=”/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/opt/opt/ gcc-3.4.5-glibc-2.3.6/bin”
安装ncurses,ncurses是一个能提供功能键定义,屏幕绘制,以及基于文本终端的图形互动功能的动态库,如果没有它,执行make menuconfig会出错,Ubuntu下安装比较简单:
sudo apt-get install ncurses
2,自己制作工具链
用户可以自己制作工具链,如果要基于gcc和glibc来制作工具链,可以使用crosstool来进行编译
从网上下载crosstool-0.43.tar.gz工具来编译工具链,它运行时,会自动从网上下载源码,然后编译,也可以先自己下载源码,再运行crosstool,这些源码包括:
binutils-2.15.tar.bz2
gcc-3.4.5.tar.bz2
glibc-2.3.6.tar.bz2
glibc-linuxthreads-2.3.6.tar.bz2,
linux-2.6.8.tar.bz2
linux-libc-headers-2.6.12.0.tar.bz2
假设将这些源码放到目录/opt/src_gcc_glibc/下
下面分步讲解:
(1)修改crosstool脚本
执行以下解压命令:
sudo tar xzf crosstool-0.43.tar.gz
glibc-2.3.6-version-info.h_err.patch是一个补丁文件,它修改glibc-2.3.6/csu/Makefile,里面有一个小错误将它复制到crosstool的补丁目录下:
sudo cp glibc-2.3.6-version-info.h_err.patch
crosstool-0.43/patchs/glibc-2.3.6/
需要修改demo-arm-softfloat.sh ,arm-softfloat.dat,all.sh
1修改demo-arm-softfloat.sh,修改内容如下:
7 TARBALLS_DIR=/opt/src_gcc_glibc //源码存放的目录
8 RESULT_TOP=/opt/gcc-glibc //编译结果存放的目录
2修改arm-softfloat.dat修改如下:
2 TARGET=arm-softfloat-linux-gcc改为
2 TARGET=arm-linux
3修改all.sh,修改内容如下:
70 PREFIX=${PREFIX-RESULT_TOP/$TOOLCOMBO/$TARGET} 改为
70 PREFIX=${PREFIX-RESULT_TOP/$TOOLCOMBO}
存放的结果目录将由/opt/gcc-glibc/arm-linux/变为/opt/gcc-glibc/
(2)编译、安装工具链
执行以下命令:
cd crosstool-0.43/
sudo ./ demo-arm-softfloat.sh
编译两三个小时后将在、/opt/gcc-glibc/目录下生成gcc-3.4.5-glibc-2.3.6子目录,然后设置环境变量PATH即可,可以使用命令 arm-linux-gcc –v 测试是否安装正确
三,安装烧写工具,文件传输工具
1,安装与配置minicom串口工具
安装minicom
sudo apt-get install minicom
sudo apt-get install lrzsz
安装后可以使用Zmodem传输
协议
离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载
传输文件
配置minicom
终端下输入命令minicom -s
得到下图:
首先选择文件名与路径,得到下图:
上传目录是指pc机向开发板传输文件的默认目录,可以将要传输的文件放到此目录中
下载目录是指开发板向pc机传输文件的存放目录
然后选择文件传输协议,这里使用Zmodem协议:
然后选择串口设置,得到下图,可按下图配置:
如果你使用USB转串口,则串口设备为/dev/ttyUSB0
然后选择设置保存为dfl,保存刚才的设置
运行实例:
启动minicom
#minicom
然后打开开发板,从norflash启动 得到下图:
minicom常用命令可以输入ctrl+A-Z得到
ctrl+A-S 发送文件
ctrl+A-R 接收文件
ctrl+A-X 退出minicom
ctrl+A-W 开启/关闭自动换行
2,安装与配置C-kermit串口工具
安装C-kermit
sudo apt-get install ckermit
运行kermit之前,在主目录下建立配置文件.kermrc,内容如下:
set line /dev/ttyS0
//如果为USB转串口,为/dev/ttyUSB0
set speed 115200
//设置波特率
set carrier-watch off
set handshake none
set flow-control none
robust
set file type bin
set file name lit
set rec pack 1000
set send pack 1000
set window 5
运行kermit
sudo kermit -c 或者 sudo kermit 然后输入C
退出串口,先同时按下”Ctrl”和”\”,再按c键,然后输入 exit
运行实例:
sudo kermit -c
打开开发板,从norflash启动,如下图:
3,安装与配置cutecom串口工具
安装cutecom
sudo apt-get install cutecom
运行cutecom
sudo cutecom
这个和xp下的超级终端一样,是个图形界面,可按下图配置cutecom:
如果直接使用串口,使用/dev/tty0,如果是USB转串口,则为/dev/ttyUSB0
使用实例:
首先在终端下运行cutecom
sudo cutecom
配置好后,点击open device
然后打开mini2440开发板,比如从NORFLASH启动,如下图
上述三个串口工具可任选一种使用,推荐minicom(个人习惯)
4,编译安装linux下的烧写工具dnw
安装libusb-dev
sudo apt-get install libusb-dev
然后下载源码dnw_linux.tar.bz2,解压后得到目录dnw_linux
进入目录,找到dnw.c,修改60行的一句话
*((unsigned long*)file_buffer) = 0x30000000;
根据自己开发板的情况,改为合适的值,这里为0x30000000,意为 下载运行的地址
编译dnw.c
gcc dnw.c -o dnw -lusb
将编译得到的dnw拷贝到/usr/sbin
然后进入secbulk目录 编译并加载secbulk.c内核模块
cd secbulk
make -C /lib/modules/`uname -r`/build M=`pwd` modules
编译成功后在当前目录下可以看到secbulk.ko
用insmod命令加载模块,这需要root权限
$sudo insmod ./secbulk.ko
加载后用dmesg命令可以看到模块已经成功加载
[238.007970]secbulk:secbulk loaded
[238.009101]usbcore:registered new interface driver secbulk
运行实例:
首先将开发板和主机接上串口线,USB烧写线
加载secbulk模块 $sudo insmod ./secbulk.ko
启动minicom,并使开发板从norflash启动
输入d,运行download and run命令
在要烧写的文件目录下,运行命令
sudo dnw $你的文件
即可完成烧写
dnw 烧写程序可配合以上三个串口工具的任何一个完成烧写
5,搭建NFS网络传输环境
(使用串口传输文件有时过于缓慢,因此,搭建NFS网络传输对于大文件很有必要)
网络文件系统(NFS)
一、NFS简介
1,NFS就是Network File
System的缩写,它的最大功能就是可以通过网络让不同的机器,不同的操作系统彼此共享文件(share files)――可以通过NFS挂载远程主机的目录,访问该目录就像访问本地目录一样,所以也可以简单的将它看作一个文件服务器(File
Server)。
2,NFS是通过网络进行数据传输,那么NFS使用哪些端口呢,答案是不知道,因为NFS传输数据时使用的端口是随机的,唯一的限制就是小于1024,客户端怎么知道服务器使用的是哪个端口,此时就要用到远程过程调用RPC。
其实,NFS运行在SUN的RPC(Remote Procedure Call,远程过程调用)基础上,RPC定义了一种与系统无关的方法来实现进程间通信,由此,NFS Server也可以看作是RPC Server。正 因为NFS是一个RPC服务程序,所以在使用它之前,先要映射好端口――通过portmap设定。比如:某个NFS Client发起NFS服务请求时,它需要先得到一个端口(port),所以它先通过portmap得到portnumber
注意:在启动RPC服务(比如NFS)之前,需要先启动portmap服务。
3,NFS允许系统将其目录和文件共享给网络上的其他系统。通过NFS,用户和应用程序可以访问远程系统上的文件,就像它们是本地文件一样。那么NFS最值得注意的优点有:
(1)本地工作站可以使用更少的磁盘空间,因为常用数据可以被保存在一台机器上,并让网络上的其他机器可以访问它。
(2)不需要为用户在每台网络机器上放一个用户目录,因为用户目录可以在NFS服务器上设置并使其在整个网络上可用。
(3)存储设备如软盘、光驱及USB设备可以被网络上其它机器使用,这可能可以减少网络上移动设备的数量。
二、与NFS相关的几个文件和命令
1,/etc/exports
对NFS服务的访问是由exports来批准,它枚举了若干有权访问NFS服务器上文件系统的主机名。
2,/etc/default/portmap
实际上,portmap负责映射所有的RPC服务端口,它的内容非常非常之简单。
3,/etc/hosts.deny
设定拒绝portmap服务的主机,即禁止访问的客户端IP列
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
。
4,/etc/hosts.allow
设定允许portmap服务的主机,即允许访问的客户端IP列表。
三、NFS安装
在主机上安装NFS服务软件,因为Debian/Ubuntu上默认是没有安装的。
1,安装端口映射器portmap(可选)
$sudo apt-get install portmap
2,在终端提示符后键入以下命令安装NFS服务器
$ sudo apt-get install nfs-kernel-server
3,安装NFS客户端(可选)
$ sudo apt-get install nfs-common
注意:nfs-kernel-server和nfs-common都依赖于portmap。另外,在一些文档中提出还需要使用apt-get来手动安装NFS的客户端
nfs-common,以及端口映射器portmap,但其实这是没有必要的,因为在安装nfs-kernel-server时,apt会自动把它们安装好。这样,宿主机就相当于NFS Server。同样地,目标系统作为NFS的客户端,需要安装NFS客户端程序。如果是Debian/Ubuntu系统,则需要安装nfs-common(第3步)。
四、NFS配置
1,配置portmap
方法1:编辑/etc/default/portmap,将"-i 127.0.0.1"去掉;
方法2:$ sudo dpkg-reconfigure portmap,出现“正在设定portmap”软件包设置界面,对Should
portmap be bound to the loopback address?选择“否(No)”。
2,配置sudo gedit /etc/hosts.deny
禁止任何host(主机)能和你的NFS服务器进行NFS连接。在该文件中加入:
### NFS DAEMONS
portmap:ALL
lockd:ALL
mountd:ALL
rquotad:ALL
statd:ALL
3,配置sudo gedit /etc/hosts.allow
允许那些你想要的主机和你的NFS服务器建立连接。
下列步骤将允许任何IP地址以192.168.1开头的主机连接到NFS服务器上,具体要看你目标板的端口地址,也可以指定特定的IP地址。在该文件中加入:
### NFS DAEMONS
portmap: 192.168.1.
lockd:192.168.1.
rquotad:192.168.1.
mountd:192.168.1.
statd: 192.168.1.
通过/etc/hosts.deny和/etc/hosts.allow设置对portmap的访问,采用这两个配
置文件有点类似"mask"的意思。先在/etc/hosts.deny中禁止所有用户对portmap的访问,再在/etc/hosts.allow中
允许某些用户对portmap的访问。
然后重启portmap daemon:
$sudo /etc/init.d/portmap restart
4,配置sudo gedit /etc/exports
例如我要将/opt/FriendlyARM/mini2440/root_nfs目录让用户的IP共享,则在该文件末尾添加下列语句:
/opt/FriendlyARM/mini2440/root_nfs *(rw,sync,no_root_squash)
其中:
/opt/FriendlyARM/mini2440/root_nfs
表示NFS共享目录,它可以作为开发板的根文件系统通过NFS挂接;
* 表示所有的客户机都可以挂接此目录;
rw 表示挂接此目录的客户机对该目录有读写的权力;
sync 表示所有数据在请求时写入共享,即数据同步写入内存和硬盘;
no_root_squash 表示允许挂接此目录的客户机享有该主机的root身份。
注意:可以用主机名来代替*,尽量指定主机名以便使那些不想其访问的系统不能访问NFS挂载的资源。另外,最好加上sync,
否则$ sudo exportfs -r时会给出警告,sync是NFS的默认选项。
(3)查看NFS Server的export
list:
$ sudo showmount -e
若更改了/etc/exports,运行以下命令进行更新:
$ sudo exportfs -r
然后重启NFS服务:
$ sudo /etc/init.d/nfs-kernel-server restart
五、启动和停止NFS服务
1,启动NFS的方法和启动其他服务器的方法类似,首先需要启动portmap和NFS这两个服务,并且portmap服务一定要先于NFS服务启动。
$ sudo /etc/init.d/portmap start
$ sudo /etc/init.d/nfs-kernel-server start
2,停止NFS服务
在停止NFS服务的时候,需要先停止NFS服务再停止portmap服务,如果系统中还有其他服务需要使用portmap服务,则可以不停止portmap服务。
$ sudo /etc/init.d/nfs-kernel-server stop
$ sudo /etc/init.d/portmap stop
3,重新启动portmap和NFS服务
$ sudo /etc/init.d/portmap restart
$ sudo /etc/init.d/nfs-kernel-server restart
4,检查portmap和NFS服务状态
$ sudo /etc/init.d/portmap status
$ sudo /etc/init.d/nfs-kernel-server status
六、NFS客户端配置(NFS测试)
2,手动挂载
使用mount命令来挂载其他机器共享的NFS目录。
格式:$ sudo mount [Server IP]:/[share dir] [local mount point]
例如:
$ sudo mount -t nfs [-o nolock]
localhost:/opt/FriendlyARM/mini2440/root_nfs /mnt/
或
$ sudo mount -t nfs -o nolock
192.168.1.101:/opt/FriendlyARM/mini2440/root_nfs /mnt/
其中,localhost可以是具体的IP地址,同时挂载点/mnt/root_nfs目录必须已经存在,而且在开发板的/mnt/目录中没有文件或子目录。
5、可以运行df命令查看是否挂载成功:
$ sudo df
取消挂载的命令如下:
$ sudo umount /mnt/
七、目标板NFS配置操作
主机IP:192.168.1.101
目标板IP:192.168.1.230
将USB转串口连接上,在终端输入minicom与板子连起,作为“超级终端”使用。
启动目标板并连通网络后,首先查看目标板kernel自身是否支持NFS,在minicom中输入cat /proc/filesystems命令查看其中是否有NFS一行,若没有则表示内核不支持NFS,就需要重新编译和烧写内核;有则OK,接下来就可以直接进行mount操作了。
具体命令是:
# mount -t nfs -o nolock
192.168.1.101:/opt/FriendlyARM/mini2440/root_nfs /mnt/
无任何提示表示成功,这时可以进入/mnt/目录,对文件进行cp、mv等操作。
八、注意事项
1,挂载NFS系统,需要开发板的ip和主机ip位于同一子网内,修改开发板的网络配置如下(mini2440为例):
cd etc
vi eth0-setting
修改文件内容,例如:
IP=192.168.1.230
Mask=255.255.255.0
Gateway=192.168.1.1
DNS=192.168.1.1
MAC=08:90:90:90:90:90
可以根据自己的网络设置
然后 vi resolv.conf
nameserver 192.168.1.1
2,挂载NFS系统 如果主机与开发板直接连接,需要主机为静态ip网络,如果不直连的话,将开发板与主机连接到同一个局域网内(使用集线器或路由器),配置主机静态ip网络如下:
1. 删除 Network Manager(网络工具) ,你用”添加/删除”删除它,也可以用”新立得”,或是用命令来删除,反正不管你用什么方法,首先把它干掉再说。
2. 配置网络接口,这个时候就要运用命令了,关键时刻,命令值得信赖--打开终端执行下述命令:
sudo leafpad /etc/network/interfaces
#在弹出的文本中设置网卡接口,填入给eth0分配静态的IP的代码,如下面的范例:
auto eth0 #开机首先自动激活网卡。
iface eth0 inet static
address 222.30.45.123
netmask 255.255.255.0
3. 配置 DNS(局域网上网和ADSL上网的设置有点不同)。打开终端执行下命令:
sudo leafpad /etc/resolv.conf
#在弹出的文本中填入DNS名称服务器地址。
nameserver 222.30.45.1
#这里填入你所在地方的 DNS 服务器的地址,直接填你在路由器中看到的202.96.64.68。
Nameserver 222.30.45.1
#这里填入你所在地方的备用 DNS 服务器的地址,直接填你在路由器中看到的211.98.4.1。
4. 重启。(有时你又装了NetworkManage的话,可能连接是个X,不用管它,那是个表层的东西,能上网就行)
四,搭建嵌入式调试环境
嵌入式软件经过编译和链接后即进入调试阶段,调试是软件开发过程中必不可少的一个环节,嵌入式软件开发过程中的交叉调试与通用软件开发过程中的调试方式有所差别。 在通用软件开发中,调试器与被调试的程序往往运行在同一台计算机上,调试器是一个单独运行着的进程,它通过操作系统提供的调试接口来控制被调试的进程。而在嵌入式软件开发中,调试时采用的是在宿主机和目标机之间进行的交叉调试,调试器仍然运行在宿主机的通用操作系统之上,但被调试的进程却是运行在基于特定硬件平台的嵌入式操作系统中,调试器和被调试进程通过串口或者网络进行通信,调试器可以控制、访问被调试进程,读取被调试进程的当前状态,并能够改变被调试进程的运行状态。
交叉调试(Cross Debug)又常常被称为远程调试(Remote Debug),是一种允许调试器以某种方式控制目标机上被调试进程的运行方式,并具有查看和修改目标机上内存单元、寄存器以及被调试进程中变量值等各种调试功能的调试方式。一般而言,远程调试过程的结构如图所示。
软件调试
软件调试通常要在不同的层次上进行,有时可能需要对嵌入式操作系统的内核进行调试,而有时可能仅仅只需要调试嵌入式应用程序就可以了。在嵌入式系统的整个开发过程中,不同层次上的软件调试需要使用不同的调试方法。
嵌入式操作系统的内核调试相对来讲比较困难,这是因为在内核中不便于增加一个调试器程序,而只能通过远程调试的方法,通过串口和操作系统内置的"调试桩" (debug stub)进行通信,共同完成调试过程。调试桩可以看成是一个调试服务器,它通过操作系统获得一些必要的调试信息,并且负责处理宿主机发送来的调试命令。具体到嵌入式Linux系统内核,调试时可以先在Linux内核中设置一个调试桩,用作调试过程中和宿主机之间的通信服务器,然后就可以在宿主机中通过调试器的串口与调试桩进行通信,并通过调试器控制目标机上Linux内核的运行。
嵌入式应用软件的调试可以使用本地调试和远程调试两种方法,相对于操作系统的调试而言,这两种方式都比较简单。如果采用的是本地调试,首先要将所需的调试器移植到目标系统中,然后就可以直接在目标机上运行调试器来调试应用程序了;如果采用的是远程调试,则需要移植一个调试服务器到目标系统中,并通过它与宿主机上的调试器共同完成应用程序的调试。在嵌入式Linux系统的开发中,远程调试时目标机上使用的调试服务器通常是gdbserver,而宿主机上使用的调试器则是gdb,两者相互配合共同完成调试过程。
硬件调试
相对于软件调试而言,使用硬件调试器可以获得更强大的调试功能和更优秀的调试性能。硬件调试器的基本原理是通过仿真硬件的执行过程,让开发者在调试时可以随时了解到系统的当前执行情况。目前嵌入式系统开发中最常用到的硬件调试器是ROM Monitor、ROM Emulator、In-Circuit Emulator和In-Circuit Debugger。
采用ROM Monitor方式进行交叉调试需要在宿主机上运行调试器,在目标机上运行ROM监视器(ROM Monitor)和被调试程序,宿主机通过调试器与目标机上的ROM监视器建立通信连接,它们之间的通信遵循远程调试协议。ROM监视器可以是一段运行在目标机ROM上的可执行程序,也可以是一个专门的硬件调试设备,它负责监控目标机上被调试程序的运行情况,能够与宿主机端的调试器一同完成对应用程序的调试。在使用这种调试方式时,被调试程序首先通过ROM监视器下载到目标机,然后在ROM监视器的监控下完成调试,目前使用的绝大部分ROM监视器能够完成设置断点、单步执行、查看寄存器、修改内存空间等各项调试功能。
采用ROM Emulator方式进行交叉调试时需要使用ROM仿真器,它通常被插入到目标机上的ROM插槽中,专门用于仿真目标机上的ROM芯片。在使用这种调试方式时,被调试程序首先下载到ROM仿真器中,它等效于下载到目标机的ROM芯片上,然后在ROM仿真器中完成对目标程序的调试。ROM Emulator调试方式通过使用一个ROM仿真器,虽然避免了每次修改程序后都必须重新烧写到目标机ROM中这一费时费力的操作,但由于ROM仿真器本身比较昂贵,功能相对来讲又比较单一,因此只适应于某些特定场合。
采用In-Circuit Emulator(ICE)方式进行交叉调试时需要使用在线仿真器,它是仿照目标机上的CPU而专门
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
的硬件,可以完全仿真处理器芯片的行为,并且提供了非常丰富的调试功能。在使用在线仿真器进行调试的过程中,可以按顺序单步执行,也可以倒退执行,还可以实时查看所有需要的数据,从而给调试过程带来了很多的便利。嵌入式系统应用的一个显著特点是与现实世界中的硬件直接相关,存在各种异变和事先未知的变化,从而给微处理器的指令执行带来各种不确定因素,这种不确定性在目前情况下只有通过在线仿真器才有可能发现,因此尽管在线仿真器的价格非常昂贵,但仍然得到了非常广泛的应用。
采用In-Circuit Debugger(ICD)方式进行交叉调试时需要使用在线调试器。由于ICE的价格非常昂贵,并且每种CPU都需要一种与之对应的ICE,使得开发成本非常高,一个比较好的解决办法是让CPU直接在其内部实现调试功能,并通过在开发板上引出的调试端口,发送调试命令和接收调试信息,完成调试过程。目前 Motorola公司提供的开发板上使用的是DBM调试端口,而ARM公司提供的开发板上使用的则是JTAG调试端口,使用合适的软件工具与这些调试端口进行连接,可以获得与ICE类似的调试效果。
1,搭建基于嵌入式的应用程序调试环境
一、基于非界面的调试环境的搭建
1,首先按上面步骤安装好交叉编译调试环境,NFS环境
2,要进行gdbserver远程调试,还必须安装gdb远程调试工具:
gdb的源代码包可以从网上下载,找到合适的版本下载到某个目录,笔者下载到自己的用户目录:/home/vicky。
下载完后,进入/home/vicky目录,配置编译步骤如下:
#tar jxvf gdb-6.4-tar-bz2
#cd gdb-6.4
#./configure --target=arm-linux --prefix=/usr/local/arm-gdb –v
#make
(这一步的时候可能会有问题,提示一个函数中(具体函数名不记得了)parse error,就是unsigned前边多了一个”}”,你用vi进入那一行把它删掉就行了。一般都不会出错的。)
#make install
#export PATH=$PATH:/usr/local/arm-gdb
进入gdbserver目录:
#./configure --target=arm-linux –host=arm-linux
#make CC=/usr/local/arm/bin/arm-linux-gcc
(这一步要指定arm-linux-gcc的位置,可能跟你的不一样)
没有错误的话就在gdbserver目录下生成gdbserver可执行文件,把它烧写到flash的根文件系统分区,或通过nfs mount的方式都可以。只要保证gdbserver能在开发板上运行就行。
下面就可以用gdb+gdbserver调试我们开发板上的程序了。
1,通过NFS挂载目标板(NandFlash启动)
mount -t nfs -o nolock
192.168.2.101:/opt/FriendlyARM/mini2440/root_nfs /mnt/
这将PC机192.168.2.101上的共享目录
/opt/FriendlyARM/mini2440/root_nfs
挂载到了开发板的/mnt/目录,然后将hello程序拷贝到共享目录下
2,要进行gdb调试,首先要在目标板上启动gdbserver服务。在gdbserver所在目录下输入命令:
(minicom下)
#cd /mnt
#./gdbserver 192.168.2.101:2345 hello
(反正是到gdbserver目录下运行gdbserver,这是在开发板上的操作,本例中,gdbserver在共享目录下)
192.168.2.101为宿主机IP,在目标板的2345端口开启了一个调试进程,hello为要调试的程序。
出现提示:
Process /mnt/hello created: pid="80"
Listening on port 2345
(另一个终端下,主机终端)
#arm-linux-gdb hello
(gdb) target remote 192.168.2.223:2345
(192.168.2.223为开发板IP)
出现提示:
Remote debugging using 192.168.2.223:2345
[New thread 80]
[Switching to thread 80]
0x40002a90 in ??()
同时在minicom下提示:
Remote debugging from host 192.168.2.101
(gdb)
连接成功,这时候就可以输入各种gdb命令如list、run、next、step、break等进行程序调试了。
注:在远程调试的这些步骤中nfs配置和安装交叉编译工具,以及安装gdb工具的没有什么顺序,只是主意再gdbserver远程连接前要配置好开发板的ip地址。
二、基于Eclipse界面的调试环境的搭建
如何使用eclipse进行嵌入式Linux的开发习惯了在windows环境下开发的程序员在转到Linux平台时经常会抱怨没有一个好用的集成开发环境。和windows下常用的一些开发软件相比,Linux自带的一些开发环境使用起来要么界面和操作不够方便、友好,要么功能不全。其实我们完全可以在开源社区上找到操作方便,功能强大的开发环境。下面就向大家介绍一个能在Linux上运行,界面和功能与windows上同类软件相似的开发平台eclipse。
eclipse本身只是一个框架平台,最初主要用于java语言的开发。但是众多插件的支持使得eclipse同样可以用来开发其他的语言,如 c/c++、c#、perl、cobol的等等。 cdt(c/c++ development toolkit)就是支持c/c++开发的插件。许多软件开发商也以eclipse为框架推出了自己的集成开发环境。由于eclipse平台用java实现,所以运行时需要jre(java runtime environment)的支持。下面我们以ubuntu(linux发行版的一种)为例,介绍如何在linux上使用 eclipse+cdt来进行嵌入式Linux应用程序的开发。
一、安装软件
1、安装jdk
(通过apt安装)
2、安装eclipse和cdt
从eclipse网站上下载安装包eclipse-SDK-3.4-linux-gtk.tar.gz 和cdt-master-5.0.0.zip
# cd /opt
# tar zxvf eclipse-SDK-3.4-linux-gtk.tar.gz // 解压生成eclipse目录
# export PATH=/opt/eclipse:$PATH
# mkdir -p /opt/cdt
# cd /opt/cdt
# unzip cdt-master-5.0.0.zip
# cp -r plugins/* /opt/eclipse/plugins/
# cp -r features/* /opt/eclipse/features/
二、创建c/c++工程
假设我们已经在linux上安装好了arm交叉工具链,下面介绍如何创建、交叉编译和调试c/c++工程。为了更直观的说明,我们截取了相关的图片 进入eclipse安装路径后,运行eclipse
eclipse运行界面
创建c 工程
使用缺省的Linux GCC工具链
进入c/c++ 界面
添加源代码文件1
添加源代码文件2
编辑代码
设置工程属性,指定交叉工具链1
设置工程属性,指定交叉工具链2
设置工程属性,指定交叉工具链3
编译工程
已生成arm平台可执行代码
配置调试选项
设置Debugger和 GDB debugger选项
设置连接类型为TCP,目标板的ip地址和调试端口号。端口号任意指定,通常大于1024(避免和系统所用端口号冲突)
在开发板上运行程序,格式如上图所示:gdbserver是交叉调试辅助程序;192.168.0.150是主机的ip地址;1234是调试端口号,和eclipse调试选项里设定的端口号要一致
点击Debug,进入调试界面
执行到断点
eclipse的调试界面和操作和在windows下开发类似,相信到了这一步,大家已经可以很方便来进行应用程序的开发了。
2,搭建硬件调试环境(以下环境搭建需要光盘支持,没有可无视)
一、OpenJTAG+OpenOCD+Eclipse调试环境的搭建(均为光盘自带)
在嵌入式开发中,有很多优秀的调试、仿真工具,比如 Keil、IAR、Rowley Associates 等。 它们的安装、使用都很便利,功能强大,但是价格昂贵(几百美元甚至更多);还要购买相应的硬件,比如 J-Link、U-Link 等 USB 到 JTAG 的转换盒,这也是一笔不小的开支。
对于学生,或者是开发预算有限的工程师来说,完全可以使用免费的开发工具 Eclipse、
OpenOCD,然后通过一些便宜的 JTAG 转接器(比如并口 JTAG 等)就可以达到接近、甚至超
越上述商业软件的效果。
并 口 JTAG 速 率 太 低 , 一 般 很 少 使 用 。 本 教 程 使 用 OpenJTAG 转 换 器 , 配 合Eclipse,OpenOCD 等开源软件,就可以完成下载、烧写、调试等任务。
硬件、软件安装
修改 udev 规则,使得识别 OpenJTAG 后自动加载驱动
把光盘文件 Ubuntu/install/50-ftdi.rules 复制到/etc/udev/rules.d/目录下:
$ sudo cp /media/cdrom0/Ubuntu/install/50-ftdi.rules /etc/udev/rules.d/
将 OpenJTAG 板子接到 PC 的 USB 口后,Ubuntu 即会自动加载驱动。对于 Ubunut 9.04,
会在/dev 目录下自动创建 ttyUSB0、ttyUSB1 两个设备 此时,就可以将/dev/ttyUSB0作为一般串口
使用了。
安装 OpenOCD、GDB、交叉编译工具链、Eclipse
(1) 安装 OpenOCD、GDB:
将光盘 Ubuntu/install/目录下的 openocd、arm-linux-gdb 复制到/usr/bin 目录下,并设置 “可执行”属性:
$ sudo cp /media/cdrom0/Ubuntu/install/openocd /usr/bin/
$ sudo cp /media/cdrom0/Ubuntu/install/arm-linux-gdb /usr/bin/
$ sudo chmod +xs /usr/bin/openocd /usr/bin/arm-linux-gdb
注意:一定要给 openocd 和 arm-linux-gdb 加上可执行权限“x” ,超级用户权限“s”。
(2)安装交叉编译环境
确保安装了交叉编译环境,使用arm-linux-gcc -v进行测试
(3)安装Eclipse
安装光盘中自带的Eclipse
假设以后将在/work/eclipse_projects (假设为Eclipse的工作目录)目录下存放代码,则将 OpenOCD 的配置文件放到这
个目录下:
$ cp /media/cdrom0/Ubuntu/install/openocd.cfg /work/eclipse_projects
(4)使用 Eclipse 进行开发
从图 2.4 所示的启动菜单中启动 Eclipse,等待一会,可以看到如图 3.16 所示界面。在里
面设置工作目录为/work/eclipse_projects,并选择“Use this as the default and do not ask again”,
表示使用/work/eclipse_projects 作为缺省目录,并不再提示。
在图 3.16 中,点击 OK 后,得到如图 3.17 所示界面。
图 3.17 中下边的图标名为“Workbench”,点击它,得到图 3.18 所示界面。
(1) 创建工程:
在图 3.18 的界面中,选择菜单项“File -> New -> Project”,如图 3.19 所示。
在随后出现的窗口中(如图 3.20 所示),选择“C Project”:
点击“Next” 在图 3.21 中指定工程名字、 “Makefile project -> Empty Project” “Other Toolchain” ,然后点击“Finish”按钮。
(2) 添加文件:
在创建 leds 工程时,如果/work/eclipse_projects/leds 目录下已经有源文件,则这些文件会
被自动加入工程中,
如果/work/eclipse_projects/leds 目录是空的话,或者想添加新文件时,可
以使用以下方法导入文件。
下面先在/work/eclipse_projects/下建立一个测试文件 test_file_to_add.txt,然后以它为例介
绍怎么添加文件到工程里。
选择菜单项“File -> Import...” ,然后选择“File System”作为文件来源,如图 3.23 所示
点
击“next”,打开“Import”对话框,在里面指定源目录“From directory”,点击“Next”、选择要导入的文件、指定目的目录“Into folder”。如图 3.24,点击“Finish”按钮即可添加文件。
至此,新的 Eclipse 工程建立完毕,如图 3.25 所示。双击左边的文件名,即可打开进行编
辑
(3)配置 Eclipse 工程:
建立一个 Eclipse 工程后,需要进行一些配置。在“Project”菜单里,点击去掉“Build
Automatically”前面的标记,表示不自动编译工程,如图 3.26 所示
然后再次选择“Project”菜单,点击“Properties”项,如图 3.27 所示。
新出现的窗口如图 3.28 所示。
选择其中的“C/C++ Build -> Discovery options”,将“Compiler invocation command”改为arm-linux-gcc,如图 3.29 所示。
继续选择“C/C++ Build -> Settings”,在“Binary Parsers”中选择“GNU Elf Parser”(先点击“GNU Elf Parser”文字,然后勾选),然后将“addr2line Command”“c++filt Command换成 arm-linux-addr2line 和 arm-linux-c++filt,
如图 3.30 所示
(4)编译、清除程序:
当配置完成后,就可以使用按钮来编译、清除程序了。点击菜单“Project -> Build Project”
开始编译程序,如图 3.31 所示;编译过程见图 3.32。
编译的效果与在命令行执行“make all”命令完全一样。
清除程序的方法是,选择菜单“Project -> Clean...”(如图 3.33),即可弹出一个对话框(如
图 3.34)。
在图 3.34 中,不要选择“Start a build immediately”
,然后点击“OK”即可清除程序
(5)调试程序
1配置调试器:
假设已经建立好 leds 工程,右边的小箭头,如图 3.35 所示,选择“Debug Configurations...”
弹出的窗口如图 3.36 所示,在里面可以看到 Zylin 字样的调试器。
选择里面的“Zylin Embedded debug (Native)”,如图 3.37 所示。
在图 3.37 中,然后点击左上角的按钮后,配置界面将发生变化,如图 3.38 所示,对
于 leds 工程,图 3.38 中的名字是“leds default”
现在来配置调试器。
首先选择“C/C++ Application”,点击底下的“Browse”按钮,选中 ELF 的可执行文件,
对于 leds 工程,这个文件是 leds_elf。如图 3.39 所示。
然后选择调试器为 arm-linux-gdb, 如图 3.40 所示: 设置“GDB debugger”为“arm-linux-gdb”,设置“GDB command file”为空。
最后设置启动调试器 arm-linux-gdb 后,自动运行的命令,如图 3.41 所示。
当上述设置都完成后,然后点击“Apply”“Close”退出。
然后就可以进行调试了。
调试实例
启动 OpenOCD,OpenOCD 常用命令
把开发板的 JTAG 口、串口都接到 OpenJTAG 板上去;然后给开发板供电(注意:
线连接 OpenJTAG 与开发板时,开发板一定要上电);最后使用 USB 线连接 OpenJTAG 和计
算机。
运行 ope