搭建嵌入式Linux开发环境.ppt
嵌入式应用程序设计第1章 搭建嵌入式linux开发环境,2,第1章 搭建嵌入式Linux开发环境第2章 嵌入式文件I/O编程第3章 嵌入式Linux多任务编程第4章 嵌入式Linux进程间通行第5章 嵌入式Linux多线程编程第6章 嵌入式Linux网络编程第7章 Qt图形编程第8章 嵌入式Linux设备驱动编程第9章 Qt聊天项目设计,课程安排:,3,1.1 搭建嵌入式Linux交叉开发环境1.2 Bootloader1.3 Linux内核与移植1.4 嵌入式文件系统的构建1.5 小结1.6 思考与练习,本章课程:,4,1.1.1 嵌入式交叉编译环境搭建交叉编译环境的意义如何搭建嵌入式交叉编译环境嵌入式交叉编译环境包括哪些内容,1.1 搭建嵌入式Linux开发环境,5,1.1.2 主机交叉开发环境的配置配置控制台程序Windows操作系统中有超级终端(HyperTerminal)工具;Linux/Unix操作系统有minicom(使用“minicom”命令启动该软件)等工具,1.1 嵌入式系统概述,超级终端配置,minicom配置,6,1.1.2 主机交叉开发环境的配置配置TFTP服务 tftp是一个传输文件的简单协议,它基于UDP协议而实现。此协议设计的时候是进行小文件传输的,1.1 嵌入式系统概述,7,1.1.2 主机交叉开发环境的配置Linux下TFTP服务配置 tftp是一个传输文件的简单协议,它基于UDP协议而实现。此协议设计的时候是进行小文件传输的 vim/etc/xinetd.d/tftpservice tftp socket_type=dgram protocol=udp wait=yes user=root server=/usr/sbin/in.tftpd server_args=-s/tftpboot disable=no per_source=11 cps=100 2 flags=IPv4,1.1 嵌入式系统概述,8,1.1.2 主机交叉开发环境的配置启动TFTP服务$/etc/init.d/xinetd start 关闭TFTP服务$/etc/init.d/xinetd stop重启TFTP服务$/etc/init.d/xinetd restart查看TFTP状态$netstat au|grep tftpProto Recv-Q Send-Q Local Address Foreign Address Stateudp 0 0*:tftp*:*,1.1 嵌入式系统概述,9,1.1.2 主机交叉开发环境的配置Windows下TFTP服务配置在Windows下配置tftp服务需要安装使用tftp服务器软件,常见的可使用tftpd32,网上有很多下载该软件的地方,读者可以自行下载。要注意的是,该软件是tftp的服务器端,而目标板上则是tftp的客户端,1.1 嵌入式系统概述,10,1.1.2 主机交叉开发环境的配置NFS文件系统NFS为Network FileSystem的简称,最早是由Sun公司提出发展起来的,其目的就是让不同的机器、不同的操作系统之间可以彼此共享文件。,1.1 嵌入式系统概述,11,1.1.2 主机交叉开发环境的配置NFS配置配置文件:/etc/exports配置文件每一行格式:共享的目录 客户端主机名称或IP(参数1,参数2)NFS配置文件常用参数:NFS配置文件举例:cat/etc/exports/home/david/project*(rw,sync,no_root_squash),1.1 嵌入式系统概述,12,1.1.2 主机交叉开发环境的配置NFS服务启动设置NFS服务在每次系统引导时自动开启:#/sbin/chkconfig nfs on(在Ubuntu中应该输入/sbin/chkconfig nfs-kernel-server on),1.1 嵌入式系统概述,13,Bootloader是什么?Bootloader是在操作系统运行之前执行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映像表,从而建立适当的系统软硬件环境,为最终调用操作系统内核做好准备。,1.2 Bootloader,14,1.2.1 Bootloader的种类,1.2 Bootloader,15,1.2.2 U-Boot的编译和使用什么是U-Boot 最早,DENX软件工程中心的Wolfgang Denk基于8xxrom的源码创建了PPCBOOT工程,并且不断添加处理器的支持。后来,Sysgo Gmbh把PPCBOOT移植到ARM平台上,创建了ARMBOOT工程。然后以PPCBOOT工程和ARMBOOT工程为基础,创建了U-Boot工程。,1.2 Bootloader,16,1.2.2 U-Boot的编译和使用U-Boot目录结构 U-Boot目录可以分为三类:与处理器体系结构或者开发板硬件直接相关。一些通用的函数或驱动。U-Boot的应用程序、工具或者文件。,1.2 Bootloader,17,U-Boot目录结构,1.2 Bootloader,18,1.2.2 U-Boot的编译和使用 U-Boot的源码是通过gcc和Makefile组织编译的。顶层目录下的Makefile首先可以设置开发板的定义,然后递归地调用各级子目录下的Makefile,最后把编译过的程序链接成U-Boot映像。顶层目录下的 Makefile它负责u-boot整体配置编译。每一种开发板在Makefile都需要有板子配置的定义。配置u-boot:make smdk2410_config编译:make,1.2 Bootloader,19,1.2.2 U-Boot的编译和使用U-Boot生成镜像文件,1.2 Bootloader,20,1.2.2 U-Boot的编译和使用U-Boot工具,1.2 Bootloader,1.2 Bootloader,U-Boot命令介绍指令分类传输类、设置类、存储类、内存监控类、加载运行类Printenv 打印环境变量。Uboot printenvbaudrate=115200ipaddr=192.168.1.1ethaddr=12:34:56:78:9A:BCserverip,21,1.2 Bootloader,setenv 设置新的变量Uboot setenv myboard AT91RM9200DKUboot printenvbaudrate=115200ipaddr=192.168.1.1ethaddr=12:34:56:78:9A:BCserverip=192.168.1.5myboard=AT91RM9200DKEnvironment size:102/8188 bytessaveenv 将当前定义的所有的变量及其值存入flash中。,22,1.2 Bootloader,tftp 通过网络下载程序Uboot setenv ethaddr 12:34:56:78:9A:BCUboot setenv ipaddr 192.168.1.1Uboot setenv serverip 192.168.1.254Uboot tftp 20000000 application.binUboot tftp 30200000 zImageLoadb 通过串口Kermit协议下载二进制数据。,23,1.2 Bootloader,md 显示内存区的内容。mm 修改内存,地址自动递增。nm 修改内存,地址不自动递增。mw 填充内存。mtest 测试内存。cp 拷贝一块内存到另一块。cmp 比较两块内存区。mw 0 x32000000 ff 0 x10000,24,1.2 Bootloader,Protect 写保护操作protect on 1:0-3(就是对第一块FLASH的0-3扇区进行保护)protect off 1:0-3取消写保护erase 擦除扇区erase:删除FLASH的扇区erase 1:0-2(就是对每一块FLASH的0-2扇区进行删除),25,1.2 Bootloader,run 执行设置好的脚本Uboot setenv flashit tftp 20000000 mycode.bin;erase 10020000 1002FFFF;cp.b 20000000 10020000 8000Uboot saveenvUboot run flashitbootcmd 保留的环境变量如果定义了该变量,在autoboot模式下,将会执行该脚本的内容。,26,1.2 Bootloader,go 执行内存中的二进制代码,一个简单的跳转到指定地址bootm 执行内存中的二进制代码要求二进制代码为制定格式的。通常为mkimage处理过的二进制文件。启动Uboot工具制作的压缩Linux内核bootp 通过网络启动,需要提前设置好硬件地址。,27,1.2 Bootloader,usb reset 复位(rescan)USB 控制器usb stop f-停止USB usb tree-显示USB 设备树usb info dev 显示可用的USB设备usb storage-显示USB存储设备详细信息usb dev dev-show or set current USB storage deviceusb part dev-print partition table of one or all USB storage devicesusb read addr blk#cnt-read cnt blocks starting at block blk#to memory address addr,28,1.2 Bootloader,nand info:显示NAND 设备nand device dev:显示或设置当前设备nand bad 显示坏块nand read.jffs2s addr off sizenand write.jffs2 addr off sizenand erase clean off size nand read.oob addr off sizenand write.oob addr off size,29,1.2 Bootloader,nfsnfs 32000000 192.168.0.2:aa.txt把中的NFS文件系统中的aa.txt 读入内存0 x32000000处。,30,1.2 Bootloader,1.2.3 U-Boot移植在顶层Makefile中为开发板添加新的配置选项创建一个新目录存放开发板相关的代码,并且添加新文件 为开发板添加新的配置文件 配置开发板 编译U-Boot 添加驱动或者功能选项 调试U-Boot源代码,直到U-Boot在开发板上能够正常启动,31,1.3 Linux内核,Linux内核主要功能进程管理内存管理文件管理设备管理网络管理,32,1.3 Linux内核,1.3.1 Linux内核结构,33,1.3 Linux内核,1.3.2 Linux配置与编译编译内核之前要先配置。为了正确、合理地设置内核编译配置选项,从而只编译系统需要的功能的代码,一般主要有下面4个考虑。尺寸小节省内存减少漏洞动态加载模块,34,1.3 Linux内核,1.3.2 Linux配置与编译编译内核的步骤:下载内核源码 修改内核目录树根下的的Makefile,指明交叉编译器 设置环境变量 配置内核产生.config文件 输入内核配置命令(make menuconfig),进行内核选项的选择 编译内核下载Linux内核,35,1.4 嵌入式文件系统的构建,在嵌入式Linux中,busybox是构造文件系统最常用的软件工具包,它被非常形象地称为嵌入式Linux系统中的“瑞士军刀”,因为它将许多常用的Linux命令和工具结合到了一个单独的可执行程序(busybox)中。虽然与相应的GNU工具比较起来,busybox所提供的功能和参数略少,但在比较小的系统(例如启动盘)或者嵌入式系统中已经足够了,36,1.4 嵌入式文件系统的构建,使用busybox构建文件根文件系统的步骤下载busybox源码并进行配置编译并安装busybox创建系统必须目录,完善文件系统创建系统必须文件创建cramfs文件系统镜像文件,37,38,如何搭建嵌入式开发环境Bootloader的概念以及编译和移植的方法内核的概念机编译和移植的方法文件 系统的构建,1.5 小结,39,在读者的主机上搭建交叉编译环境,并用交叉编译器编译hello.c程序。移植与编译FS2410目标板平台的U-Boot、内核。用Busybox或者已做好的文件系统创建(或重建)新的文件系统,而且把编译好的hello程序复制到该文件系统中去。在主机上安装和配置minicom、tftp、nfs等应用程序和服务器,并通过这些软件进行嵌入式系统的应用程序开发。,1.6 思考与练习,40,