嵌入式 linux 开发培训

52
Ashen Yu 2008.9.1

Upload: conley

Post on 17-Jan-2016

149 views

Category:

Documents


3 download

DESCRIPTION

嵌入式 Linux 开发培训. Ashen Yu 2008.9.1. 大纲. Linux 的介绍 开发环境的搭建 Minicom 交叉编译工具链 Bootp && Ttfp 嵌入式 Linux 的 镜像文件 下载 制作简单程序 Linux 内核的移植 文件系统的制作 制作 QT/E 应用程序. Linux 的介绍. 定义,特点 Linux 是开放源代码的自由操作系统,是一种 UNIX 操作系统的克隆,但 Linux 不是 Unix 。 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 嵌入式  Linux 开发培训

Ashen Yu

2008.9.1

Page 2: 嵌入式  Linux 开发培训

Linux 的介绍 开发环境的搭建

Minicom 交叉编译工具链 Bootp && Ttfp

嵌入式 Linux 的镜像文件下载 制作简单程序 Linux 内核的移植 文件系统的制作 制作 QT/E 应用程序

Page 3: 嵌入式  Linux 开发培训

定义,特点 Linux 是开放源代码的自由操作系统,是一种 UNIX

操作系统的克隆,但 Linux 不是 Unix 。 Linux 的目标是保持和 POSIX (可移植操作系统接

口, Portable Operating System Interface )的兼容

Page 4: 嵌入式  Linux 开发培训

定义,特点 广泛支持硬件

X86 , PowerPC , ALPHA , SPARC , ARM , MIPS 内核高效稳定 开放源代码,软件丰富 Linux 的发行遵守通用公共许可证( GPL )

秉承“自由的思想,开放的源码”的原则

Page 5: 嵌入式  Linux 开发培训

应用程序 系统应用程序

Shell 、图形界面、系统管理和维护程序、 GCC 编译程序

用户应用程序 系统调用接口

VFS Linux 内核

管理磁盘上的文件、内存 启动和运行程序 从网络上接受和发送数据包

硬件 Linux 安装和运行时所需要的各种

物理设备

应用程序

系统调用接口

Linux 内核

Hardware

Page 6: 嵌入式  Linux 开发培训

常用命令 ls 显示文件列表 cd 目录转换 pwd 显示当前路径 mkdir 创建目录 rm 删除目录 cp 拷贝 tar 压缩解压缩 rpm rpm 包的安装 grep 关键字查找 find 文件查找

自助 man command command -- help

Page 7: 嵌入式  Linux 开发培训

Minicom交叉编译工具链Bootp && Ttfp

Page 8: 嵌入式  Linux 开发培训

1 、硬件的连接 A 、 JTAG 线的联接。

Page 9: 嵌入式  Linux 开发培训

B 、平台上串口的联接。

模块板上的串口

Page 10: 嵌入式  Linux 开发培训

C 、平台上网口线的联接。

Page 11: 嵌入式  Linux 开发培训

D 、平台电源线的联接。

Page 12: 嵌入式  Linux 开发培训

2 、设置串口调试工具。Minicom 是 LINUX 下的串口调试工具。

2.1 、输入命令 "minicom -s"

[root$ super ]# minicom –s+------[configuration]----------

+| Filenames and paths || File transfer protocols || Serial port setup || Modem and dialing

|| Screen and keyboard || Save setup as dfl || Save setup as || Exit || Exit from Minicom |+---------------------------------+

Page 13: 嵌入式  Linux 开发培训

2.2 、选择“ serial port setup” 项显示下面的菜单。

保存设置,选择 "Save setup as dfl.“

再按 ESC 键即可退出 Minicom 的配置界面。

+--------------------------------------------------+| A - Serial Device     : /dev/ttyS0 || B - Lockfile Location : /var/lock || C - Callin Program     : || D - Callout Program    : || E - Bps/Par/Bits        : 115200 8N1 || F - Hardware Flow Control : No || G - Software Flow Control : No || || Change which setting? |+---------------------------------------------------+

Page 14: 嵌入式  Linux 开发培训

Bootp : 英文原义: Bootstrap Protocol 中文释义:自举协议 注解:该协议是一个基于 TCP/IP 协议的协议,它可以让无盘站从一个中心

