开发环境的建立
DESCRIPTION
开发环境的建立. 内容提要. 1 、宿主机 - 目标机开发模式 2 、 XsBase255 目标机环境 3 、宿主机环境 4 、试验 烧写 XsBase255 的 BootLoader 使用 Minicom 实现串口通信 建立开发环境 熟悉交叉编译环境和开发工具. 网络. HUB. 硬件调试器. Ethernet. Ethernet. JTAG. Serial. 主机工作站 PC. 目标扳. 1 、宿主机 - 目标机开发模式. 嵌入式系统开发与通常 PC 机上的软件开发的区别 交叉开发。 交叉编译。 特点. - PowerPoint PPT PresentationTRANSCRIPT
1
开发环境的建立
2
内容提要1 、宿主机 - 目标机开发模式 2 、 XsBase255 目标机环境3 、宿主机环境 4 、试验
烧写 XsBase255 的 BootLoader
使用 Minicom 实现串口通信 建立开发环境 熟悉交叉编译环境和开发工具
3
1 、宿主机 - 目标机开发模式
Ethernet
Serial
JTAG
Ethernet
HUB
网络
目标扳主机工作站 PC
硬件调试器
4
嵌入式系统开发与通常 PC 机上的软件开发的区别
交叉开发。
交叉编译。
特点
5
一个嵌入式系统的开发环境一般包括 :
嵌入式目标板
开发用的宿主机( PC )
硬件调试器
6
应用程序的开发通常是 Linux 操作系统在嵌入式目标机上运行进来之后进行。此时,更多的是在宿主机上使用 GDB 通过网络(或串口)与目标板通信,进行程序的调试。
7
XsBase255 目标机环境JTAG 接口简介
在 XSBase255 目标机上,使用常用的硬件测试方法 JTAG 进行测试。 作为硬件测试手段, JTAG 的功能与 CPU 状态无关,可以驱动设备的所有外部引脚并读入数据,而且在设备内部夺取外部的连接点(与通往外部的各个 pin 脚一一连接)。各个 cell 为了形成串行移位寄存器(边界扫描寄存器)而相连。整体的接口由 5 个 pin 脚来控制( TDI , TMS ,TCK , nTRST , TDO )。其功能包括:测试线路连线和端子的连接状态;测试设备间的连接状态;进行 Flash memory (闪存) 烧写等。
8
9
BootLoader
Boot Loader 就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。
PC 由 BIOS 和位于 MBR (主引导记录)中的 bootloader 引导:
LILO ( Linux Loader , Linux 加载程序)GRUB ( GRand Unified Bootloader ,完备的统
一引导载入软件 )
U-BOOT ( Universal Boot Loader ,支持嵌入式 Linux 系统的引导)
10
Boot Loader 是系统加电后运行的第一段代码。通常情况下, Boot Loader 通过串口与宿主机进行文件传输,但串口传输的速度是有限的,因此通过以太网连接并借助 TFTP 协议来下载文件是个更好的选择。 在 XSBase255 上使用的 Boot Loader 加载操作系统内核之前 IP 没有被设置。这个时候无法通过以太网进行数据传送,我们必须在 Boot Loader上通过 BootP 设置 IP ,然后通过 TFTP 传送数据。
11
系统加电或复位后,所有的 CPU 通常都从某个由 CPU制造商预先安排的地址上取指令。基于 XScale 内核的CPU 在复位时通常都从地址 0x00000000 处取它的第一条指令。而基于这种 CPU 构建的嵌入式系统通常都有某种类型的固态存储设备 ( 比如: ROM 、 EEPROM 或FLASH 等 ) 被映射到这个预先安排的地址上。因此在系统加电后, CPU 将首先执行 Boot Loader 程序( 0x00000000 )。 Boot parameters
Kernal Root filesystemBootLoader
一个同时装有 Boot Loader 、内核的启动参数、内核映像和根文件系统映像的固态存储设备的典型空间分配结构图
12
大多数 Boot Loader 都包含两种不同的操作模式: " 启动加载 " 模式和 " 下载 " 模式,这种区别仅对于开发人员才有意义。但从最终用户的角度看,Boot Loader 的作用就是用来加载操作系统,而并不存在所谓的启动加载模式与下载工作模式的区别。
启动加载模式
下载模式
13
Boot Loader 的阶段 1 通常包括以下步骤:a. 硬件设备初始化。b. 为加载 Boot Loader 的 阶段 2 准备 RAM 空间。 c. 拷贝 Boot Loader 的 阶段 2 到 RAM 空间中。 d. 设置好堆栈。 e. 跳转到 阶段 2 的 C 入口点。
14
Boot Loader 的阶段 2 通常包括以下步骤:a. 初始化本阶段要使用到的硬件设备。b. 检测系统内存映射 (memory map) 。 c. 将 kernel 映像和根文件系统映像从 flash 上读到 R
AM 空间中。 d. 为内核设置启动参数。
15
3 、宿主机环境3.1 BOOTP 协议 3.2 TFTP 协议 3.3 交叉编译 3.4 Make 工具
16
3.1 BOOTP 协议 BOOTP服务的全称是 BootStrap Protocol (引导协议)
使用 TCP/IP 网络协议中的 UDP 67/68两个通讯端口
常用到的 DHCP服务就是从 BOOTP服务扩展而来的
过程:
第一步,在目标板由 BootLoader 启动 BOOTP ,此时目标板还没有 IP 地址,它就用广播形式以 IP 地址 0.0.0.0向网络中发出 IP 地址查询的请求,这个请求帧中包含了客户机的网卡MAC 地址等信息。
17
第二步,主机平台运行 BootP服务的服务器接收到的这个请求帧,根据这帧中的 MAC 地址在 Bootptab 启动数据库中查找这个 MAC 的记录,如果没有此 MAC的记录则不响应这个请求;如果有就将 FOUND帧发送回目标板。 FOUND帧中包含的主要信息有目标板的 IP地址、服务器的 IP 地址、硬件类型、网关 IP 地址、目标板 MAC 地址和启动映象文件名。
第三步,目标板就根据 FOUND帧中的信息通过 TFTP服务器下载启动映象文件。
18
3.2 TFTP 协议TFTP服务的全称是 Trivial File Transfer Protocol (简单文件传输协议)
TFTP 可以看成一个简化了的 FTP , TFTP不需要认证客户端的权限,这样远程启动的目标板在启动一个完整的操作系统之前就可以通过 TFTP 下载启动映象文件,而不需要证明自己是合法的用户
TFTP 在安装时一定要设立一个单独的目录作为 TFTP服务的根目录,设置 TFTP服务为:只能下载不能上传等以减少安全隐患
19
3.3 交叉编译交叉编译就是在一个架构下编译另一个架构的目标文件。目标文件在不同架构间由于采用的 CPU 指令集不同等原因不能通用。比如 X86架构的程序不能运行于 ARM架构的XSBase255 目标机。
采用何种交叉编译器产生何种格式的目标文件还要取决于目标机的操作系统。
本门课程交叉编译就是在 X86架构的宿主机上生成适用于ARM架构的, ELF格式的可执行代码。
20
3.4 Make 工具GNU Make 是一种常用的编译工具,通过它,程序员可以很方便地管理软件编译的内容、方式和时机,从而使程序员能够把主要精力集中在代码的编写上。 Make自动判断源码中哪些部分有更新,重新编译这些文件并重新链接。对于那些由许多源文件组成的大型软件项目来说,采用这种项目管理方法则可以极大地提高工作效率,让原本复杂繁琐的开发工作变得简单。make 工具通过一个称为 makefile 的文件来完成并自动维护编译工作。 makefile需要按照某种语法进行编写,其中说明了如何编译各个源文件并连接生成可执行文件,并定义了源文件之间的依赖关系。当修改了其中某个源文件时,如果其他源文件依赖于该文件,则也要重新编译所有依赖该文件的源文件。
21
基本规则 :目标、依赖关系、指令
target : dependency …… command ……
目标( target ):需要由 make 工具创建的项目,是指令( command )执行的结果文件(目标文件或执行文件),也可以是一个标签( Lable ),如 make clean 、 make all 等。依赖( dependency ):要创建的项目依赖于哪些文件或目标。依赖条件顶格书写。 指令( command ):创建每个项目时 make需要运行的命令(任意的Shell命令) 。指令必须使用一个 TAB符(制表位)开始进行书写。在指令部分定义的指令会在依赖文件的内容有所变更或找不到目标文件时被执行。
22
如果一个工程有三个源文件 write.c , read.c , main.c生成可执行程序 test 。 用于生成 test 的 Makefile 文件如下:
test: main.o read.o write.o gcc –o test main.o read.o write.o
main.o : io.h main.c gcc –c main.cread.o : io.h read.c gcc –c read.cwrite.o : io.h write.c gcc –c write.cclean: rm test main.o read.o write.o
-c :对源程序进行预处理、编译,产生目标文件,但不进行连接。-o < 文件名 > :定义输出的执行文件名为 < 文件名 > 。
23
clean不是一个文件,它只不过是一个动作名字,有点像C语言中的 lable 一样,其冒号后什么也没有,那么, make 就不会自动去找文件的依赖性,也就不会自动执行其后所定义的命令。要执行其后的命令,就要在 make命令后明显得指出这个 lable 的名字。
例如,使用名为 clean 标签来进行清除,可以没有依赖关系部分,即执行命令
以此来清除所有的目标文件,以便重新编译。相当于执行了:
[root@XSBase test]# make clean
[root@XSBase test]# rm test main.o read.o write.o
24
Makefile依赖关系
使用 vi 编译器创建 Makefile 后,进行 make ,则生成执行文件 test 。 Make 将按照 Makefile 中指定的依赖关系来依次执行。
[root@XSBase test]# make
25
宏和标签 为了 makefile 的易维护,在 makefile 中我们可以使用变量。 makefile 的变量也就是一个字符串,理解成 C语言中的宏可能会更好。 比如,我们声明一个能够表示 obj 文件的宏,宏名可为objects , OBJECTS , objs , OBJS , obj 或 OBJ等。
可使用宏( Macro )功能和标签( Label )功能使 Makefile 的创建更为灵活。宏起到以替换指定的内容使程序简单化的作用。宏必须要在 $(..)里面使用。
26
例:利用宏来创建 Makefile 。在这里宏是 OBJECTS ,将main.o 、 read.o 、 write.o替换为 OBJECTS 来使用。
OBJECTS = main.o read.o write.otest: $(OBJECTS) #使用名为 OBJECTS 的宏来创建 Makefile.
gcc –o test $(OBJECTS)main.o: io.h main.c gcc –c main.cread.o: io.h read.c gcc –c read.cwrite.o: io.h write.c gcc –c write.cclean: rm test $(OBJECTS)
27
预定义的宏 (Pre-defined Macro) 执行 make -p 可看到 Make 中事先指定好的各个值(宏,环境参数等)。
宏的定义 涵义AS = as 指定汇编器,默认值为 as
ASFLAGS = 汇编程序( AS 指令)的选项设置CC = cc 或 CC = gc
c指定编译器( C),默认值为 cc
CFLAGS = C编译器( gcc 指令)的选项设置CXX = g++ 指定 C++编译器,默认值为 g++
CPPFLAGS = C++编译器( g++ 指令)的选项设置
LD = ld 指定链接器LDFLAGS = ld 的选项设置
28
扩展名规则 扩展名规则( Suffix Rule )是根据文件的扩展名来进行适当的运算操作。例如, .c 一般指 C源文件, .o 文件是目标文件。 .c 文件编译后应成为 .o 文件。 在这里出现名为 .SUFFIXES 的宏,这个宏自动处理Make
file 中需要慎重处理的文件的扩展名。 .SUFFIXES = .c .o
上面的例子对带有 .c 和 .o扩展名的文件按照扩展名规则来处理,自动操作使 .c 文件编译后生成 .o 文件。
29
宏名 涵义$* 没有扩展名的当前目标文件
$@ 当前目标文件的完整名称
$< 第一个依赖文件的名称,即比当前目标文件更新的第一个文件名
$?所有的依赖文件,以空格分开,这些依赖文件修改日期比目标的创建日期晚。比当前目标文件更新的所有文件名
$^ 所有的依赖文件,以空格分开,重复出现的名字只保留一个
$+所有的依赖文件,以空格分开,并以出现的先后为序,保持重复出现的名字不变
内部宏定义( Internal Macro )用于简化 Makefile 的写法
30
内部宏的用法例子一:
main.o : main.c io.h gcc -c $*.c
说明: $* 是没有扩展名的当前目标文件,所以 $*.c扩展为 main.c 。 例子二:
test : gcc -o $@ -c main.c
说明: $@ 是当前目标文件,相当于 test 。 例子三:
.c.o : gcc -c $<
test: main.o gcc -o $@ main.o
说明:如果源文件 .c 比目标文件 .o 更新,则 .c 文件会自动编译。即在 main.o生成之后更新了 main.c 的话,那么main.c 就会被 $<自动重新编译。
31
myprog:main.o display.o input.o
gcc main.o display.o input.o -o myprog
main.o:main.c commom.h
gcc -c main.c
display.o:display.c display.h common.h
gcc -c display.c
input.o:input.c input.h common.h
gcc -c input.c
clean:
rm -f myprog main.o display.o input.o
CC=gcc
OBJS=main.o display.o input.o
myprog:$(OBJS)
$(CC) $(OBJS) -o $@
main.o:main.c commom.h
$(CC) -c $<
display.o:display.c display.h common.h
$(CC) -c $<
input.o:input.c input.h common.h
$(CC) -c $<
clean:
rm -f myprog $(OBJS)
32
实验三 Makefile
使用命令编译程序使用预定义变量编译程序使用预定义变量对多个 .c 文件编译具体练习题目详见实验指导书
33
RPM
(1) rpm 的主要功能及命令 rpm 的基本使用 Red Hat 软件包管理器( RedHat Package Manager, 简称 RPM )。 在 Red Hat Linux 的光盘上,有许多以 rpm 为类型名的文件,它们是分类将各软件产品的所有必要的文件打包到相应文件中,这些文件就是软件包。安装程序用 rpm命令打开这些软件包并将文件复制到硬盘中适当的位置上。
34
一系列的 rpm命令构成了软件包管理器, rpm 包管理的用途如下: 可以安装、删除、升级和管理以 rpm 包形式发布的软件;可以查询某个 rpm 包中包含哪些文件,以及某个指定文件属于哪个 rpm 包;可以在查询系统中的某个 rpm 包是否已安装以及其版本;作为开发者可以把自己开发的软件打成 rpm 包发布;依赖性的检查,查询安装某个 rpm 包时,需要哪些其它的rpm 包。
35
注意: rpm 软件的安装、删除、更新只有 root权限才能使用;对于查询功能任何用户都可以操作。软件包文件名是由软件包名、版本号和版本的发行号三部分组成,例如从软件包文件名“ XFree86-3.3.2.3-25.rpm” ,我们可以获得如下信息:软件包名: XFree86 ;版本号: 3.3.2.3 ;版本的发行号:25 。
36
命令 rpm 的基本使用方法 格式 : rpm [options] [RPM filename…]
功能:能够建立、编译、查询、校验、升级和卸载独立软件包的包管理器。
参数 :-qa 查看系统内所有已安装的软件包列表。-ql 软件包名称 查看此软件包中所有的文件及所在的目录。-qd 软件包名称 查看此软件包中所有的文档。-qc 软件包名称 查看此软件包中所有的组态配置文件。-qi 软件包名称 显示软件包的详细信息,包括版本号、大小、安装日期和简短说明。-qs 列出软件包中所有文件所处的状态。-p 查询指定的。-R 显示软件包的关联性信息。-e 删除软件包。-i 安装软件包。-V 验证软件包。
37
得到一个新软件,在安装之前,一般都要先查看一下这个软件包里有什么内容,假设这个文件是: Linux-1.4-6.i368.rpm ,查看的组合命令有很多,在此介绍一些常用命令:
查看系统内所有已安装的软件包列表# rpm -qa
查看一个软件包的用途、版本等信息# rpm -qpi Linux-1.4-6.i368.rpm
系统将会列出这个软件包的详细资料,包括含有多少个文件、各文件名称、文件大小、创建时间、编译日期等信息。
38
查看一件软件包所包含的文件# rpm -qpl Linux-1.4-6.i368.rpm
可以用 -qpl 选项查看软件包将会在系统里安装哪些部分,以方便我们的选择。
查看软件包的文档所在的位置# rpm -qpd Linux-1.4-6.i368.rpm
查看一个软件包的配置文件# rpm -qpc Linux-1.4-6.i368.rpm
查看一个软件包的依赖关系# rpm -qpR Linux-1.4-6.i368.rpm
39
选择安装方式后,开始安装一个 rpm 包。在安装过程中,若系统提示此软件已安装过或因其他原因无法继续安装,但如果确实想执行安装命令,可以在 -ivh 后加一参数“ -replacepkgs” 。
# rpm -ivh Linux-1.4-6.i368.rpm
或# rpm -ivh -replacepkgs Linux-1.4-6.i368.rpm
40
对低版本软件进行升级是提高其功能的好办法,这样可以省去卸载后再安装新软件的麻烦,要升级某个软件,只须执行如下命令: rpm -uvh < 文件名 > ,注意:此时的文件名必须是要升级软件的升级补丁。
# rpm -Uvh Linux-1.4-6.i368.rpm不过,在安装和升级时,如果软件包有依赖关系的,需解决依赖关系;如果找不到依赖关系的包,可以用下面的命令强制安装。其中选项 (--nodeps)表示不验证软件包的相互关联性;选项 (--force)表示强行置换软件包或文件。
# rpm -ivh --nodeps --force Linux-1.4-6.i368.rpm # rpm -Uvh --nodeps --force Linux-1.4-6.i368.rpm
如果对软件包仅仅是作测试,并不真正安装,则执行下面命令。
# rpm -ivh --test Linux-1.4-6.i368.rpm
41
如果需要为软件包指定安装目录:要加参数 (--relocate) ,在默认情况下,通常可执行程序都放在安装目录下的 bin或者 sbin 目录中。
# rpm -ivh --relocate /=/usr/local/newlinux Linux-1.4-6.i368.rpm
在卸载某个安装过的软件时,需首先查出删除的 rpm 包,然后执行 rpm -e < 软件包名 >命令来卸载。
# rpm -e newlinux
#卸载 newlinux ,如果有其它的 rpm依赖于该 rpm 包,系统会出现警告。如果一定要卸载,可以用选项 --nodeps 忽略依赖关系。但最好不要这么做。
42
rpm管理包管理器还支持网络的安装和查询。 格式: rpm [ 选项 ] rpm 包的 http 或者 ftp 的地址例如,想通过 Fedora Core 4.0 的一个镜像查询、安装软件包。
# rpm -qpi http://mirrors.kernel.org/.../RPMS/rsh-0.17-29.rpm
#查询# rpm -ivh http://mirrors.kernel.org/.../RPMS/rsh-
0.17-29.rpm
# 安装
43
实验二 开发环境的建立4.1 烧写 XsBase255 的 BootLoader 光盘拷贝:打开终端,将光盘中所有文件( 包括目录pxa255 )拷贝到 Filestystem (即根目录“ /” )中。[root$localhost /]# mount /dev/cdrom /mnt/cdrom
[root$localhost /]# cp –a /mnt/cdrom/* /
创建 Bootp :安装 bootp rpm 包, bootp rpm 在提供的光盘的 PRM 目录里。[root$localhost root]# cd /pxa255/RPM
[root$localhost RPM]# rpm –i bootp-2.4.3-7.i386.rpm
44
新建 bootp 文件 在 /etc/xinetd.d 目录下新建 bootp 文件并按如下配置。
/etc/xinetd.d/bootp
service bootps{ disable = no socket_type = dgram protocol = udp wait = yes user = root server = /usr/sbin/bootpd}
也可通过拷贝方式获取 bootp 、 bootptab 、 tftp三个配置文件#cd /pxa255/Net_Config#cp bootp /etc/xinetd.d#cp tftp /etc/xinetd.d#cp bootptab /etc
45
inetd的设置 inetd 的设置文件是 /etc/inetd.conf 。在启动时, inetd 从这一文件读入设置信息。每 1 行描述 1 个服务的设置,各字段用分割符和空格分开。带 #(注释 ) 的行不予执行。以下表示行的格式。
service_name :描述 telnet 等服务名称。服务名称和端口号一览表登录在 /etc/services 中。socket_type :描述 stream(流型 ) 和 dgram( 数据型 ) 等接口 (socket) 类型 ( 种类 ) 。protocol :描述 tcp 和 udp 等,从登录在 /etc/protocols 中找出的相对应的程序。flag :描述 wait 或 nowait 。仅在当 socket_type 为 dgram( 数据型 )时才有意义,到一个处理结束之前,等待下一个要求 (wait) ,或者在有要求时不予等待 (nowait) ,指示接受。user :描述 root 和 nobody 等以什么样的用户权限启动服务。server_path :以全路径描述启动的服务器程序。args :描述在 server_path 中记述的服务器程序的启动名和参数 ( 选项 )
<service_name> <socket_type> <protocol> <flag> <user> <server_path> <args>
46
新建 bootptab 文件 在 /etc 下新建 bootptab 文件并按如下配置。
/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)
47
重启 xinetd
在主机平台重启 xinetd 。
创建 tftp
安装 tftp rpm
[root$localhost root ]# /etc/rc.d/init.d/xinetd restartStopping xinetd : [ OK ]Starting xinetd : [ OK ]
[root$localhost root]# cd /pxa255/RPM[root$localhost RPM]# rpm –i tftp-server-0.17-9.i386.rpm
48
新建 tftp 文件 在 /etc/xinetd.d 下新建 tftp 文件并按如下配置。
/etc/xinetd.d/tftp
service tftp{ disable = no socket_type = dgram protocol = udp wait = yes user = root server = /usr/sbin/in.tftpd server_args = -s /tftpboot}
如完成上述步骤后 tftp还不工作,请检查防火墙是否存在。关闭防火墙使用 lokkit命令。
49
[root$localhost /]# mkdir tftpboot[root$localhost /]#cd /pxa255/Image[root$localhost Image]#cp ./* /tftpboot
[root$localhost pxa255 ]#cd Jflash-xsBase255[root$localhost Jflash-xsBase255]#vi Makefile查看文中所有目标文件名为 Jflash-XHYPER255 是否已改为 Jflash-XSBase255 ,注意:头文件名不要修改
[root$localhost Jflash-xsBase255]#make生成 Jflash-XSBase255 (下载 PXA255 的 Jflash 工具),可用 ls命令查看[root$localhost Jflash-xsBase255]#cp Jflash-XSBase255 /tftpboot
50
正确连线已经存在名为 x-boot255 的 Boot Loader Image ,用于XSBase255 目标机。 用 JTAG 线正确连接宿主机和目标机,开启目标机。 利用 JTAG 烧写 BootLoader
正常运行结果如下图所示。
#cd /tftboot
[root$localhost tftpboot ]#ls
Jflash-XSBase255 rootfs.img x-boot255 zImage
[root$localhost tftpboot ]#./Jflash-XSBase255 x-boot255
51
52
4.2 、使用 Minicom 实现串口通信
Minicom 的安装 安装 linux 时基本上会安装 minicom 。安装与否可用下面的指令来确认。 #rpm -qa | grep minicom
minicom-2.00.0-18.1
其中开关 q 代表 question , a 代表 all 。可以通过这条指令打印目前安装的 rpm 包的信息。并通过管道执行 grep 指令。上面的提示信息中表示,现在安装上的 Minicom版本是 2.00.0-18.1 。
53
4.2 、使用 Minicom 实现串口通信
将串口线正确连接好。
Minicom 的设置 minicom -s命令直接从命令行进入配置菜单。不带参数的 minicom命令进入 minicom 后,在命令模式中配置。
[root@localhost home]# minicom -s
54
之后出现 Minicom 设置窗口,设置画面中选择Serial port setup(串行端口设置)+------[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 |+---------------------------------+
55
串口设置窗口
+--------------------------------------------------+| 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? |+---------------------------------------------------+
56
按“ A” 进行串口设备的选择。若目标机接在 COM1 上,则输入 /d
ev/ttyS0;若接在 COM2 上则输入/dev/ttyS1 。按回车结束设置。 按“ E” 进行波特率的设置,需要设置 Speed 为 115200 , Parity
bit 为 No , Data bit 为 8 , Sto
p bits 为 1 。按回车结束设置。 按“ F” 设置硬件流量控制。设置Hardware Flow Control 为 No 。
波特率设置窗口
57
串口设置完成后的结果为
58
串口设置完成后按“ Esc”返回Minicom 设置窗口,选择 Save setup as dfl (保存设置为默认方式),最后选择“ Esc” 。这样就会退出设置窗口,回到 Minicom 主画面。 正常设置后,重新上电开启目标机,此时在 Minicom窗口上看到启动信息,按任意键暂停,将进入 bootloader 命令模式,此时出现 XSBASE> 提示符。
退出Minicom窗口的快捷键: Ctrl+A 或 q
59
4.3 、建立开发环境
( 1 )在宿主机上安装 xinetd
为了使用 BOOTP ,首先要在宿主机上安装 xinetd 。 首先 rpm命令查询 xinetd rpm 包的安装信息:
[root@localhost root]# rpm –qa | grep xinetd
说明宿主机上已经安装了 xinetd ,版本号为 2.3.10-6
最后启动 xinetd:
[root@XSBase root]# /etc/rc.d/init.d/xinetd start
60
( 2 )在宿主机上安装 BOOTP 使用 rpm命令查询是否已经安装 BOOTP rpm 包, BOOTP 安装完毕之后会生成 /usr/sbin/bootpd 文件,这个文件需要被 xinetd 程序运行,需要创建 /etc/xinetd.d/bootp文件并进行设置。
61
( 3 ) bootptab 文件的生成和设置 字段 ht表示 Hardware Type ,因为使用 10Mb Ethernet ,所以设置为 1 ( Ethernet );ha表示 Hardware Address ,是发送 bootp请求的目标机的 Mac 地址;ip表示分配给目标机的 IP 地址;sm表示 Subnet Mask ,应与宿主机相同。
注意:宿主机的网段和分配给目标机的网段要一致。比如,宿主机 IP : 192.168.0.x 目标机 IP : 192.168.0.195
62
使用 ifconfig命令可以查看宿主机的 IP 地址和硬件的 MAC 地址。如果宿主机的网段和分配给目标机的网段不一致,可以采用两种方法更改:修改宿主机 IP 地址
系统工具——网络——双击地址,修改后重新启动计算机修改目标机平台的 IP 地址
#vi /etc/bootptab
修改 ip值后按 ESC ,输入“ :wq!” ,保存退出。修改 ha ,与 bootp命令返回来的 MAC 地址要保持一致。
在 XSBASE> 提示符下输入 bootp ,可以查看 our Ethernet address ,双击选中的地址后在 bootptab 文件中单击鼠标中间键直接将地址拷贝过来。
63
( 4 )在目标机 BootLoader 上启动 Bootp 正确连接网线,启动目标机 Boot Loader ,通过 Minicom 建立宿主机和目标机之间的串口通信。 重启宿主机上的 xinetd :
在目标机上运行 bootp ,可以获取 IP 地址。[root@localhost root]# /etc/rc.d/init.d/xinetd restart
64
( 5 )在宿主机上搭建 TFTP服务确认宿主机上正确安装了 tftp rpm 包后,会生成 /etc/xinetd.d/tftp 文件。如同 bootp 一样, tftp也是被 xinetd 执行的,并需要对 /etc/xinetd.d/tftp 文件进行如下修改。
65
通常会建立一个 /tftpboot 目录,并将 server_args 设置为 /tftpboot (也可以设置为其他目录),这样,只有宿主机该路径下的文件才能被传送,以减少安全隐患。需要用 tftp 下载到目标机的内核和文件系统镜像需要放在这个指定的路径下。
#cd /tftpboot#lsJflash-xsBase255 rootfs.img x-boot255 zImage
66
( 6 )在目标机上用 TFTP 下载镜像文件使用 TFTP命令下载 kernel
复制到 flash 中。
下载 Filesystem
XSBASE> tftp zImage kernel
XSBASE> flash kernel
XSBASE> tftp rootfs.img root
XSBASE> flash root
67
( 7 )在 XSBASE> 提示符下输入 reboot ,重新启动目标板,在 minicom 中出现的 XSBASE Login: 输入 root ,目标板将出现下载的镜像文件,即剪裁过的系统的界面。
68
整体流程正确连线烧写 Bootloader
使用 Minicom 实现串口通信建立开发环境
在宿主机上安装 xinetd
在宿主机上安装 BOOTP
查看宿主机 IP 和 MAC 地址设置 BOOTPTAB 文件,使目标机和宿主机在一个网段在目标机 Bootloader 上启动 BOOTP
在宿主机上搭建 TFTP服务
69
熟悉交叉编译环境和开发工具编译交叉编译器Helloworld 实验