标签:linux 嵌入式系统 交叉编译 文件系统 kernel
【实验目的】
了解交叉工具链的编译过程及其使用。
说明:在实验中命令行提示符 为“$”表示在主机上运行,“#”表示在目标板上运行
【实验环境】
1、 ubuntu 12.04发行版
2、 FS4412平台
【实验步骤】
1、 如果要自己编译工具链,从以下链接下载源码
crosstools-ng下载地址
http://ymorin.is-a-geek.org/download/crosstool-ng/
同时对每一个版本都有相应的补丁我们尽量把这些补丁打上,这些补丁的下载地址是
http://ymorin.is-a-geek.org/download/crosstool-ng/01-fixes/
在这里我们已经提前给大家准备好了,大家进入到我们的tools文件夹中.
把该文件夹移动到我们的Ubuntu系统中,然后执行。
$ cd tools
$ sudodpkg -i *.deb
2、 解压工具链压缩包
$ cd ~
$ mkdir toolchain
$ cd toolchain
将第一天/工具/gcc-4.6.4.tar.xz拷贝到toolchain目录下并解压
$ tar xvf gcc-4.6.4.tar.xz
3、 环境变量的添加
修改文件/etc/bash.bashrc添加如下内容
export PATH=$PATH:/home/linux/toolchain/gcc-4.6.4/bin
重启配置文件
$ source /etc/bash.bashrc
4、 工具链的测试
$ arm-none-linux-gnueabi-gcc –v
Using built-in specs.
COLLECT_GCC=arm-none-linux-gnueabi-gcc
COLLECT_LTO_WRAPPER=/home/david/Exynos4412/toolchain/gcc-4.6.4/bin/../libexec/gcc/arm-arm1176jzfssf-linux-gnueabi/4.6.4/lto-wrapper
Target: arm-arm1176jzfssf-linux-gnueabi
Configured with: /work/builddir/src/gcc-4.6.4/configure--build=i686-build_pc-linux-gnu --host=i686-build_pc-linux-gnu--target=arm-arm1176jzfssf-linux-gnueabi--prefix=/opt/TuxamitoSoftToolchains/arm-arm1176jzfssf-linux-gnueabi/gcc-4.6.4--with-sysroot=/opt/TuxamitoSoftToolchains/arm-arm1176jzfssf-linux-gnueabi/gcc-4.6.4/arm-arm1176jzfssf-linux-gnueabi/sysroot--enable-languages=c,c++ --with-arch=armv6zk --with-cpu=arm1176jzf-s--with-tune=arm1176jzf-s --with-fpu=vfp --with-float=softfp--with-pkgversion=‘crosstool-NG hg+default-2685dfa9de14 - tc0002‘--disable-sjlj-exceptions --enable-__cxa_atexit --disable-libmudflap--disable-libgomp --disable-libssp --disable-libquadmath--disable-libquadmath-support --with-gmp=/work/builddir/arm-arm1176jzfssf-linux-gnueabi/buildtools--with-mpfr=/work/builddir/arm-arm1176jzfssf-linux-gnueabi/buildtools--with-mpc=/work/builddir/arm-arm1176jzfssf-linux-gnueabi/buildtools--with-ppl=/work/builddir/arm-arm1176jzfssf-linux-gnueabi/buildtools--with-cloog=/work/builddir/arm-arm1176jzfssf-linux-gnueabi/buildtools--with-libelf=/work/builddir/arm-arm1176jzfssf-linux-gnueabi/buildtools--with-host-libstdcxx=‘-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm‘--enable-threads=posix --enable-target-optspace --without-long-double-128--disable-nls --disable-multilib--with-local-prefix=/opt/TuxamitoSoftToolchains/arm-arm1176jzfssf-linux-gnueabi/gcc-4.6.4/arm-arm1176jzfssf-linux-gnueabi/sysroot--enable-c99 --enable-long-long
Thread model: posix
gcc version 4.6.4 (crosstool-NG hg+default-2685dfa9de14 -tc0002)
这样我们的交叉工具链就安装好了
【实验目的】
了解u-boot的常用命令和linux内核的引导。
【实验环境】
1、 ubuntu 12.04发行版
2、 u-boot-2010.03
3、 FS4412平台
4、 交叉编译器 arm-none-linux-gnueabi-gcc
【实验步骤】
1、 SD启动盘制作
a) 将第一天/工具/ sd_fusing拷贝到Linux下
b) 将SD卡插入电脑并识别
c) 进入sdfuse_d执行如下操作
$ sudo ./mkuboot.sh /dev/sdb
d) 在SD卡中创建目录sdupdate并把第一天/镜像中的u-boot-fs4412.bin拷贝到这个目录下
2、 u-boot的烧写
a) 连接串口和板子,运行串口通信程序(putty第一天工具中)
选择右上角的”Serial”,然后点击左下角的”Serial”
按照自己的主机的情况选择COM口其他必须一直,然后点击open打开串口
b) 关闭开发板电源,将拨码开关SW1调至(1000)(SD启动模式)后打开电源
c) 将刚才做好的SD启动盘插入SD卡插槽
d) 重新打开开发板能够看到如下界面
在倒计时时按任意键
e) 烧写
在终端上执行
sdfuse flashall
等待终端无输出是表示烧写结束
f) 关闭开发板电源,将拨码开关SW1调至0110(EMMC启动模式)后打开电源可以看到如下界面表示烧写成功
在倒计时时按任意键
3、 通过网络加载内核和文件系统
a) 将 第一天/镜像文件/uImage拷贝到ubuntu的/tftpboot下
b) 将 第一天/镜像文件/rootfs.tar.xz拷贝到ubuntu的/source下并解压
c) 将 第一天/镜像文件/exynos4412-fs4412.dtb拷贝到ubuntu的/tftpboot下
d) 修改虚拟机nfs配置文件/etc/exports,添加如下内容并重启nfs服务
/source/rootfs *(rw,sync,no_subtree_check,no_root_squash)
e) 重新驱动nfs服务
$ sudo /etc/init.d/nfs-kernel-server restart
f) 设置启动参数
# setenv serverip 192.168.9.120
# setenv ipaddr 192.168.9.233
# setenv bootcmd tftp 41000000 uImage\;tftp 42000000exynos4412-fs4412.dtb\;bootm 41000000 - 42000000
#setenv bootargs root=/dev/nfsnfsroot=192.168.9.120:/source/rootfs rw console=ttySAC2,115200 init=/linuxrc ip=192.168.9.233
# saveenv
注意:192.168.9.120 对应Ubuntu的ip
192.168.9.233 对应板子的ip
这两个ip应该根据自己的实际情况适当修改
g) 启动开发板看到如下现象表示成功通过网络挂载:
这是可以输入一些Linux的命令测试
4、 从EMMC加载内核和文件系统
a) 拷贝第一天/镜像文件/ramdisk.img拷贝到虚拟机/tftpboot目录下
b) 烧写内核镜像到EMMC上
# tftp 41000000 uImage
# movi write kernel 41000000
c) 烧写设备树文件到EMMC上
# tftp 41000000 exynos4412-fs4412.dtb
# movi write dtb 41000000
d) 烧写文件系统镜像到EMMC上
# tftp 41000000 ramdisk.img
# movi write rootfs 41000000 300000
e) 设置启动参数
# setenv bootcmd movi read kernel 41000000\;movi read dtb42000000\;movi read rootfs 43000000 300000\;bootm 41000000 43000000 42000000
# saveenv
f) 重新启动开发板,u-boot自动加载、执行内核
5、 其他命令练习
6、 交叉编译和交叉调试
a) 将u-boot启动参数修改为网络启动
# setenv serverip 192.168.9.120
# setenv ipaddr 192.168.9.233
# setenv bootcmd tftp 41000000 uImage\;tftp 42000000exynos4412-fs4412.dtb\;bootm 41000000 - 42000000
#setenv bootargs root=/dev/nfsnfsroot=192.168.9.120:/source/rootfs rw console=ttySAC2,115200 init=/linuxrc ip=192.168.9.233
# saveenv
注意:192.168.9.120对应Ubuntu的ip
192.168.9.233 对应板子的ip
这两个ip应该根据自己的实际情况适当修改
b) 编辑程序源码myapp.c(自己写一个简单的c程序)
c) 交叉编译后复制到/source/rootfs (编译时添加选项-g)
$arm-none-linux-gnueabi-gcc myapp.c –o myapp –g
$ cpmyapp /source/rootfs
d) 运行我们的myapp程序,观察输出结果
$./myapp
标签:linux 嵌入式系统 交叉编译 文件系统 kernel
原文地址:http://blog.csdn.net/u011046042/article/details/41010535