- Bootloader引导
- 嵌入式系统知识
- 几种常见的嵌入式系统
- VxWorks
- Windows
- 嵌入式Linux
- uC/OS-II
- 其他(ecos)
- 体系结构与内存映射
- 硬件平台(CPU、SDRAM等)→bootloader(引导装载器)→Linux内核→根文件系统→用户应用程序
- bootloader是一段可执行程序,完成的主要功能是将可执行文件(一般是操作系统)搬移到内存中,然后将控制权交给这段可执行文件(操作系统)
- bootloader的工作模式
- 下载模式
- 启动加载模式
- bootloader的烧写
- bootloader可以配置系统
- bootloader可以实现自烧写,但系统中没有bootloader时——JTAG烧写
- bootloader启动流程
- 1、依赖于CPU体系结构的代码,主要用汇编来实现
- 2、通常用C语言来实现,这样可以实现复杂的功能,而且具有更好的可读性和可移植性
- 几种常见的嵌入式系统
- bootloader Stage1代码浅析
- 第一阶段的代码位于CPU/arm920t/start.S中依次完成以下功能
- 1、系统上电,进入svc模式
- 2、关闭看门狗,禁止所有中断
- 进行初级硬件初始化
- 将自身代码拷贝到SDRAM中
- 设置堆栈
- 清空bss段
- 跳转到C语言实现的stage2中
- 单一数据加载/存储指令
- 加载指令:LDR 目标寄存器,源地址
- 存储指令:STR 源寄存器,目标地址
- bic
- BIC指令
- BIC{条件}{S}目的寄存器,操作数1,操作数2
- BIC指令是位清除指令,用于清除操作数1的某些位,并把结果放到目的寄存器中
- BIC指令
- orr
- ORR指令
- ORR{条件}{S}目的寄存器,操作数1,操作数2
- ORR指令是逻辑或指令,用于在两个操作数上进行逻辑或运算,并把结果放置到目的寄存器中。该指令常用于设置操作数1的某些位
- ORR指令
- 第一阶段的代码位于CPU/arm920t/start.S中依次完成以下功能
- 嵌入式系统知识
- Bootloader的作用和步骤
- boot的目的
- 跳到C语言中
- 关闭看门狗,中断,MMU,CACHE
- 配置系统工作时钟
- 配置SDRAM的控制器(行地址数、列地址数、多少块,周期性的充电)
- 让sp指向可读可写的设备区间中,满足递减栈的规则SDRAM
- 用哪些模式,就要初始化哪些模式下的sp
- 每个模式值不能覆盖其他模式
- 代码搬移
- 执行速度问题,把程序从存储器(nor-flash)搬移到快速的内存
- 只把存储器的一部分代码执行出来,把存储器在其他位置上的代码搬到内存,对应存储器的控制器的初始化
- bl main
- 跳到C语言中
- loader的目的
- 执行应用逻辑,点灯、uart,load linux kernel
- boot的目的
- 工程搭建Makefile
- 通用的Makefile,支持SD卡启动和在uboot下直接运行在ram
- 程序运行时的地址不同
- DDR2:0x20000000
- SD:0x0
- SD 16KB,需要加一个头信息,校验
- RAM:不需要加头信息
- 程序运行时的地址不同
- 变量集合
- TARGET:DEP
- COMMAND
- 通用的Makefile,支持SD卡启动和在uboot下直接运行在ram
- 工程搭建链接脚本
- 概念
- 告诉链接器如何工作的一个文本文件
- 1.o2.o3.o→build
- 告诉链接器如何工作的一个文本文件
- 要素
- 哪一个.o放到代码段的起始位置
- 所有的.o放到哪个基
- Id-Ttext=xxx
- 代码段、数据段等等是不是连续
- 基本语法
- SECTIONS
- .text 代码段
- .rodata 只读数据段
- .data 数据段
- .bss 未初始化数据段
- SECTIONS
- 概念
- C代码点灯
- 找到模块对应的引脚说明将时钟打开
- 设置引脚功能
- 对寄存器进行编程