Linux开发环境建立
一。安装交叉编译工具
1.FTP下载交叉编译工具
#ftp ftp.arm.linux.org.uk ;用户名和密码为:FTP ,FTP 。
#ls
#cd pub/armlinux/toolchain/ ;交叉编译工具在此目录下 。
#ls
#bin ;切换到二进制方式传输文件 。
#get cross-2.95.3.tar.bz2 ;下载
#bye ;推出FTP 。
2.安装交叉编译工具
#cd /usr/local
#mkdir arm
#cp /home/work/cross-2.95.3.tar.bz2 ./
#tar -xjf cross-2.95.3.tar.bz2
指定编译器的位置。
/etc/profile 用gedit打开 ,在pathmunge /usr/local/sbin下加上一行
pathmunge /usr/local/arm/2.95.3/bin
重启
开发板烧制Boot:
首先要去掉JP4跳线,即去掉JP4的盖子 。
FFT-9200开发板Flash分配情况:
Flash地址:10000000~10FFFFFF
10060000~101FFFFF :内核存放区
10200000~10FFFFFF :根文件存放区
1.首先在超级终端的Xmodem下(传送-发送文件-Xmodem)发送文件fft-loader.bin(板子光盘自带)。
2.在Xmodem下,发送fft-Uboot-v2.0.bin文件,发送完毕后显示>FFTBoot的提示符
3.擦除FLASH
FFTBOOT>protect off all
FFTBOOT>erase all
4.
装入fft-boot.bin
FFTBOOT>loadb 20000000
在超级终端下用Kermit模式发送文件fft-boot.bin
FFTBOOT>cp.b 20000000 10000000 5fff
在超级终端显示拷贝的情况 。
5.装入fft-Uboot.gz
FFTBOOT>loadb 20000000
在超级终端下用Kermit模式发送文件fft-Uboot-v2.0.gz
FFTBOOT>cp.b 20000000 10010000 ffff
在超级终端显示拷贝的情况
FFTBOOT>protect on 10000000 1001ffff
FLASH区域保护
合上JP4跳线(即插上JP4的盖子)。复位重启,然后进行操作系统内核和文件系统的烧写。
二。Linux内核的配置和编译
1.下载内核或者使用现成的内核压缩包 。我使用的是板子的光盘自带的内核压缩包:G:\share\FFT-9200的光盘-V2.0\标准配置光盘\Linux-arm9\内核。linux-2.4.19-rmk7.tar.gz
将内核压缩包拷贝到Linux下的/usr/src/arm下,并且解压缩,得到内核源码。
2.配置内核前的必要设置
主要设置在内核源码中的makefile文件,主要设置两个地方:ARCH 和 CROSS_COMPILE 。
ARCH:=arm ;表示目标板为arm
CROSS_COMPILE=你所安装的交叉编译工具的地址 ;
3.内核配置
#make menuconfig ;菜单界面
此条命令在已解压缩的内核源码文件夹目录下运行,我当时没有成功,多试几次就可以了,原因不详。
1》.Code maturity level options : 代码成熟度选择 。
1) Prompt for development and/or incomplete code/drivers:选中此选项,则表示每个模块中处于测试中的子模块会出现在模块的配置选项中,并且在配置选项后面注明 (EXPERIMENTAL),表明这个模块还没有经过成熟的测试,不能保证模块的可靠性。
2) Prompt for obsolete code/drivers : 选中,则模块配置选项中只出现成熟的模块,所有的模块都经过了可靠性的测试。
一般选择1),因为某些模块虽然不成熟,却是系统所需要的 。
2》.Loadable module support :可加载模块支持
一些不常用的驱动或特性可以编译为独立的模块,在系统需要时,加载到内核,不需要时从内核卸载。增加系统配置的灵活性 。
3》.System Type :系统类型
用于配置CPU类型以及对系统基本的硬件类型的支持 。
4》.General setup : 通用配置
设置内核对虚拟内存的支持和为System V的进程提供通信机制
5》.Memory Technology Devices(MTD) : 存储技术设备
MTD实际上就是嵌入式系统FLASH设备的驱动 。
6》.Block devices : 块设备
块设备包括了对磁盘,RANDISK等的驱动支持 。
RAMDISK实际上就是在系统内存上虚拟了一个文件系统设备或盘 。
7》.Networking options :网络协议栈支持
对于大部分的嵌入式应用而言,支持TCP/IP协议栈是必需的 。
8》.Networking device support :网络设备支持
网络设备即网络接口硬件 。对于大部分的嵌入式应用,Etherent(10 or 100Mbit)是最为常见的选择,这其中包含了对特定网卡的驱动 。
9》.Character devices :字符设备
字符设备包括了一类设备,比如:SPI接口设备 ,串口设备 。
10》.File system :文件系统
文件系统选项所涉及的内容较多,建议在默认配置的基础上进行修改 。对于大多数嵌入式应用来说,需要DOS FAT(FAT16 ,FAT 320),VFAT ,EXT2 ,NFS支持。对于FLASH设备,则需要JFFS文件系统 。
根据自己系统的需要,配置好内核后 ,推出配置菜单,并且保存 。
4.Linux内核编译
#make clean ; 仍然在Linux内核的加压文件目录下运行 。此命令用于删除过时的文件,即原来的编译结果以及一些旧的数据文件 。
#make dep ;执行此命令进行依赖性编译 。依赖性编译:我添加或删除了内核的某个功能,但这个功能对程序c有影响,而程序c对程序b有影响,程序b对程序a又有影响。如果程序数量非常多,很难用手工来完成,而采用依赖性编译则可以自动完成该项工作 。
#make zImage ;生成可执行内核映像文件。
uImage是U-BOOT专用的,zImage就是普通的压缩内核。
5.内核的烧写
我是采用以太网模式进行内核的移植,所以服务器与开发板要用网线相连接 。
•FFT-9200的光盘-V2.0\标准配置光盘\Linux-arm9下的:
•tftpserver文件夹
•tftpboot文件夹
•复制到C盘。
•并将要烧制的内核文件拷到现在这两个文件夹下。此次用的内核文件名是:uImage-2005-03:支持NFS调试功能
•运行tftpserver文件夹中的TFTPSRV.EXE
•启动电脑终端 ,并且Stop Autoboot 。输入命令:
• FFTBOOT>setenv ethaddr 12:34:56:78:99:aa
• FFTBOOT>setenv ipaddr 192.168.0.11
• FFTBOOT>setenv serverip 192.168.0.55(即现实主机的IP地址也要改成这个)
• FFTBOOT>setenv bootdelay 5
• FFTBOOT>saveenv
• FFTBOOT>tftp 21000000 uImage(将内核下载到内存)
•
•此步结束会看到所烧内核的大小:b4a0b (内核的大小后面要用到)
FFTBOOT>cp.b 21000000 10060000 b4a0b ;将内核从内存的21000000起始位置拷贝至Flash的10060000起始位置 。内核的大小为:b4a0b
•将内核烧到Flash中去 时可能烧不进去,因为此处需要擦除Flash中的内核存放区。
•10060000~101FFFFF 内核的存放区域
•命令:erase 10060000 101FFFFF 擦除内存区域
三.根文件系统及制作
首先从板子的附带光盘中拷贝RAMDISK压缩文件:myramdisk2.gz 。拷到/mnt/ramdisk下
#gzip -d myramdisk2.gz ;解压缩文件 。解压缩完毕后,出现一个myramdisk2文件 。
#mkdir ram_disk ;在/home/work下建文件夹ram_disk
#mount -o loop myramdisk2 ram_disk ;将解压得到的文件myramdisk2挂载到ram_disk文件夹下 。
#cd ram_disk
#ls ;可在ram_disk目录下看到文件myramdisk2所包含的子文件系统内容 。
/bin和/sbin:包含有必不可少的应用程序 ,如ls,mv,cat等 。用户可根据需要选择 ,但一定要包括程序:init ,getty ,login ,mount ,运行rc的shell等 。
/etc :含有一些必可少的系统配置文件 。
/lib : 包含启动过程中所需要的共享函数库 。如缺少,则系统不能正常启动 。
/dev :含有系统不可缺少的设备文件 。
/tmp :用于存放临时文件 ,一般为空 。
用户根据系统需要,对相关文件进行增减,即在相关目录下增加或删除一些文件 ,操作完成后,卸载ram_disk与文件myramdisk2的连接 ,并对新的ramdisk2进行压缩 。
#umount /ram_disk ;此法可能不行 。换 :#umount -l /mnt/ramdisk/ram_disk .在/mnt/ramdisk下执行此命令 。切记 。
#gzip myramdisk2 ;即将myramdisk2文件压缩成一个新的压缩文件myramdisk2.gz 。在/mnt/ramdisk下运行 。
根文件系统的移植:
FFT-9200的光盘-V2.0\标准配置光盘\Linux-arm9下的:
• tftpserver文件夹
• tftpboot文件夹
• 复制到C盘。
•并将要烧制的文件系统拷到现在这两个文件夹下。此次用的文件系统是myramdisk2.gz 。是板子光盘自带的。
•运行tftpserver文件夹中的TFTPSRV.EXE
•启动电脑终端 ,并且Stop Autoboot 。输入命令:
• FFTBOOT>setenv ethaddr 12:34:56:78:99:aa
• FFTBOOT>setenv ipaddr 192.168.0.11
• FFTBOOT>setenv serverip 192.168.0.55(即现实主机的IP地址也要改成这个)
• FFTBOOT>setenv bootdelay 5
• FFTBOOT>saveenv
• FFTBOOT>tftp 20000000 myramdisk2.gz (将文件系统下载到内存)
此步结束后会看到文件系统的大小:4e3530
FFTBOOT>cp.b 20000000 10200000 4e3530 ;将文件系统由内存拷贝到Flash 。
FFTBOOT> setenv bootdelay 3;setenv bootargs root=/dev/ram rw initrd=0x21100000,6000000 ramdisk_size=15360 console=ttyS0,115200 mem=32M
FFTBOOT>saveenv
FFTBOOT> setenv bootcmd cp.b 10200000 21100000 4e3530\;bootm 10060000 (4e3530)文件系统大小
FFTBOOT>saveenv
板子重启
1.Linux服务器端NFS服务器的配置
Linux下的IP设为192.168.0.55
#vi /etc/exports ;在该文件中添加如下内容 :
/home 192.168.0.*(rw,sync,no_root_squash)
添加的内容表示:允许IP地址范围在192.168.0.*的计算机以读写的权限来访问/home目录 。/home也成为服务器输出共享目录 。
括号参数意义:
rw :读/写权限,只读权限的参数为ro 。
sync :数据同步写入内存和硬盘,也可以使用async,此时数据会先暂时存于内存中,而不立即写入硬盘 。
no_root_squash :NFS服务器共享目录用户的属性,如果用户是root,那么对于这个共享目录来说就具有root的权限 。
#/etc/rc.d/init.d/nfs start ;启动NFS
在启动服务之前,要先关掉服务器的防火墙。
关掉防火墙的方法:在系统设置-服务器设置-服务中,关掉iptables .
或者用命令的方法:/etc/init.d/iptables stop 。
#mount -t nfs 192.168.0.55:/home /mnt
#ls ;此两句的作用是在服务器上进行NFS服务器的回环测试 ,验证共享目录是否能够被访问 。
2.开发板的设置
Ifconfig eth0 192.168.0.22
mount -t nfs -o nolock 192.168.0.55:/home /mnt 挂载。
首先开发板的内核必需支持NFS客户端 ,在进行内核配置时,必须选择而如下选项:
File system-Network File System-Provide NFSv3 client support
五。建立Samba服务器
1).Samba的工作原理
将一台运行Linux的机器伪装成一台运行在网络中的Windows NT服务器 。
实际上是将NETbios协议和SMB协议绑定在TCP/IP协议上运行 。
Samba是一个工具套件。用于Unix上实现SMB(Session Message Block)协议 ,也称为NETBIOS/LanManager 。Windows实现磁盘和打印机共享,以及网上邻居也是使用这个协议 。
#Rpm -qa | grep samba ;检查系统是否安装Samba 。
若没有,则到red hat 9.0第一张盘 : //cdrom/redhat/RPMS/目录下拷贝 。
分别设虚拟机的IP为:192.168.0.55
Windows的IP为:192.168.0.22
关闭虚拟机和Windows的防火墙 。
#Service smb start ;开启Samba服务
#smbmount //192.168.0.22/share /mnt/smb -o username=zhj1011
二。嵌入式Linux应用程序的开发
服务器下开发好test.c文件后,用如下命令编译应用程序:
#arm-linux-gcc -o test test.c
执行完命令后,会在当前目录下生成可执行文件test 。
然后在嵌入式目标系统端即开发板挂载Linux服务器的输出共享目录,并运行应用程序 。
#./test
三。嵌入式Linux应用程序的调试方法
1.在Linux服务器上使用GDB调试程序
1).使用gcc对应用程序进行编译
#gcc -g -o test test.c
2).使用gdb对生成的可执行程序进行调试
#gdb test
gdb常用命令及功能:
命令 缩写 功能描述
help h 帮助
file 装入待调试的可执行文件
list l 列出程序源码
run r 运行被调试的程序
break b 设置一个断点
delete d 删除断点或其他表达式
continue c 继续调试程序
next n 单步执行但不进入函数内部
step 单步执行进入函数内部
print p 打印变量值
set variable 修改变量值
watch wa 监视变量值
quit q 终止gdb
(gdb) b 9 :在程序的第9行设置一个断点 。
2.在嵌入式目标系统上使用GDB调试程序
前提是安装好交叉编译工具 。
首先下载gdb源码,我下载的是gdb-6.6.tar.gz 。存放于/home/zhj1011目录下 。
#tar xvzf gdb-6.6.tar.gz ;解压缩源码压缩包 ,在/home/zhj1011目录下运行 。gdb的解压缩文件放在/home/zhj1011下
#mkdir /home/zhj1011/mygdb
#../gdb-6.6/configure --target=arm-linux --prefix=/home/zhj1011/mygdb ;在/home/zhj1011/mygdb下运行 。我当时没有成功是因为磁盘没有足够的空间 。
若gdb的解压缩文件放在/home/zhj1011/mygdb下 ,则上面的编译程序为 :#./gdb-6.6/configure --target=arm-linux --prefix=/home/zhj1011/mygdb
也就是比上面一条命令少了一个点,因为上面的解压缩文件是在运行目录的上一层,所以是../configure.............
参数说明:target是你的目标板,我的是arm-linux,prefix是你要安装的目标文件夹。
#make ;在/home/zhj1011/mygdb下运行 。
#make install ;在/home/zhj1011/mygdb下运行 。
建立gdbserver
#mkdir mygdbserver 建立目录/home/zhj1011/mygdbserver
#cd mygdbserver
#chmod +x ../gdb-6.6/gdb/gdbserver/configure ;在目录/home/zhj1011/mygdbserver下运行 。
#CC=arm-linux-gcc ../gdb-6.6/gdb/gdbserver/configure --host=arm-linux --prefix=/home/zhj1011/mygdbserver ;/home/zhj1011/mygdbserver下运行 。 #make ;/home/zhj1011/mygdbserver下运行 。
#make install ;/home/zhj1011/mygdbserver下运行 。
#arm-linux-strip gdbserver