服务器上获得 IP 地址

创建 Bootp

3.1 、安装 bootp rpm 包 bootp rpm 在附送光盘的 rpm 目录里。

[root$super root]# cd /mnt/cdrom/rpm[root$super RPM]# rpm –i bootp-2.4.3-7.i386.rpm

Page 15: 嵌入式  Linux 开发培训

3.2 、拷贝配置文件 将光盘中的 Net_config 目录下的 bootp 拷贝到 /etc/xinetd.d

目录下

将光盘中的 Net_config 目录下的 bootp tab 拷贝到 /etc 目录下

cp /mnt/cdrom/Net_Config/bootptab /etc/

Page 16: 嵌入式  Linux 开发培训

3.3 、更改 boottab 文件在 /etc 下更改 bootptab 文件下面是 Bootp 的范例:

/etc/bootptab

test:\ ht=1:\ ha=0x123456789A00:\ ip=192.168.0.50:\ sm=255.255.255.0

注意: 板子的 ip 地址和主机平台的 ip 地址必须在同一个网段内。( 例如 主机 IP: 192.168.10.100, 板子 IP : 192.168.10.xxx)

‘1’ 表示使用以太网协议

Page 17: 嵌入式  Linux 开发培训

Tftp: 英文原义: Trivial File Transfer Protocol 中文释义:简单文件传输协议 注释:提供不复杂、开销不大的文件传输服务。

创建 Tftp

3.4 、安装 tftp-server rpm

[root$super root]# cd /mnt/cdrom/RPM[root$super RPM]# rpm –i tftp-server-0.17-9.i386.rpm

Page 18: 嵌入式  Linux 开发培训

3.5 、拷贝配置文件 将光盘中的 Net_config 目录下的 tftp 拷贝到 /etc/xinetd.d 目

录下

Page 19: 嵌入式  Linux 开发培训

3.6 、重启 xined

在主机平台重启 xined 。

[root$super root ]# /etc/rc.d/init.d/xinetd restartStopping xinetd :

[ OK ]Starting xinetd : [ OK ]

Page 20: 嵌入式  Linux 开发培训

交叉编译:由于嵌入式系统的自身限制不可能装备很大的存储设备和友好的人机交互界面,所以嵌入式开发的程序编写和编译是在 PC 机上完成的,编译产生的结果在嵌入式目标平台上运行

4.1 安装编译工具链 (Toolchain) 编译工具链在附带光盘的 Toolchain 目录下

4.2添加环境变量将下面的语句添加到用户主目录下 .bash_profile 文件尾

然后重启系统

[root$super]# cp /mnt/cdrom/Toolchain/xscalev1.tar.gz /opt[root$super]# cd /opt/[root$super opt]#tar xzvf xscalev1.tar.gz

PATH=$PATH:/opt/xscalev1/bin

Page 21: 嵌入式  Linux 开发培训

4.3 、 X86 与 ARM 中小程序的开发 分别使用 gcc 和 arm-linux-gcc 编译下面一个短小的例子。

hello.c 的内容:

#include <stdio.h>int main(){

printf(“Hello World”);}

[root$super ]# gcc –o hello hello.c[root$super ]# arm-linux-gcc hello.c –o hello-arm [root$super ]# file hello hello: ELF 32-bit LSB executable, Intel 80386, version 1,

dynamically linked (uses shared libs), not stripped[root$super ]# file hello-arm hello-arm: ELF 32-bit LSB executable, Advanced RISC Machines

ARM, version 1, dynamically linked (uses shared libs), not stripped

Page 22: 嵌入式  Linux 开发培训

5 、使用 JTAG 下载 Bootloader1. 需要烧写工具 Jflashmm2. 需要建立好的 bootloader映像文件

[root$super root ]#./Jflashmm boot

Page 23: 嵌入式  Linux 开发培训

6、下载 Kernel 和 Filesystem6.1 、拷贝映像文件到 /tftpboot ( 附带光盘 Image\ 下放着已经做好的映像文件 )

6.2 、打开 minicom, 打开板子电源开关。 显示启动信息。

当你看到 “ Autoboot in progress, press any key to stop” 时 3 秒内按下任意键然后再按下“ 0”;你将进入 bootloader 命令模式。

