在嵌入式产品中,操作系统充当硬件资源的管理员的角色,对下有硬件层采集信息或者执行功能,对上还需为应用程序提供适合的API接口以便调用。有着承上启下的重要作用。具体硬件产品用公司或者提供商设计,移植系统时,上层跑什么应用程序也不必操心,我们需要根据硬件定制一个平台。
应用程序不能直接去操作硬件(裸机开发不带操作系统),不然就太不安全了,也不方便管理。Linux内核的免费开源和可剪裁性以及开源稳定的特点使它在嵌入式领域的应用广泛。
初学嵌入式系统移植,先把系统在开发板中的大致流程了解一遍,将整个开发环境先搭建起来,为后面深入学习系统移植方面的知识开个头。后面再深究如何移植和剪裁内核等等。嵌入式开发环境通常是交叉开发环境,即让开发者在PC机上进行编辑和编译程序,程序又在嵌入式产品中运行。
所谓交叉开发是指先在一台通用PC上进行软件的编辑、编译与连接,然后下载到嵌入式设备中运行调试的开发过程。通用PC成为宿主机,嵌入式设备成为目标机。(百度百科)
板子上电先从外存(SD卡)加载Bootloader引导程序,引导程序对硬件初始化的同时,通过tftp协议引导加载Linux内核。运行Linux内核,对硬件进行二次初始化,并nfs挂载网络根文件系统,在文件系统上运行hello.c程序,输出 hello world
流程:上电 --> Bootloader --> linux内核 --> nfs根文件系统 --> hello.c
PS:每个嵌入式产品由于硬件系统不同,移植的步骤也不一样。这里的过程也对我所学习的步骤做了简化,省略一些细节。你若是看到的话,领会其中思想即可。仅供参考哈~~~
我这边开发主机是VMware运行的一个虚拟机,需要配置有
1.设置共享文件夹(方便与windows物理机传输软件包),这里直接使用VMware带的共享功能即可。也可以选择配置Samba服务,无所谓的。
虚拟机 -> 设置 -> 选项 -> 共享文件夹 -> 添加 -> 选择需要共享的位置(如E盘)
2.交叉编译工具安装使用
$ tar xvf gcc-4.6.4.tar.xz
$ sudo vim /etc/bash.bashrc
//在末尾添加 注意路径要根据gcc-4.6.4的实际路径修改
export PATH=/home/linux/store/gcc-4.6.4/bin:$PATH
$ source /etc/bash.bashrc //使配置文件生效
$ arm-n 然后按Tab键补全 //如果能补全为arm-none-linux-gnueabi- 表示安装交叉编译工具成功了
3.tftp服务安装与tftp服务配置
//----虚拟机上安装tftp服务
$ sudo dpkg -s tftpd-hpa //检查是否安装tftp server
$ sudo apt-get install tftpd-hpa //如果未安装,安装 tftp-server
$ sudo vi /etc/default/tftpd-hpa //修改tftp服务器配置文件为
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/tftpboot"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="-c -s -l"
$ mkdir /tftpboot //创建tftpboot目录,
$ sudo chmod a+w /tftpboot
$ sudo service tftpd-hpa restart //启动 tftp-server
4.nfs网络文件共享服务
$ service nfs-kernel-server /*检查nfs服务是否安装
#sudo apt-get install nfs-kernel-server 如果没有,需安装
$ sudo vi /etc/exports /*修改配置文件,指定共享目录位置
/nfs/rootfs *(rw,sync,no_root_squash) 在末尾追加
5.将已经移植好了的内核镜像文件uImage 和设备树 exynos4412-fs4412.dtb 放到 /tftpboot/目录下;将制作好的跟文件系统,放到/nfs/rootfs/目录下。
对于tftp服务和nfs服务的客户端,uboot已经是支持了的。
1.将sdfuse_q 拷贝到Linux下 并识别 /dev/sdb
2.使用最备好的制作工具,进入sdfuse_q执行如下操作
$ sudo ./mkuboot.sh /dev/sdb 出现下面的信息,表示SD启动盘制作成功
Fuse FS4412 trustzone uboot file into SD card
/dev/sdb reader is identified.
u-boot-fs4412.bin fusing...
1029+1 records in
1029+1 records out
527104 bytes (527 kB) copied, 5.31834 s, 99.1 kB/s
u-boot-fs4412.bin image has been fused successfully.
Eject SD card
3.将SD卡插入开发板的SD卡卡槽,上电运行。
PS:FS4412开发板,需要将码盘拨到1000,CPU从SD卡启动,让目标机从SD卡启动UBboot引导程序
1.连接串口线到板子的COM2口 (波特率默认115200),上电运行观察UBoot启动信息
2.配置 板子 物理机 虚拟机的网络信息
|板子 192.168.9.9 |
|电脑 192.168.9.222 | //做中转用,和板子虚拟机IP要在同一网段, 且不能和它们IP一样
|虚拟机 192.168.9.120 |
3.在UBoot交互界面中设置环境变量,常用命令为
FS4412 # pri
baudrate=115200
setenv bootargs root=/dev/nfs nfsroot=192.168.9.120:/nfs/rootfs rw console=ttySAC2,115200 clk_ignore_unused init=/linuxrc ip=192.168.9.9
bootcmd=tftp 41000000 uImage;tftp 42000000 exynos4412-fs4412.dtb;bootm 41000000 - 42000000
bootdelay=3
ethact=dm9000
ethaddr=11:22:33:44:55:66
gatewayip=192.168.9.1
ipaddr=192.168.9.9
netmask=255.255.255.0
serverip=192.168.9.120
ping 192.168.9.222 //is alive 表示ok
saveenv
板子上电后,显示这种状态,就代表成功了。如果中间有卡住,多半是挂了...
1.在PC机中编辑并编译hello.c(使用交叉编译工具链),编译的hello可执行程序放在nfs共享目录中。
2.在串口输出终端中,可以看到开发板已经拿到这个hello.c 和可执行程序 hello
3.通过串口,让开发板执行这个程序
到这里,还不算一个完美的嵌入式系统。因为一个好的嵌入式产品,一定能脱离开发环境运行,而我们这边开发板还需要tftp服务nfs 从主机获取应用和其他信息,万一哪天服务器挂了,嵌入式产品也不能正常工作了。所以产品开发成功之后,还需要将uImage ramdisk等放到EMMC上,通过EMMC启动就可以了。这就是后面学习的内容之一了。