三、基于Cortex-A8和ZigBee技术的智能家居监控系统的设计与实现

Qt应用程序部署到ARM板上,需满足几个条件:

1、移植U-boot,并且能启动Linux内核

2、移植Linux内核,Linux 内核要能成功挂载根文件系统

3、构建根文件系统

4、移植Qt应用程序所需的库文件到根文件系统下并配置好的环境参数,如果Qt应用程序使用了触摸事件,还需移植触摸屏库tslib

本篇简单介绍U-boot移植、Linux kernel移植、根文件系统的构建和移植Qt到ARM板上。

详细请参考:

朱有鹏老师U-boot和系统移植课程和课件

《ARM Cortex-A8实战演练》--网蜂团队 倾力打造


一. U-Boot(Universal Boot Loader)移植

(1).选择合适的U-Boot

U-Boot 来自何方?

U-Boot( Universal Boot Loader),最初是由一个德国人发起的项目,然后在整个Network上由存在共同兴趣爱好的小伙伴一起维护,在SourceForge是开源的一个Project。

U-Boot的用处是什么?

主要作用有如下几点:
1、操作系统的kernel由U-Boot来启动。
2、整个计算机系统的部署。
3、操作板子上硬盘的drive等。
3、提供一个友好的命令行界面供用户操作

U-Boot移植选择方案

1、三星官方网站移植U-Boot
2、U-Boot标准的官方网站移植

本系统设计选择第一种方案,主要考虑到如下几点:
(1)、从U-Boot官方移植,对于一个还没有多少工作经验的人来说是件相当困难的事,复杂性很强,需要更改的地方有很多,没有一定的相关工作经验是很难搞定的。
(2)三星已经把s5pv210这款CPU移植到U-Boot上了,所以如果以效益性来说,完全没有多少必要性去做重复且复杂性很高的工作,当然,如果只是为了学习,增强自身功力,那就另当别论。

(2).U-Boot启动过程分析

U-Boot分为两个启动阶段

一、第一阶段

第一阶段主要是做一些跟CPU相关的Initialize工作,比如一些硬件的Initialize等。因为跟硬件相关很大,考虑到效率的问题,所以这部分的代码主要是用汇编写的。
这一阶段的代码一般运行的Flash中,因为是位置无关码,所以在任何位置上都可运行。

第一阶段主要负责的任务主要有如下的五点:
1、一些硬件设备相关的初始化,包括关Interrupt、关Watchdog、设置clock frequency和CPU的工作speed、关闭处理器Internal Command 和数据Cache、configure  SDRAM 存储控制器及 IO等。
2、加载 Bootloader第二阶段的代码,为其准备enough的 RAM 空间。
3、将 Bootloader 第二阶段的代码copy到 RAM 里面去。
4、设置堆栈
5、跳转到第二阶段的 C 函数入口地址。

二、第二阶段

考虑到代码的移植性和可读性,而且需要完成很复杂的功能,所以第二阶段的代码一般会使用C语言来写。

第二阶段主要负责的任务主要有如下的五点:
(1)、Initialize第二阶段要使到的硬件device(如serial、Flash 和网卡等)。
(2)、系统内存映射的检测。
(3)、将kernel image从 Flash 中读取到 RAM 空间里(用户没有干预的情况下)。
(4)、设置kernel的需要的一些启动参数。
(5)、最后,调用kernel。

二. Linux内核(kernel)移植

(1).选择合适的Linux内核(kernel)版本

Linux操作系统发展到现在,Linux kernel版本不断更新,越来越多的CPU加入到了Linux kernel源码中,使得Linux kernel越来越复杂。选择合适的Linux kernel版本,不仅能减轻工作量,而且还能提高Linux kernel运行效率。

选择Linux kernel版本有如下几个因素需要考虑:
(1)、很多人都喜欢追求新的东西,总觉得越新的东西越好,但是有时并非越新越好;如果选择的Linux kernel版本过于新,可能会适得其反,影响kernel运行效率,因为新的版本加载了很多你的内核不需要的功能和文件,如果把它们运行起来,可能会拖慢kernel。
(2)、选择SoC 厂商移植过的Linux kernel版本会减少很多不必要的工作量。

本系统设计选择移植2.6.35.7版本Linux kernel。

(2).Linux kernel的子系统

Linux kernel主要由如下五大子系统构成:
(1)、进程调度(SCHED);
(2)、内存管理(MM);
(3)、虚拟文件系统(Virtual File System ,VFS);
(4)、网络接口(NET);
(5)、进程间通信(IPC);

(3).Linux kernel启动过程分析

Linux kernel启动过程可以分为如下四个阶段:
一、第一阶段:内核自解压阶段;
二、第二阶段:内核引导阶段;
三、第三阶段:内核初始化阶段;
四、第四阶段:Busy Box初始化阶段;

推荐参考文章http://www.linuxidc.com/Linux/2014-10/108034.htm

(4). 移植Linux kernel

移植Linux内核需要六个流程步骤:
第一步: 从Linux kernel官方网站 http://www.kernel.org获取源码;
第二步:修改Linux kernel;
第三步:配置Linux kernel;
第四步:检查串口,如果串口不对,就不能看到kernel输出的调试信息,也就很难跟踪和调试kernel;
第五步:拷贝uImage制作工具(mkimage);
第六步:编译kernel,并且处理出错信息;


三. 制作根文件系统

(1).根文件系统是什么?根文件系统有哪些类型?

