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