怎样从 0 开始写 bootloader ?

20
1 怎怎怎 0 怎怎怎 bootloader 怎怎 怎怎 怎怎怎怎怎怎怎怎怎怎 怎怎怎怎怎怎怎怎怎怎 http:// www.akaedu.org

description

怎样从 0 开始写 bootloader ?. 李明 北京亚嵌教育研究中心 http://www.akaedu.org. 开场介绍. 本次课程讲什么? 从 0 开始写 bootloader 本次课程谁来讲? [email protected] 本次课程适合的听众是哪些人? 有时间在接下来 1 个月内开始动手实践的人 已经购买或者准备购买开发板的人. 今日主题. 从 0 开始写 bootloader 0( 零基础 ) 指的是什么? 学习过 C 语言 了解 ARM 体系结构和汇编语言 没有在开发板上做过软件开发 Bootloader 是什么? - PowerPoint PPT Presentation

Transcript of 怎样从 0 开始写 bootloader ?

Page 1: 怎样从 0 开始写 bootloader ?

1

怎样从 0 开始写 bootloader ?李明李明

北京亚嵌教育研究中心北京亚嵌教育研究中心http://www.akaedu.org

Page 2: 怎样从 0 开始写 bootloader ?

2

开场介绍 本次课程讲什么?

从 0 开始写 bootloader 本次课程谁来讲?

[email protected] 本次课程适合的听众是哪些人?

有时间在接下来 1 个月内开始动手实践的人 已经购买或者准备购买开发板的人

Page 3: 怎样从 0 开始写 bootloader ?

3

今日主题 从 0 开始写 bootloader

0( 零基础 ) 指的是什么? 学习过 C 语言 了解 ARM 体系结构和汇编语言 没有在开发板上做过软件开发

Bootloader 是什么? Boot: 能够初始化基本硬件 ( 时钟 , 存储 , 串口 ) Loader: 能够加载 , 运行 , 固化外部程序 ( 操作系统 )

Page 4: 怎样从 0 开始写 bootloader ?

4

学习动机 为什么会有 bootloader? 为什么我们要自己写 Bootloader?

移植一个别人写的 bootloader 可以吗 ? u-boot/vivi/redboot/blob/…

你怎样学游泳 ?

Page 5: 怎样从 0 开始写 bootloader ?

5

本次课程收获 了解不同嵌入式软件运行的硬件基础和依赖

软件运行的存储芯片 哪些程序运行依赖栈空间? Bootloader 能调用库函数吗? main 函数的功过是非 用全局变量好,还是局部变量好?

掌握一种嵌入式开发工具,开发流程和开发方法 ARM ADS1.2 IDE (JTAG 调试 , Flash 烧写, AXD 下载 ) 命令行工具 (armcc, armasm, armlink, fromelf, make) 步步为营,左右互搏,屡试不爽

通过写 bootloader ,深刻领会 ARM 嵌入式开发核心概念之“寄存器” sp (栈指针), lr (链接返回地址), pc , CPSR GPIO 寄存器, UART 寄存器, NandFlash 寄存器 ARM Architecture Referrence Manual plus DataSheet

Page 6: 怎样从 0 开始写 bootloader ?

6

预备

Page 7: 怎样从 0 开始写 bootloader ?

7

预备工作之一 首先 , 得有一个板子

推荐友善之臂 mini2440 http://www.arm9.net/mini2440.asp

mini2440 + 3.5"LCD 套餐 : 680RMB mini2440 单板 : 499RMB

Page 8: 怎样从 0 开始写 bootloader ?

8

预备工作之二 书籍

《 ARM Architecture Reference Manual 》 PDF , Part A

《 ARM 体系结构与编程》 清华大学出版社,杜春雷著

以上 2 本都有电子版提供 ,可以课后向张婷老师要一下 .

Page 9: 怎样从 0 开始写 bootloader ?

9

预备工作之三 构建基础知识体系

硬件知识 ARM 寄存器

37 个寄存器: R0-R12, R13(SP) , R14(LR) , R15(PC) , CPSR(SPSR)

ARM 芯片外设控制器 WatchDog (看门狗), GPIO (通用 IO ), UART (串口), Nand Flash Controller , Clock & Power Management (时钟和电源管理),

Page 10: 怎样从 0 开始写 bootloader ?

10

预备工作之三 构建基础知识体系

软件知识 ARM 开发调试工具

ADS1.2 , AXD make , hypertrm (超级终端)

ARM 命令行工具 armcc , armasm , armlink , fromelf

ARM 汇编指令 mov , add , sub , b , bl , ldr , str

Page 11: 怎样从 0 开始写 bootloader ?

11

未完待续,敬请关注谢谢!

Page 12: 怎样从 0 开始写 bootloader ?

12

动手实践 目标 -- 实现一个 bootloader

支持外部程序的下载 , 运行 , 固化和自加载 完成这个目标 , 有哪些中间步骤 ?

1- 能够实现 led灯的闪烁 ( 汇编级和 C 语言级 ) 2- 能够实现串口的初始化和读写 (C 语言 ) 3- 能够实现基于串口的下载和执行 (C 语言 ) 4- 能够实现命令行解析方式的下载和执行 5- 能够实现 Flash 的固化 6- 能够实现固化后的自加载启动

Page 13: 怎样从 0 开始写 bootloader ?

13

中间里程碑之一 闪灯

汇编语言实现 LDR, STR 内存读写指令 B, Bl 跳转指令 armasm 汇编器 , armlink 链接器 S3C2440 DataSheet 数据手册 SFR 特殊功能寄存器之 GPIO 控制器 硬件设计原理图 H-jtag flasher 烧写

Page 14: 怎样从 0 开始写 bootloader ?

14

中间里程碑之一 闪灯

C 语言实现 SRAM 内部存储和地址 sp 堆栈指针和栈空间 armcc 编译器 volatile 关键字 #define 宏用法 main 函数 反汇编工具 fromelf

SDRAM 初始化

Page 15: 怎样从 0 开始写 bootloader ?

15

中间里程碑之二 串口

串口工作原理 缓冲寄存器 , 移位寄存器

帧格式 数据位 , 停止位 , 奇偶校验 , 流控 , 波特率

时钟频率设置 IO 管脚的功能复用 控制寄存器 , 数据寄存器 , 状态寄存器

Page 16: 怎样从 0 开始写 bootloader ?

16

中间里程碑之三 下载和执行

接收二进制可执行代码 getchar

跳转命令的 C 语言实现 函数指针

Xmodem 协议 协议帧格式 传输过程控制

Page 17: 怎样从 0 开始写 bootloader ?

17

中间里程碑之四 命令行解析

标准 IO 输入输出 gets puts printf

字符串函数 strcmp 函数 ( 字符串比较 ) strstr 函数 ( 字符串匹配 ) atoi 函数 ( 字符串转整数 )

常用命令 download go flashw

Page 18: 怎样从 0 开始写 bootloader ?

18

中间里程碑之五 Flash 固化

flash 的内部存储结构 flash 与主芯片的连接关系

怎样传地址 , 怎样传数据 flash 的初始化配置 flash 的读写时序

Nor flash Nand flash

Page 19: 怎样从 0 开始写 bootloader ?

19

中间里程碑之六 自启动方式

加电后的启动流程 等待 1-3 秒 , 如无用户输入 , 则进入自加载模式

Flash 的分区 加载不同应用 ( 操作系统 ) 传递给内核相应参数

Page 20: 怎样从 0 开始写 bootloader ?

20

哈哈 , 搞定了