XSBASE-R1Copyright (C) 2002 EMDOOR Co,. ltd.Support: http://www.emdoor.comAutoboot in progress, press any key to stop .Autoboot abortedType "help" to get a list of commandsEmDoor>

[root$super Image]# cp * /tftpboot

Page 24: 嵌入式  Linux 开发培训

6.3 、使用 bootp 自举 IP

6.4 、使用 TFTP 命令下载 kernel 。

6.5 、烧写 Kernel 到 flash 中。

6.6 、使用 TFTP 命令下载 Filesystem

6.7 、烧写 Filesystem 到 Flash 中

EmDoor > bootp

EmDoor > flash kernel

EmDoor > tftp rootfs.img root

EmDoor > flash root

EmDoor > tftp zImage kernel

Page 25: 嵌入式  Linux 开发培训

8 、 linux 启动 如果上述 3 个映像文件都成功地下载到 FLASH 中,那么 Linux 启

动条件将满足。开始启动。EmDoor> rebootStarting kernel ...

Uncompressing Linux................

INIT: Entering runlevel: 3

Starting syslog Starting system logger:

Starting pcmcia Starting PCMCIA

Starting etwork Starting network

[root@emdoor ~]# Starting X...

[root@emdoor ~]# 启动完成,成功进入 Shell

Page 26: 嵌入式  Linux 开发培训

使用 minicom 连接上开发板

Ctrl+A , S 选择 zmodem 模式

Page 27: 嵌入式  Linux 开发培训
Page 28: 嵌入式  Linux 开发培训

Boot Loader 的简介

Boot Loader 是一种引导程序,它是系统加电后运行的第一段软件代码。通过这段代码,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。

通常, Boot Loader 是严重地依赖于硬件而实现的,特别是在嵌入式世界。因此,在嵌入式世界里建立一个通用的 Boot Loader 几乎是不可能的。尽管如此,我们仍然可以对 Boot Loader 归纳出一些通用的概念来,以指导用户对特定的 Boot Loader 进行设计与实现。

Page 29: 嵌入式  Linux 开发培训

Boot Loader 的安装媒介 系统加电或复位后,所有的 CPU 通常都从某个由 CPU 制造商预先安排的地址上取指令。比如,基于 XSCale core 的 CPU 在复位时通常都从地址 0x00000000 取它的第一条指令。而基于 CPU 构建的嵌入式系统通常都有某种类型的固态存储设备 (比如:ROM 、 EEPROM 或 FLASH 等 ) 被映射到这个预先安排的地址上。因此在系统加电后, CPU 将首先执行 Boot Loader 程序。 下图就是一个同时装有 Boot Loader 、内核的启动参数、内核映像和根文件系统映像的固态存储设备的典型空间分配结构图。

Page 30: 嵌入式  Linux 开发培训

Boot Loader 特点

不同的 CPU 都有不同的 Boot Loader U-boot 支持 ARM 和 MIPS

也依赖于具体的嵌入式板级设备的配置 例如: Liod && EELiod

一般需要用 JTAG烧写 一般使用串口进行连接 两种工作模式:

下载模式—— tftp (以太网) 启动模式

Page 31: 嵌入式  Linux 开发培训

Boot Loader 的启动过程Boot Loader 的实现依赖于 CPU 的体系结构,因此大多数 Boot Loader 都分为 stage1 (汇编)和 stage2 ( C 语言) 两大部分Boot Loader 的 stage1 通常包括以下步骤 ( 以执行的先后顺序 ) : 1 、硬件设备初始化 2 、为 stage2 准备 RAM 空间 3 、拷贝 stage2 到 RAM 空间中 4 、设置好堆栈 5 、跳转到 stage2 的 C 入口点 Boot Loader 的 stage2 通常包括以下步骤 ( 以执行的先后顺序 ) : 1 、初始化本阶段要使用到的硬件设备 2 、检测系统内存映射 (memory map) 3 、将 kernel 映像和根文件系统映像从 flash 上读到 RAM 空间中。 4 、为内核设置启动参数 5 、跳转到内核的入口点

Page 32: 嵌入式  Linux 开发培训

10 、解压 Kernel 源码包源码包的位置在附带光盘的 /Kernel 下

解压完成后进入刚刚解压出来的目录

