华清远见嵌入式学习day27——编译工具和环境搭建

0、系统移植四天课程安排
    1. 编译工具,环境搭建
    2. bootloader
    3. kernel
    4. 文件系统

1、嵌入式系统的应用领域
    1. 军事
    2. 医疗
    3. 移动设备
    4. 家电
    5. 工控

2、什么是嵌入式系统
    一般的定义:  以计算机技术为基础,以应用为中心,软硬件
    可裁剪的,对功能,功耗,成本,体积有一定要求的计算机。
    广泛的定义: 一般只要带有微控制器的软硬件设备,就称之为
    一个嵌入式系统

3、嵌入式系统主要硬件
    1. 微控制器 
    2. 晶振 
    3. 外存: 掉电不丢失, norflash  nandflash 
            SD eMMC 磁盘,磁带,软盘
    4. 内存: 内存颗粒   掉电丢失 
    5. I/O设备: 传感器, 

4、嵌入式系统软件组成
    带操作系统的
        linux  vxworks unix 
        freeRTOS
    bootloader                    bios    uboot 
    kernel      --- linux            window 
    rootfs   ---  文件系统        ntfs   ext4  jiffs 
    
    不带操作系统的

5、基本概念:本地开发和交叉开发
    1. 本地开发 gcc 
    直接运行在  Ubuntu
    2, 交叉开发
         宿主机上  PC机  编辑 编译
        在 目标机 开发板上 运行    

6、安装交叉编译工具链
    获取方式: 
        1. 官方下载源码
            http://mirrors-usa.go-parts.com/gcc/releases/
           下载工具 crosstool-ng
            http://ymorin.is-a-geek.org/download/crosstool-ng/  4.9.4
        2. 芯片厂家提供(推荐)
            bootloader  linux kernel  交叉编译工具链

    编译工具 配置
        1. export PATH=$PATH:/opt/gcc-4.5.1/bin
            当前终端立即有效
        2. 修改 sudo vi /etc/profile  /etc/bash.bashrc
            当有用户登录时 执行
        3. 修改 vi  ~/.bashrc
            重启终端有效

7、编译流程回顾
    
    gcc -E a.c -o a.i    展开宏定义, 
                    展开头文件 
                不判断语法错误
    cpp
            
    gcc -S a.i -o a.s      汇编  检查语法错误
        将C转换为 汇编代码1
        
    cc -S a.i -o a.s
    
    gcc -c a.s -o a.o     编译
        汇编程序 编译为 目标文件
    as -c a.s -o a.o
    
    gcc a.o -o a.out  链接
    
32位    ld -dynamic-linker /lib/ld-linux.so.2 -o hello /usr/lib/i386-linux-gnu/crt1.o 
    /usr/lib/i386-linux-gnu/crti.o /usr/lib/i386-linux-gnu/crtn.o  a.o  -lc
64位    ld -dynamic-linker /lib/ld-linux.so.2 -o hello /usr/lib/x86_64-linux-gnu/crt1.o 
    /usr/lib/x86_64-linux-gnu/crti.o /usr/lib/x86_64-linux-gnu/crtn.o  a.o  -lc

8、    其他一些工具    
    man objdump 

    readelf  读取格式头,     
        大小端, 什么架构, 
        readelf -h a.out 
        
    size  读取 段大小
        text       data        bss        dec        hex    filename
        1112        292         12       1416        588    a.out
        size  a.out

    objcopy
        格式转换命令
        objcopy -O binary  a.out a.bin

    objdump      编译加上 -g  反汇编命令
        gcc a.c -g -o hello
        objdump -D -S hello  > a.s

    nm    编译加上 -g
        T/t        代码段
        D/d        数据段
        B/b        bss 段
        R/r        只读数据段
        大写表示非静态  static 小写
        nm a.out

    addr2line        编译加上 -g
        dmesg 
[33500.832598] a.out[38169]: segfault at 0 ip 0000000000400548 sp 00007ffd58c00c10 error 6 in a.out[400000+1000]
        addr2line -e a.out  地址值
    地址转换为 代码行号

    strip   瘦身
        strip a.out 
    
    strings  不需要 加 -g 
        strings a.out 
        提起 程序中的 字符串 

9、tftp 服务器安装
    软件是否安装
    dpkg -s tftpd-hpa 
    保证 网络通
    apt-get install tftpd-hpa         服务器
    
    
    sudo vi /etc/default/tftpd-hpa
    1 # /etc/default/tftpd-hpa
    2 
    3 TFTP_USERNAME="tftp"
    4 TFTP_DIRECTORY="/home/sky/tftpboot"
    5 TFTP_ADDRESS=":69"
    6 TFTP_OPTIONS="-l -c -s"
    
    chmod 777 tftpboot/ -Rf
    
    sudo service tftpd-hpa restart  重启服务
    
    --------------------- 自测试
    apt-get install tftp-hpa     客户端
    
    sky@sky:~$ tftp 127.0.0.1
    tftp> get uImage                // 从服务器下载
    tftp> put a.c                    // 上传服务器
    tftp> q


10、测试使用tftp服务给开发板下载代码

    FS6818# printenv
    FS6818# prin
baudrate=115200
bootargs=root=/dev/nfs nfsroot=192.168.8.3:/home/sky/rootfs rw console=/dev/ttySAC0,115200 init=/linuxrc ip=192.168.8.4
bootcmd=tftp 0x41000000 uImage; bootm 0x41000000
bootdelay=3
bootfile=uImage
ethact=dwmac.c0060000
ethaddr=11:22:33:44:55:66
ethprime=RTL8211
filesize=0
gatewayip=192.168.8.1            网关
ipaddr=192.168.8.4                开发板的IP地址
netmask=255.255.255.0            子网掩码
serverip=192.168.8.3            服务器的IP地址
stderr=serial
stdin=serial
stdout=serial    
    
    0. 网线查到 电脑上
    1. 设置相应网卡 100M 全双工
    2. 虚拟机 vmware 桥接到 相应网卡
    3. 设置,自定义到 VMnet0
    4. 右上角网络图标, 设置手动IP , serverip(192.168.8.3)

    FS6818# ping 192.168.8.3
    host 192.168.8.3 is alive   说明 网络好了
    4000 0000   ~  8000 0000
    
    FS6818# tftpboot 41000000 uImage
    FS6818# tftp 41000000 uImage
    FS6818# set gatewayip 192.168.8.1
    FS6818# bootm 41000000                // 启动linux内核

11、 nfs服务的安装 Network File System
    下载安装软件 
    1. sudo apt-get install  nfs-kernel-server
    2. sudo vi /etc/exports 
      /home/sky/rootfs/  *(rw,sync,no_subtree_check,no_root_squash)
    3. sudo service nfs-kernel-server restart
        修改 完配置文件 需要 重启服务
    
    ------------自检测
    mkdir -p  /mnt/nfs  创建挂载点
    
    sudo mount -t nfs  127.0.0.1:/home/sky/rootfs   /mnt/nfs

    -------------------------------------

12、 开发阶段操作系统部署 

    1. FS6818# set bootargs "root=/dev/nfs nfsroot=192.168.8.3:/home/sky/rootfs rw console=/dev/ttySAC0,115200 init=/linuxrc ip=192.168.8.4"
    2. 在 Ubuntu  解压 rootfs.tar.xz 到 /home/sky/rootfs/ 
    3. FS6818# tftp 41000000 uImage
    4. FS6818# bootm 41000000 


 

你可能感兴趣的:(华清远见嵌入式学习day27——编译工具和环境搭建)