基于linux的嵌入式软件开发课件.ppt
《基于linux的嵌入式软件开发课件.ppt》由会员分享,可在线阅读,更多相关《基于linux的嵌入式软件开发课件.ppt(182页珍藏版)》请在三一办公上搜索。
1、1,重点回顾,TCP通信过程,2,重点回顾,UDP通信过程,15:56,3,第三章 基于Linux的嵌入式软件开发,3.1 嵌入式软件结构3.2 嵌入式软件开发流程3.3 嵌入式linux开发环境3.4 嵌入式系统引导代码3.5 linux内核结构及移植3.6 嵌入式文件系统及移植3.7 linux设备驱动概述 3.8 设备驱动程序接口3.9 linux设备驱动开发流程,15:56,4,3.1 嵌入式软件结构,3.1.1 嵌入式软件体系结构3.1.2 基于Linux的嵌入式软件,15:56,5,3.1.1 嵌入式软件体系结构,15:56,6,1. 设备驱动层,设备驱动层是嵌入式系统中必不可少的
2、重要部分,使用任何外部设备都需要有相应驱动程序的支持,它为上层软件提供了设备的操作接口。上层软件不用理会设备的具体内部操作,只需调用驱动层程序提供的接口即可。驱动层一般包括硬件抽象层HAL、板级支持包BSP和设备驱动程序。,15:56,7,2. 实时操作系统RTOS,对于使用操作系统的嵌入式系统而言,操作系统一般以内核映像的形式下载到目标系统中。以Linux为例,在系统开发完成之后,将整个操作系统部分做成内核映像文件,与文件系统一起传送到目标系统中;然后通过BootLoader指定地址运行Linux内核,启动已经下载好的嵌入式Linux系统;再通过操作系统解开文件系统,运行应用程序。整个嵌入式
3、系统与通用操作系统类似,功能比不带有操作系统的嵌入式系统强大了很多。,15:56,8,3. 中间件层,中间件(middleware)是基础软件的一大类,属于可复用软件的范畴。顾名思义,中间件处于操作系统软件与用户的应用软件的中间。中间件在操作系统、网络和数据库之上,应用软件的下层,总的作用是为处于自己上层的应用软件提供运行与开发的环境,帮助用户灵活、高效地开发和集成复杂的应用软件。,15:56,9,4. 应用程序,实际的嵌入式系统应用软件建立在系统的主任务(Main Task)基础之上。用户应用程序主要通过调用系统的API函数对系统进行操作,完成用户应用功能开发。在用户的应用程序中,也可创建用
4、户自己的任务。任务之间的协调主要依赖于系统的消息队。,15:56,10,3.1.2 基于Linux的嵌入式软件,基于嵌入式Linux的软件结构如图所示,在硬件之上的是引导程序BootLoader,然后是Linux内核,最上层是应用程序。,15:56,11,1. BootLoader,引导装载程序通常是在任何硬件上执行的第一段代码。在象台式机这样的常规系统中,通常将引导装载程序装入主引导记录(Master Boot Record,(MBR))中,或者装入 Linux 驻留的磁盘的第一个扇区中。通常,在台式机或其它系统上,BIOS 将控制移交给引导装载程序。而在嵌入式系统中,通常并没有像BIOS那
5、样的固件程序,因此整个系统的加载启动任务就完全由BootLoader来完成。,15:56,12,1. BootLoader,通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。常见的BootLoader有uboot、vivi等。引导程序的开发主要是做一些移植工作。,15:56,13,2. 内核,Linux 内核的开发主要包括Linux内核的定制、裁剪等工作。在嵌入式开发中经常要面对设备驱动程序的开发,嵌入式系统通常有许多设备用于与用户交互,象触摸屏、小键盘、滚动轮、传感器、RS232 接口、LCD
6、等等。除了这些设备外,还有许多其它专用设备,包括闪存、USB、GSM 等。内核通过所有这些设备各自的设备驱动程序来控制它们,包括 GUI 用户应用程序也通过访问这些驱动程序来访问设备。,15:56,14,3. 应用程序,对于嵌入式Linux的应用,大多数的应用并不需要图形界面,比如交换机、路由器、嵌入式网关以及服务器等等。但是,随着消费类电子的普及,越来越多的嵌入式产品如多媒体播放、手机等手持设备需要图形用户界面(或称 GUI)的支持。因此基于GUI的应用程序的开发越来越重要。目前比较流行的GUI平台有QtEmbedded、紧缩的X Windows系统、MicroWindows以及MiniGU
7、I系统。,15:56,15,3.2 嵌入式软件开发流程,3.2.1 嵌入式Linux设计概述3.2.2 基于开发板的二次开发 3.2.3 基于linux的嵌入式软件开发流程,15:56,16,3.2.1 嵌入式Linux设计概述,15:56,17,3.2.1 嵌入式Linux设计概述,嵌入式系统的软件开发采用一种交叉编译调试的方式。交叉编译调试环境建立在宿主机(即一台PC机)上,对应的开发平台叫做目标板。运行 Linux 的 PC(宿主机)开发时使用宿主机上的交叉编译、汇编及连接工具形成可执行的二进制代码,(这种可执行代码并不能在宿主机上执行,而只能在目标板上执行。)然后把可执行文件下载到目标
8、机上运行。,15:56,18,宿主机(host)是编辑和编译程序的平台,一般是基于 X86 的 PC 机,通常也称为主机。而目标机(target)是用户开发的系统,通常都是非 X86 平台。Host 编译得到的可执行代码在目标机target 上运行。,3.2.1 嵌入式Linux设计概述,15:56,19,3.2.2 基于开发板的二次开发,所谓二次开发是利用现成的开发板进行开发,不同于通用计算机和工作站上的软件开发工程,一个嵌入式软件的开发过程具有很多特点和不确定性。其中最重要的一点是软件跟硬件的紧密耦合特性。由于嵌入式系统的灵活性和多样性,这样就给软件设计人员带来了极大地困难。第一,在软件设
9、计过程中过多地考虑硬件,给开发和调试都带来了很多不便;第二,如果所有的软件工作都需要在硬件平台就绪之后进行,自然就延长了整个的系统开发周期。这些都是应该从方法上加以改进和避免的问题。为了解决这个问题,通常的做法是基于某种开发板做二次开发,从这个角度看,硬件开发所占的比重不到20%,而软件开发的比重占到了80%。,15:56,20,3.2.3 基于linux的嵌入式软件开发流程,1.建立开发环境 2.配置开发主机3.建立引导装载程序BOOTLOADER 4.移植Linux 操作系统 5.建立根文件系统 6.建立应用程序的文件系统 7.开发应用程序 8.烧写内核、根文件系统、应用程序9.发布产品,
10、15:56,21,3.4 嵌入式系统引导代码,3.4.1 Bootloader简介3.4.2 常用的Bootloader3.4.3 Bootloader基本原理3.4.4 Bootloader移植实例一:U_Boot3.4.5 Bootloader移植实例二:vivi,15:56,22,3.4.1 Bootloader简介,1. Bootloader的作用2. Bootloader操作模式,15:56,23,1. Bootloader的作用,Boot Loader 就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带
11、到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。,15:56,24,2. Bootloader操作模式,大多数 Boot Loader 都包含两种不同的操作模式:“启动加载”模式和“下载”模式,这种区别仅对于开发人员才有意义。但从最终用户的角度看,Boot Loader 的作用就是用来加载操作系统,而并不存在所谓的启动加载模式与下载工作模式的区别。,15:56,25,2. Bootloader操作模式,启动加载(Boot loading)模式:这种模式也称为“自主”(Autonomous)模式。也即 Boot Loader 从目标机上的某个固态存储设备上将操作系统加载到 RAM
12、中运行,整个过程并没有用户的介入。这种模式是 Boot Loader 的正常工作模式,因此在嵌入式产品发布的时侯,Boot Loader 显然必须工作在这种模式下。,15:56,26,2. Bootloader操作模式,下载(Downloading)模式:在这种模式下,目标机上的 Boot Loader 将通过串口连接或网络连接等通信手段从主机(Host)下载文件到目标机的 RAM 中,然后再被 Boot Loader 写到目标机上的FLASH 类固态存储设备中。工作于这种模式下的 Boot Loader 通常都会向它的终端用户提供一个简单的命令行接口。因此产品开发时通常使用这种模式。,15:
13、56,27,3.4.2 常用的Bootloader,1. ARMBootARMBoot是一个bootloader,是为基于ARM或者StrongARM CPU的嵌入式系统所设计的。它支持多种类型的Flash;允许映像文件经由bootp、tftp从网络传输;支持从串口线下载S-record或者binary文件;允许内存的显示及修改;支持jffs2文件系统等。ARMBoot源码公开,可以在http:/,15:56,28,3.4.2 常用的Bootloader,2. PPCBootPPCBoot是德国DENX小组开发的用于多种嵌入式CPU的Bootloader引导程序,主要由德国的工程师Wolfga
14、ng Denk和Intemet上的一群自由开发人员对其进行维护和开发。支持PowerPC、ARM、MIPS、m68K等多种处理器平台,易于裁剪和调试。PPCBoot遵循GPL(通用公共许可)公约,完全开放源代码。PPCBoot源代码可以在sourceforge网站的社区服务器中获得,它的项目主页是http:/,15:56,29,3.4.2 常用的Bootloader,3. U-BootU-Boot是sourceforge网站上的一个开放源代码的项目。它可对powerpc、MPC5xx、MPC8xx、MPC82xx、MPC7xx、MPC74xx、ARM(ARM7、ARM9、StrongARM、X
15、scale)、MIPS、X86等处理器提供支持,支持的嵌入式操作系统有linux、Vx-work、NetBSD、QNX、RTEMS、ARTOS、LynxOS等,主要用来开发嵌入式系统初始化代码bootloader。软件的主站点是http:/,15:56,30,3.4.2 常用的Bootloader,4. RedBootRedBoot是一个专门为嵌入式系统定制的开发工具,最初由Redhat开发,是嵌入式操作系统eCos的一个最小版本,现在交由自由软件组织FSF管理,遵循GPL的发布协议。集Bootloader、调试、Flash烧写于一体。支持串口、网络下载,执行嵌入式应用程序。既可以用在产品的开
16、发阶段(调试功能),也可以用在最终的产品上(Flash更新、网络启动)。,15:56,31,3.4.2 常用的Bootloader,5.BlobBlob是Boot Loader Object的缩写,是一款功能强大的Bootloader。它遵循GPL,源泉代码完全开放。Blob既可以用来简单的调试,也可以启动Linux kernel。Blob最初是Jan-Derk Bakker和Erik Mouw为一块名为LART(Linux Advanced Radio Terminal)的板子写的,该板使用的处理器是StrongARM SA-1100。现在Blob已经被移植到了很多CPU上,包括S3C44B
17、0。,15:56,32,3.4.2 常用的Bootloader,6.ViViVivi 是韩国mizi 公司开发的bootloader, 适用于ARM9处理器。 Vivi有两种工作模式:启动加载模式和下载模式。启动加载模式可以在一段时间后(这个时间可更改)自行启动linux内核,这时vivi的默认模式。在下载模式下,vivi为用户提供一个命令行接口,通过接口可以使用vivi提供的一些命令。,15:56,33,3.4.3 Bootloader基本原理,同时装有 Boot Loader、内核的启动参数、内核映像和根文件系统映像的固态存储设备的典型空间分配结构图。,15:56,34,在嵌入式世界里建立
18、一个通用的 Boot Loader 几乎是不可能的。尽管如此,我们仍然可以对 Boot Loader 归纳出一些通用的概念来,以指导用户特定的 Boot Loader 设计与实现。大多数 Boot Loader 都分为 stage1 和 stage2 两大部分。依赖于 CPU 体系结构的代码,比如设备初始化代码等,通常都放在 stage1 中,而且通常都用汇编语言来实现,以达到短小精悍的目的。而 stage2 则通常用C语言来实现,这样可以实现给复杂的功能,而且代码会具有更好的可读性和可移植性。,3.4.3 Bootloader基本原理,15:56,35,BootLoader的启动流程,Boo
19、t Loader的第一阶段通常包括以下步骤(以执行的先后顺序):硬件设备初始化。为加载 Boot Loader 的 stage2 准备 RAM 空间。 拷贝 Boot Loader 的 stage2 到 RAM 空间中。 设置好堆栈。 跳转到 stage2 的 C 入口点。,15:56,36,BootLoader的启动流程,Boot Loader的第二阶段通常包括以下步骤(以执行的先后顺序):初始化本阶段要使用到的硬件设备。检测系统内存映射(memory map)。 将 kernel 映像和根文件系统映像从 flash 上读到 RAM 空间中。 为内核设置启动参数。 调用内核。,15:56,3
20、7,第一阶段:Boot Loader 的 stage1,1. 基本的硬件初始化这是 Boot Loader 一开始就执行的操作,其目的是为 stage2 的执行以及随后的 kernel 的执行准备好一些基本的硬件环境。它通常包括以下步骤(以执行的先后顺序): (1)屏蔽所有的中断。为中断提供服务通常是 OS 设备驱动程序的责任,因此在 Boot Loader 的执行全过程中可以不必响应任何中断。中断屏蔽可以通过写 CPU 的中断屏蔽寄存器或状态寄存器(比如 ARM 的 CPSR 寄存器)来完成。,15:56,38,第一阶段:Boot Loader 的 stage1,(2)设置 CPU 的速度和
21、时钟频率。(3)RAM 初始化。包括正确地设置系统的内存控制器的功能寄存器以及各内存控制寄存器等。 (4)初始化 LED。典型地,通过 GPIO 来驱动 LED,其目的是表明系统的状态是 OK 还是 Error。如果板子上没有 LED,那么也可以通过初始化 UART 向串口打印 Boot Loader 的 Logo 字符信息来完成这一点。 (5)关闭 CPU 内部指令/数据 cache。,15:56,39,第一阶段:Boot Loader 的 stage1,2. 为加载 stage2 准备 RAM 空间为了后面的叙述方便,这里把所安排的 RAM 空间范围的大小记为:stage2_size(字节
22、),把起始地址和终止地址分别记为:stage2_start 和 stage2_end(这两个地址均以 4 字节边界对齐)。因此: stage2_endstage2_startstage2_size 另外,还必须确保所安排的地址范围的的确确是可读写的 RAM 空间,因此,必须对你所安排的地址范围进行测试。,15:56,40,第一阶段:Boot Loader 的 stage1,3. 拷贝 stage2 到 RAM 中 拷贝时要确定两点:(1) stage2 的可执行映象在固态存储设备的存放起始地址和终止地址;(2) RAM 空间的起始地址。,15:56,41,第一阶段:Boot Loader 的
23、stage1,4. 设置堆栈指针sp 堆栈指针的设置是为了执行 C 语言代码作好准备。通常我们可以把 sp 的值设置为(stage2_end-4),也即在上面所安排的那个 1MB 的 RAM 空间的最顶端(堆栈向下生长)。 此外,在设置堆栈指针 sp 之前,也可以关闭 led 灯,以提示用户我们准备跳转到 stage2。经过上述这些执行步骤后,系统的物理内存布局应该如下图,15:56,42,第一阶段:Boot Loader 的 stage1,15:56,43,第一阶段:Boot Loader 的 stage1,5. 跳转到stage2的C入口点 在上述一切都就绪后,就可以跳转到 Boot Lo
24、ader 的 stage2 去执行了。比如,在 ARM 系统中,这可以通过修改 PC 寄存器为合适的地址来实现。,15:56,44,第二阶段:Boot Loader 的 stage2,1. 初始化本阶段要使用到的硬件设备 这通常包括:(1)初始化至少一个串口,以便和终端用户进行 I/O 输出信息;(2)初始化计时器等。在初始化这些设备之前,也可以重新把 LED 灯点亮,以表明我们已经进入 main() 函数执行。设备初始化完成后,可以输出一些打印信息,程序名字字符串、版本号等。,15:56,45,第二阶段:Boot Loader 的 stage2,2. 检测系统的内存映射(memory map
25、) 所谓内存映射就是指在整个 4GB 物理地址空间中有哪些地址范围被分配用来寻址系统的 RAM 单元。比如,在 SA-1100 CPU 中,从 0 xC000,0000 开始的 512M 地址空间被用作系统的 RAM 地址空间,而在 Samsung S3C44B0X CPU 中,从 0 x0c00,0000 到 0 x1000,0000 之间的 64M 地址空间被用作系统的 RAM 地址空间。虽然 CPU 通常预留出一大段足够的地址空间给系统 RAM,但是在搭建具体的嵌入式系统时却不一定会实现 CPU 预留的全部 RAM 地址空间。,15:56,46,第二阶段:Boot Loader 的 st
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 linux 嵌入式 软件 开发 课件
链接地址:https://www.31ppt.com/p-1572046.html