嵌入式系统软件设计
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2019/2/23
6
• BootLoader的启动一般分为两个阶段。阶 段一主要完成的是与CPU体系结构有关的 初始化,如设备的初始化。它一般用汇编 语言来实现。阶段二主要完成的是一些常 规的初始化,通常用C语言实现。
2019/2/23
7
• 我们按照U-Boot的启动流程介绍了各个阶 段主要完成的工作以及相应的一些示意代 码和程序框架。 • 对ARM9核处理器,U-boot启动流程主要体 现在三个文件上,即 • cpu/***/start.s • lib_arm/board.c • common/main.c。
2019/2/23
5
• 与普通PC的启动相比较,在嵌入式系统中 所说的BootLoader的功能与普通PC中的 BIOS以及OS BootLoader类似。与 Bootloader不同的是BIOS在装载OS系统的 同时,还传递一些参数设置(中断端口定 义、显存大小等),而Bootloader一般只简 单地装载系统。
2019/2/23
3
• PC的启动过程:在系统上电后由BIOS(一 段固件程序)进行POST(上电自检),在 分配资源过后,将硬盘MBR(主引导记录) 中的OS Boot Loader如LILO,或者GRUB) 载入内存,然后将控制权交给OS Boot Loader,将操作系统内核映象加载到内存 中,接着就跳转到内核的入口处去执行, 即启动操作系统。
来自百度文库
• _not_used:
• _irq: • _fiq:
.word not_used
.word irq .word fiq
•
……
• .align 5;为了指令对齐 • undefined_instruction: • ……
•
2019/2/23
bl
do_undefined_instruction
12
设置CPU模式 • ;设置CPU模式为SVC32模式,禁止IRQ和FIQ 中断 ,参考3.4.2节 • ;CPSR位 31 30 29 28 ……….. 7 6 5 4 3 2 1 0 • ; 1 1 0 1 0 0 1 1 • mrs r0,cpsr ;将cpsr 加载到r0中 • bic r0,r0,#0x1f ;将cpsr的低5 位清0 • orr r0,r0,#0xd3 ;将cpsr的低8 位设置为11010011 • msr cpsr,r0 ;将r0加 载到cpsr中
• 注:链接脚本文件的功能是将输入文件的各节映 射到输出文件中;换句话说,它将所有输入对象 文件都链接到单一的可执行文件中,将该可执行 文件的各节装入到指定地址处。
2019/2/23 9
设置异常向量
• 异常中断向量表是u-boot与操作系统内核发 生联系的关键地方之一。即使操作系统内 核已经得到处理器的运行控制权,一旦发 生中断,处理器还是会自动跳转到从0x0地 址开始的异常中断向量表中的某个位置 (依据中断类型)处读取指令运行。 • ARM9要求异常中断向量表必须设置在从0 地址开始,连续8×4字节的空间,分别是 复位、未定义指令错误、软件中断、预取 指令错误、数据存取错误、一个保留的中 断向量以及IRQ和FIQ。
2019/2/23 10
• b reset • ldr pc,_undefined_instruction;将标号_undefined_instruction的地 址加载到pc中。在该例中,_undefined_instruction处又放的是 • ;undefined_instruction的地址,这样经过一次中间转换, • ;当未定义指令错误到来时,实际上是将 • ;undefined_instruction处的地址加载到pc中,即运行的是 • ;undefined_instruction处的指令。 • ldr pc,_software_interrupt • ldr pc,_prefetch_abort • ldr pc,_data_abort • ldr pc,_not_used • ldr pc,_irq • ldr pc,_fiq
2019/2/23
4
• 而在嵌入式系统中,通常并没有像BIOS 那 样的固件程序(注,有的嵌入式 CPU 也会 内嵌一段短小的启动程序),因此整个系 统的加载启动任务就完全由 Boot Loader 来完成。一般在上电或者复位后,嵌入式 系统都会从一个固定的地址处开始执行。 这个固定地址一般由CPU生产厂商决定 (通常为0x0000_0000),在这个地址处安 排的通常就是系统的Boot -Loader程序。
GUI 协议 设备驱动 文件系统 操作系统层 板级支持包
初始化引导代码
2019/2/23
2
5.2初始化引导代码实例
• 初始化引导代码也称为引导加载程序,即 BootLoader。它是系统上电后运行的第一 段程序代码。通过这段代码,可以初始化 存储器空间的映射,从而将系统的软硬件 环境设置到一个合适的状态,以便为最终 调用操作系统内核准备好环境。
第五章 嵌入式系统软件设计
• 嵌入式系统作为一个完整的、独立的、能 够单独运行的系统。与传统的通用计算机 系统相比,它有许多独有的特点。这些特 点也产生了它与通用计算机系统的区别。 这些区别不仅表现在整个系统软件的结构 上,也体现在软件的开发方法上。
2019/2/23
1
5.1嵌入式软件结构及组成
用户应用软件高层 用户应用软件底层
2019/2/23
11
• _undefined_instruction:.word undefined_instruction;在存储器中预 留一个字的空间大小,并将标号undefined_instruction放到该空间中, 并用标号undefined_instruction表示这个预留的空间 • _software_interrupt: .word software_interrupt • _prefetch_abort: • _data_abort: .word prefetch_abort .word data_abort
2019/2/23
8
start.s文件 • 在start.s文件中通过如下语句来指定这个入口: • .globl _start • _start: • 因此,必须通知编译器以使其知道这个入口,该 工作可通过修改连接器脚本文件u-boot.lds 来完成。 u-boot.lds文件用来设置U-boot中各个目标文件的 连接地址。