所谓的“根”,其实就是基础的意思,所以根文件系统可以理解为最基础的文件系统。根文件系统其实是一种特殊的文件系统。文件系统是是一套软件,由一些C语言代码构成,存储设备的扇区就是由这套软件来管理的,如果要访问存储设备的扇区,只需要访问目录和文件名就可以了,因为目录跟文件名是关联起来的,文件系统会将其变为对扇区号的访问。如何区分不同的文件系统,主要在于它们对扇区管理的策略和方法不一样(如对扇区的坏块管理和碎片管理)。

根文件系统的类型有很多种。以下列出了一些常用的文件系统格式:
1、FAT32
2、NTFS
3、EXT2
4、EXT3
5、JFFS2
6、YAFFS2
7、NFS
8、等等

(2).移植BusyBox

BusyBox简介

BusyBox融合很多UNIX下的工具,是一个开源项目,遵循GPL v2协议。BusyBox相比GNU,BusyBox去掉很多GNU下的功能和参数选项,不过,BusyBox减少的这些功能和参数选项在嵌入式系统中并不常使用,所以可以满足绝大部分的嵌入式系统使用。

如何获取BusyBox源码

BusyBox既然是一个开源项目,当然就可以在网络下载到。打开BusyBox 的官方网站
http://www.busybox.net/ ,找到“Download Source”,然后选择一个版本进行下载,版本差异并不大,所以对版本的要求不高。

移植busybox主要有四个步骤:

第一步:解压下载到的BusyBox到一个目录下
第二步:配置 BusyBox
第三步:编译 BusyBox
第四步:安装 BusyBox

(3).构建根文件系统

安装好 Busybox后,打开其安装目录,可以看到有 usr/bin、usr/sbin、bin、sbin 等目录,构建完整的根文件系统还需要六个重要目录,分别为 lib/、dev/、etc/、proc/、sys/和 tmp/。
构建lib目录:根文件系统要用到一些加载器和动态库文件。所以在根文件系统中的lib/和 usr/lib/目录下需要这些文件。
构建dev目录:这个目录用来存放设备文件 
构建 etc目录::需要在其目录下添加四个文件并为其添加内容,分别为inittab、init.d/rcS、fstab 和 profile
构建proc/、sys/和tmp/目录: /proc 目录用来挂载proc文件系统,/sys 目录用来挂载sys文件系统,/tmp 目录用来挂载tmp 文件系统

(4).构建NFS文件系统

NFS(Network File System),一种网络文件系统。NFS文件系统跟其它文件系统不同的是,NFS文件系统不需要“烧写”,在调试系统的时候非常方便,只需要保证主机跟开发板在同一个局域网内,然后用NFS的方式启动开发板,主机上Linux里的根文件系统目录就会挂载到你的开发板上,不管是修改开发板上的根文件系统还是Linux下的根文件系统,都能够同步更新修改的内容。 
构建NFS文件系统之前需要安装NFS服务器,并配置好一些参数。U-Boot中NFS的参数也要进行相应的修改。

(5).制作ext2格式的根文件系统

在Linux在创建一个目录rootfs,然后在命令行下逐步输入
dd if=/dev/zero of=rootfs.ext2 bs=1024 count=204800
losetup  /dev/loop1 rootfs.ext2
mke2fs -m 0 /dev/loop1 204800
mount -t ext2 /dev/loop1 ./rootfs/
之后打开rootfs/目录,里面就会有一个lost+found目录.完成根文件系统的构建,我们还需要在rootfs/目录中,添加相关的一些文件和目录。

最后执行命令
umount /dev/loop1
losetup -d /dev/loop1
卸载掉,镜像就做好了。

《参考资料:http://blog.csdn.net/zhengmeifu/article/details/24174513

四. Qt简介和移植

(1).Qt是什么?

Qt是一个可以跨平台的应用程序,Qt为用户提供了丰富多样的 UI 开发框架。用户开发的应用程序,只需要一次性开发好,不需要重新编写源代码,便可以部署应用程序在不同桌面和嵌入式操作系统中。
Qt的特点有如下四个:
(1)、直观的 C++ 类库
(2)、跨桌面和嵌入式操作系统的移植性
(3)、具有跨平台 IDE 的集成开发工具
(4)、在嵌入式系统上的高运行时间性能,占用资源少

(2).将Qt移植到ARM开发板上

Linux下或者Windows下编写的Qt应用程序,移植到ARM开发板上部署,需要满足如下条件:
(1)、在ARM开发板部署的Qt应用程序,使用到触摸事件,需要移植触摸屏库tslib到ARM开发板上。
(2)、编译安装嵌入式ARM版的Qt,编译安装好后,在其安装目录下,将一些Qt lib库文件复制到ARM开发板目录下,然后设置开发板环境变量参数。
(3)、ARM开发板部署的Qt应用程序需要字体支持,在Linux下安装好的嵌入式ARM版Qt目录下,将字体文件复制到ARM开发板上,最后设置好开发板环境变量参数。

QT安装和移植参考资料:

ARM Cortex-A8实战演练
http://blog.csdn.net/marc07/article/details/64123329


一、基于Cortex-A8和ZigBee技术的智能家居监控系统的设计与实现

二、基于Cortex-A8和ZigBee技术的智能家居监控系统的设计与实现

四、基于Cortex-A8和ZigBee技术的智能家居监控系统的设计与实现


猜你喜欢

转载自blog.csdn.net/baidu_34919559/article/details/74025142