[root$super Kernel]# cp * ~[root$super Kernel]# cd[root$super ~]# tar zxvf linux-2.4.21-

51Board_EDR_020001NEWV30.tar.gz

Page 33: 嵌入式  Linux 开发培训

arch include init mm kernel drivers

block char cdrom pci scsi net sound

lib net ipc fs scripts

各种 CPU体系结构相关的内核代码 编译内核所需要的头文件 内核的初始化代码 独立于 CPU体系结构的内存管理代码 主要的内核代码 系统所有支持的设备驱动代码

块设备驱动 字符设备驱动 所有的 CD-ROM驱动 PCI卡驱动,包含 PCI 子系统映射和初始化代码等

所有的 SCSI驱动 网络设备驱动 声卡设备驱动

内核所需的库文件 内核与网络相关的代码,有别于 /drivers 下

的 /net 内核进程通信的代码 所有文件系统代码和各种类型的文件操作代码 用于配置内核的脚本

Page 34: 嵌入式  Linux 开发培训

Linux 内核编译的操作方法

10.2 、 “make menuconfig.” 命令打开内核配置。

10.3 、“make dep.”检查依赖性

10.4 、“make zImage.”生成内核映像

[root$super linux-2.4.21-emdoor]# make menuconfig

[root$super linux-2.4.21-emdoor]# make dep

[root$ linux-2.4.21-emdoor]# make zImage

如果编译没有出错,在 arch/arm/boot 路径下生成映像文件 zImage 。

Page 35: 嵌入式  Linux 开发培训

配置界面的使用方法运行 make menuconfig后将进入 Kernel 的配置界面

1. 使用上下键可以在各个菜单之间移动

2. 在标有” ---->” 标志的地方按回车键进入下一级菜单

3. 按 <ESC> 可以回到上级菜单,或退出

4. 按 <F1>或选择菜单中<Help> 可以获得帮助信息

5. Y 表示选择该功能,M表示以模块方式编译到内核, N表示不选择该功能

6. [ ] 可以选择三种状态, < >只有两种

Page 36: 嵌入式  Linux 开发培训
Page 37: 嵌入式  Linux 开发培训

嵌入式 Linux 文件系统简介 由于系统体系结构的不同,嵌入式文件系统在很多方面与桌面文件

系统有较大区别。例如在普通桌面操作系统中,文件系统不仅要管理文件,提供文件系统 API ,还要管理各种设备,支持对设备和文件操作的一致性(像操作文件一样操作各种 I/O 设备)。在嵌入式文件系统中,则发生了变化——在某些情况下,嵌入式操作系统可以针对特殊的目的制定,特别是随着 ASOS(Application Specific Operating System ,为应用定制的嵌入式操作系统 )的发展,对嵌入式操作系统的系统功能归整性和可伸缩性提出了更高的要求。一般说来,嵌入式文件系统要为嵌入式系统的设计目的服务,不同用途的嵌入式操作系统下的文件系统在许多方面各不相同。

Page 38: 嵌入式  Linux 开发培训

嵌入式操作系统的文件系统的设计目标 1 .使用简单方便 .

2 .安全可靠 3 .实时响应 4 .接口标注的开放性和可移植性 5 .可伸缩性和可配置性 6 .开放的体系结构 7 .资源有效性 8 .功能完整性 9 .热插拔 10.支持多种文件类型

Page 39: 嵌入式  Linux 开发培训

Linux 文件系统概述 Linux 支持的文件系统有 ext 、

ext2 、 xia 、 vfat 、 minix 、 msdos 、 umsdos 、 proc 、 smb 、 ncp 、 iso9660 、 nfs 、 sysv 、 hpfs 、 affs 和ufs等

嵌入式 Linux 常用文件系统 支持 NOR FLASH 的 JFFS 、 JFFS2 文件系统和支持 NAND FLASH

的 YAFFS 、 YAFFS2最为流行。

Page 40: 嵌入式  Linux 开发培训

Linux 下常用文件系统结构 目录树

虚拟文件系统

JFFS2 RAMFS

MTD字符设备 MTD块设备

MTD设备驱动

RAMNOR Flash

用户层

内核层

底层驱动

硬件层

Page 41: 嵌入式  Linux 开发培训

1. 将光盘中的 Filesystem 目录拷贝到工作目录

