嵌入式软件开发培训笔记——ARM架构Linux系统下交叉编译环境搭建、NFS、TFTP服务配置及Nandflash的读写

bootloader原理和开发——>kernel构建——>文件系统/根文件系统(filesystem/rootfs) APP

嵌入式软件开发培训笔记——ARM架构Linux系统下交叉编译环境搭建、NFS、TFTP服务配置及Nandflash的读写_第1张图片

嵌入式软件开发培训笔记——ARM架构Linux系统下交叉编译环境搭建、NFS、TFTP服务配置及Nandflash的读写_第2张图片

一、配置交叉编译环境(可参考嵌入式Linux移植与驱动开发cortexa8中交叉工具链的安装)
    1、准备文件arm-cortex_a8-linux-gnueabi.tar.bz2
    2、解压以上文件到当前用户目录下,如/home/linux/gcc
    3、进入超级用户模式sudo -s
    4、用vi打开/etc/bash.bashrc文件配置环境变量,在文件最后添加下面一句话
            export PATH=$PATH:/home/linux/gcc/arm-cortex_a8-linux/bin/
    5、使用source /etc/bash.bashrc更新下,以便虚拟机重启后该配置仍生效
    6、修改Makefile文件,用于arm架构下编译源文件
二、开发板下载程序三种方法
    1、RS232
    2、Net Ethernet网线
    3、USB
三、头文件、初始化文件、驱动等等,文件最好分门别类存放
四、GCC过程&头文件及库的使用方法
    编译器环境arm-cortex_a8-linux-gnueabi-
    1、GCC
            gcc -E预处理 生成    .i
            gcc -c编译     生成    .s
            gcc -S汇编     生成    .o
            gcc -ld链接 ld可不写    生成可执行文件
    2、头文件用法
            自定义头文件在使用gcc时用参数    -I头文件路径
    3、静态库
             arm-cortex_a8-linux-gnueabi-gcc -I$(INCLUDE) -c hello/hello.c -o hello/hello.o
             arm-cortex_a8-linux-gnueabi-ar -rcs hello/libhello.a hello/hello.o
             静态库,运行可执行文件不再需要
    4、动态库
             arm-cortex_a8-linux-gnueabi-gcc -I$(INCLUDE) -c good/good.c -o good/good.o
             arm-cortex_a8-linux-gnueabi-gcc -shared -fpic  -o good/libgood.so  good/good.o
             动态库,运行可执行文件也需要指定库文件名以及库文件路径
    5、反汇编命令
              arm-cortex_a8-linux-gnueabi-objdump -d test>test.dis
    6、生成bin文件
               arm-cortex_a8-linux-gnueabi-objcopy -o binary test test.bin
    7、缩减test文件大小,丢弃一些不要的东西
              arm-cortex_a8-linux-gnueabi-strip test
    8、打印出文件中的字符串,用法同7,strip改为string
五、搭建下载环境(TFTP与NFS的配置可参考嵌入式linux操作系统的使用中网络配置一文)
    1. 开发板tftp使用
       1.1 开发板跟tftp服务器通过网线相连
   
       1.2 在开发板串口终端ping tftpserver  (ping 192.168.3.3)
       host 192.168.3.3 is alive
       
       需要设置环境变量(printev setenv)
       gatewayip=192.168.1.1
       ipaddr=192.168.3.5
       netmask=255.255.0.0
       serverip=192.168.3.3
 
         例:
         setenv ipaddr 192.168.3.5
         saveenv
   
       1.3 设置tftp 服务器端服务(主机)
   
       sudo /etc/init.d/tftpd-hpa restart
       tftpd-hpa stop/waiting
       tftpd-hpa start/running, process 11471
   
       安装tftp --> 配置服务器 (sudo vim /etc/default/tftpd-hpa)
       --> 本机测试(tftp localhost)-->开发板测试(tftp 20008000 zImage  go 20008000)
   
       1.4 设置nfs 服务 (主机)
      sudo /etc/init.d/nfs-kernel-server restart
      Exporting directories for NFS kernel daemon...                                                        
      * Starting NFS kernel daemon
         
        安装tftp服务--> 配置nfs (sudo vim /etc/exports)-->提供rootfs (tar xvf rootfs.tgz)
        ---> 本机测试(sudo mount -t nfs localhost:/source/rootfs ./temp)-->开发板测试
   
        开发板终端:
        setenv bootargs root=nfs nfsroot=192.168.3.3:/source/rootfs ip=192.168.3.5 init=/linuxrc             console=ttySAC0,115200
        saveenv
        1.5再次tftp 20008000 zImage---->go 20008000
        
        注:setenv bootcmd tftp 20008000 zImage\;go 20008000一键执行        run bootcmd

六、将编译好的zImage及制作好的文件系统固化在nand flash中,zImage使用地址 100000-400000    nfs使用地址400000-800000
        1、使用命令nand erase 100000 300000        //插除nand flash中100000~400000地址的数据    300000为数据块size(大小)
        2、tftp 20008000 zImage        //zImage为编译好的bootleader程序
        3、使用命令nand write 20008000 100000 300000        //将 zImage写入nand flash中100000~400000地址范围内
        
        4、使用命令nand erase 400000 400000
        5、tftp 20008000 rootfs.cramfs        //rootfs.cramfs为制作好的文件系统
        6、使用命令nand write 20008000 400000 400000

        7、改bootcmd——>setenv bootcmd nand read 20008000 100000 300000\;go 20008000
        8、改bootargs——>setenv bootargs root=/dev/mtdblock2 ip=192.168.1.111 init=/linuxrc console=ttySAC0,115200
注:此外u-boot也是通过这个方法写入Nand Flash中。
Nand Flash中内容的构成一般为:
嵌入式软件开发培训笔记——ARM架构Linux系统下交叉编译环境搭建、NFS、TFTP服务配置及Nandflash的读写_第3张图片
七、将写好的裸机代码xxx.bin烧写到nand中
        1、nand erase a00000 4000                    !!!要注意文件大小      4000的size 最多只能放16K的文件
        2、nand write 20008000 a00000 4000
        3、setenv bootcmd nand read 20008000 a00000 4000\;go 20008000    //将nand flash中a00000中4000size的数据读取到内存20008000的地址处,然后执行内存20008000地址开始的代码程序

你可能感兴趣的:(嵌入式软件开发培训笔记——ARM架构Linux系统下交叉编译环境搭建、NFS、TFTP服务配置及Nandflash的读写)