200 likes | 478 Views
怎样从 0 开始写 bootloader ?. 李明 北京亚嵌教育研究中心 http://www.akaedu.org. 开场介绍. 本次课程讲什么? 从 0 开始写 bootloader 本次课程谁来讲? limingth@akaedu.org 本次课程适合的听众是哪些人? 有时间在接下来 1 个月内开始动手实践的人 已经购买或者准备购买开发板的人. 今日主题. 从 0 开始写 bootloader 0( 零基础 ) 指的是什么? 学习过 C 语言 了解 ARM 体系结构和汇编语言 没有在开发板上做过软件开发 Bootloader 是什么?
E N D
怎样从0开始写bootloader? 李明 北京亚嵌教育研究中心 http://www.akaedu.org
开场介绍 • 本次课程讲什么? • 从0开始写bootloader • 本次课程谁来讲? • limingth@akaedu.org • 本次课程适合的听众是哪些人? • 有时间在接下来1个月内开始动手实践的人 • 已经购买或者准备购买开发板的人
今日主题 • 从0开始写bootloader • 0(零基础)指的是什么? • 学习过C语言 • 了解ARM体系结构和汇编语言 • 没有在开发板上做过软件开发 • Bootloader是什么? • Boot: 能够初始化基本硬件(时钟,存储,串口) • Loader: 能够加载,运行,固化外部程序(操作系统)
学习动机 • 为什么会有bootloader? • 为什么我们要自己写Bootloader? • 移植一个别人写的bootloader可以吗? • u-boot/vivi/redboot/blob/… • 你怎样学游泳?
本次课程收获 • 了解不同嵌入式软件运行的硬件基础和依赖 • 软件运行的存储芯片 • 哪些程序运行依赖栈空间? • 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
预备工作之一 • 首先, 得有一个板子 • 推荐友善之臂 mini2440 • http://www.arm9.net/mini2440.asp mini2440单板 : 499RMB mini2440 + 3.5"LCD 套餐 : 680RMB
预备工作之二 • 书籍 • 《ARM Architecture Reference Manual》 • PDF,Part A • 《ARM体系结构与编程》 • 清华大学出版社,杜春雷著 以上2本都有电子版提供, 可以课后向张婷老师要一下.
预备工作之三 • 构建基础知识体系 • 硬件知识 • ARM寄存器 • 37个寄存器:R0-R12, R13(SP),R14(LR),R15(PC),CPSR(SPSR) • ARM芯片外设控制器 • WatchDog(看门狗), • GPIO(通用IO), • UART(串口), • Nand Flash Controller, • Clock & Power Management(时钟和电源管理),
预备工作之三 • 构建基础知识体系 • 软件知识 • ARM开发调试工具 • ADS1.2,AXD • make,hypertrm(超级终端) • ARM命令行工具 • armcc,armasm,armlink,fromelf • ARM汇编指令 • mov,add,sub, • b,bl, • ldr,str
动手实践 • 目标--实现一个bootloader • 支持外部程序的下载,运行, 固化和自加载 • 完成这个目标, 有哪些中间步骤? • 1-能够实现led灯的闪烁 (汇编级和C语言级) • 2-能够实现串口的初始化和读写(C语言) • 3-能够实现基于串口的下载和执行(C语言) • 4-能够实现命令行解析方式的下载和执行 • 5-能够实现Flash的固化 • 6-能够实现固化后的自加载启动
中间里程碑之一 • 闪灯 • 汇编语言实现 • LDR, STR 内存读写指令 • B, Bl 跳转指令 • armasm 汇编器, armlink 链接器 • S3C2440 DataSheet 数据手册 • SFR 特殊功能寄存器之 GPIO 控制器 • 硬件设计原理图 • H-jtag flasher 烧写
中间里程碑之一 • 闪灯 • C语言实现 • SRAM内部存储和地址 • sp 堆栈指针和栈空间 • armcc编译器 • volatile 关键字 • #define 宏用法 • main函数 • 反汇编工具 fromelf • SDRAM初始化
中间里程碑之二 • 串口 • 串口工作原理 • 缓冲寄存器,移位寄存器 • 帧格式 • 数据位,停止位,奇偶校验,流控,波特率 • 时钟频率设置 • IO管脚的功能复用 • 控制寄存器,数据寄存器,状态寄存器
中间里程碑之三 • 下载和执行 • 接收二进制可执行代码 • getchar • 跳转命令的C语言实现 • 函数指针 • Xmodem协议 • 协议帧格式 • 传输过程控制
中间里程碑之四 • 命令行解析 • 标准IO输入输出 • gets • puts • printf • 字符串函数 • strcmp 函数(字符串比较) • strstr 函数(字符串匹配) • atoi 函数(字符串转整数) • 常用命令 • download • go • flashw
中间里程碑之五 • Flash固化 • flash 的内部存储结构 • flash 与主芯片的连接关系 • 怎样传地址, 怎样传数据 • flash 的初始化配置 • flash 的读写时序 • Nor flash • Nand flash
中间里程碑之六 • 自启动方式 • 加电后的启动流程 • 等待1-3秒, 如无用户输入, 则进入自加载模式 • Flash的分区 • 加载不同应用(操作系统) • 传递给内核相应参数