2. 解压该目录中的一个 tar.gz 文件 (qt)

3. 进入 rootfs 目录做相应的修改 (添加一个应用程序 )

4. 退出 rootfs 目录,运行 mkrootfs.sh

5. 将生成的镜像文件重新下载到 Flash 中

Page 42: 嵌入式  Linux 开发培训

Qt 是一种跨平台的 C++ 图形界面( GUI )工具包,它是 Troll Tech化公司的标志产品, Qt工具包括用于商业性质的商业版和用于开发自由软件的两种不同的版本,用自由版开发软件必须作为自由软件公布。

QT/E 是指 QT 的嵌入式版本,删除了许多嵌入式 GUI 中不常用的代码,缩小了体积,但是需要根据处理器的结构进行移植

Page 43: 嵌入式  Linux 开发培训

利用 Qt Designer 工具,建立一个工程文件,从 File 菜单选中 New ,从对话框中选中 C++ Project 图标,按 OK 按钮将新建工程保存为 test.pro ( Qt 工程的扩展名为 .pro );

Page 44: 嵌入式  Linux 开发培训

建立窗体和添加控件:选中 File 菜单中的 New 菜单,双击dialog 图标,建立一个对话框图形界面,可以在属性编辑栏中修改窗体或控件的相关属性。根据设计需要,在窗体上添加一些常用如按钮、文本框等控件;然后保存为 test.ui

Page 45: 嵌入式  Linux 开发培训

自动配置生成main.cpp 文件 :选中 File 菜单中的 New 菜单,双击 C++ Main-File 图标, Qt 自动将当前窗体文件作为主界面,并自动生成main.cpp 文件 ; 然后再工程列表中删除test.ui;

Page 46: 嵌入式  Linux 开发培训

在嵌入式平台中无法对 ui 界面文件进行编译,因此Qt 提供将 ui 文件转换成标准的 C++头文件( .h)与实现文件 (.cpp) 的 uic 工具。 uic 工具还可以完成 C++ 子类继承文件的转换和将图片文件转换成头文件的形式。现介绍利用 uic 工具将前面建立的 test.ui 文件转换成标准的 C++头文件和实现文件 (uic 具体使用方法参考 qt 文档 )。

生成 C++头文件:uic –o test.h test.ui

生成 C++实现文件( .cpp 文件)uic –o test.cpp –impl test.h test.ui

Page 47: 嵌入式  Linux 开发培训
Page 48: 嵌入式  Linux 开发培训

qmake –o Makefile test.pro make ./test

Page 49: 嵌入式  Linux 开发培训

对 *.PRO 工程文件进行修改

SOURCES+= main.cpp \test.cpp

HEADERS += test.hunix { UI_DIR = .ui MOC_DIR = .moc OBJECTS_DIR = .obj}TEMPLATE =appCONFIG += qt warn_on releaseLANGUAGE = C++

SOURCES+= main.cpp \test.cpp

HEADERS += test.hunix { UI_DIR = .ui MOC_DIR = .moc OBJECTS_DIR = .obj}TEMPLATE =appCONFIG += qt warn_on releaseLANGUAGE = C++

SOURCES+= main.cpp \test.cpp

HEADERS += test.hTEMPLATE =appCONFIG += qtopia qt warn_on releaseLANGUAGE = C++

SOURCES+= main.cpp \test.cpp

HEADERS += test.hTEMPLATE =appCONFIG += qtopia qt warn_on releaseLANGUAGE = C++

Page 50: 嵌入式  Linux 开发培训

source setQTEenv.sh tmake –o Makefile test.pro Make 然后通过串口将程序下载到开发板上的 /usr/

qpe/bin 目录下 利用 chmod 命令修改 test 的属性: chmod 755

test

Page 51: 嵌入式  Linux 开发培训

在目标板的 /usr/qpe/applications 目录下新建一个 test.desktop 文件:

[Desktop Entry]Comment=A Qt test ProgramExec=testIcon=ClockType=ApplicationName=Test

[Desktop Entry]Comment=A Qt test ProgramExec=testIcon=ClockType=ApplicationName=Test

Page 52: 嵌入式  Linux 开发培训

重启开发板 点击 qtopia 界面上的“ test”便可运行测试程