没有合适的资源?快使用搜索试试~ 我知道了~
首页[原创]自己动手编写嵌入式Bootloader之(1)
[原创]自己动手编写嵌入式Bootloader之(1)
4星 · 超过85%的资源 需积分: 49 32 下载量 26 浏览量
更新于2023-03-03
评论 2
收藏 219KB DOC 举报
CPU上电后会从IO空间的某地址取第一条指令。但此时:PLL没有启动,CPU工作频率为外部输入晶振频率,非常低;CPU工作模式、中断设置等不确定;存储空间的各个BANK(包括内存)都没有驱动,内存不能使用。在这种情况下必须在第一条指令处做一些初始化工作,这段初始化程序与操作系统独立分开,称之为bootloader。 实际上,很少有必要自己写一个Bootloader,因为U-Boot已经强大到能够满足各种需要。但是强大必然复杂,一个初学者想要分析U-Boot的源代码,还是有些难度的。出于学习的目的,我写了这个史上最简单的启动加载器,它只包含最基本的功能,却囊括了一个嵌入式Bootloader应该有的核心和精华。我把这个启动加载器命名为S-Boot, 是Simple Bootloader的缩写,亦可进一步简称为SB。
资源详情
资源评论
资源推荐
第一部分:基本功能流程
上电后会从 空间的某地址取第一条指令。但此时: 没有启动, 工作频率为外
部输入晶振频率,非常低; 工作模式、中断设置等不确定;存储空间的各个 (包括
内存)都没有驱动,内存不能使用。在这种情况下必须在第一条指令处做一些初始化工作,这
段初始化程序与操作系统独立分开,称之为 。
实际上,很少有必要自己写一个 ,因为 已经强大到能够满足各种需要。但是强大必然复杂,一个初学者想要分析 的源代码,还是有些难度的。出于学习的目的,
我写了这个史上最简单的启动加载器,它只包含最基本的功能,却囊括了一个嵌入式 应该有的核心和精华。我把这个启动加载器命名为 , 是 的缩
写,亦可进一步简称为 。
使用的实验环境为 开发板,板上处理器为 ,有 内存, 存储器为 !"#,。网口芯片为 # 。我们要实现的功能是:从串口下载 $% 内核映
像到 &;从网口下载 $% 内核映像到 &;从 & 启动内核挂载 ! 根文件系统。
1. 第一阶段的汇编代码:start.S
一个嵌入式 最初始部分的代码几乎必须是用汇编语言写成的,因为开发板刚上电后没有准备好 程序运行环境,比如堆栈指针 没有指到正确的位置。汇编代码应该完成最原
始的硬件设备初始化,并准备好 运行环境,这样后面的功能就可以用 语言来写了。
对我们的 来说,上电后的起始运行代码是 '(')。
)%
)*+'
+',
&'-%,发生复位异常时从地址零处开始运行
..../0-%,未定义指令中止模式的向量地址
..../1..-%#,管理模式的向量地址,通过 1 指令进入此
模式
..../023-%,指令预取终止导致的异常的向量地
址
..../4....-%",数据访问终止导致的异常的向量地
址
..../'......-%",保留
..../&5..........-%"#,中断模式的向量地址
..../!5..........-%",快中断模式的向量地址
.
这里,汇编指示符)% 表明以下内容属于代码段,)*+' 指明+' 是全局可访问的符号(673'8%9*)。按照 & : 的规定,从地址 % 到
%" 放置异常向量表,向量表每个条目占四个字节,正好可以放置一条跳转指令,跳转到相应异常的服务程序中去。在 中没有使用中断,所以除 &' 异常外,其它异常的服务程
序都可简单地写个死循环。&' 异常是系统上电后自动触发的,所以我们的代码都写在 &' 的服务程序里面。
.
实际上,异常向量表不一定非要位于地址 % 处,"; 协处理器中的 2" 寄存器的第 " 位用来控制异常向量表的起始地址。该位为 时,异常向量表位于低地址 % 处;该位为 " 时,
异常向量表位于高地址 %!!!! 处。我们没有必要改变这个位的值,使用默认的低地址就行了。
&',
........'<2'......-'2$=
........2<<>%"!
........<<>%4
........'2'<......-2'?""%"""<&5(!5'
.
代码最初始的任务是设置 工作在 = 模式,关闭所有中断,禁用看门狗。实际上,即使不设置工作模式, 在复位之后将自动工作在管理模式。在整个 运行期间,我们没
有使用中断,也没有改变 工作模式,它将一直工作在 = 模式。
.
、23、423 的打开和关闭都是由 "; 协处理器的 2" 寄存器控制的。实际上在复位之后这三者都是自动关闭的,所以省略了关闭它们的代码。
的 & 寄存器(*$'&*$')中每个 位的含义如图 " 所示。@ 为模式位,用来设置 工作模式,现在只要知道 A,B?"""表示 =
模式就行了。; 为状态位,:? 表示工作在 & 状态,:?" 表示工作在 :3$ 状态,默认为 ,不需要改变。 为快速中断禁止位,!?" 为禁止快速中断,!? 为使能快速中断。
C 为中断禁止位,?" 为禁止中断,!? 为使能中断。其它 位暂时可以不必理会。
'和 ' 是在 & 寄存器和其它寄存器间传递数据的指令。如:'<2'把 2' 的值传送到 中, '2'<把 的值传送到 2' 中。2 是位清零()指令,2
<<>%"!意思是把 的 A,B位清零(由 %"! 指示),然后把结果写入 中。 是按位求或指令,<<>%4表示把 的 C<<<"<置为 ",其它位保
持不变。
执行完上述操作后,2' 中的 ?"<!?"<: 保持不变(默认为 ),A,B?""",意思是禁止 &5,禁止 !5,工作在 & 状态,工作在 = 模式。
.
.......<?%;
........7"<>%
........'"<AB-'D23*
.
禁用看门狗更简单,因为 1: 寄存器的地址为 %;,直接向该寄存器写 即可。
到目前为止, 工作在外接晶振 "/E 频率之下。使用以下代码设置 ,提升工作频率。
.
.......<?%"-4=*'
........7"<>%;-!,/,?",,#
........'"<AB
........2";<<<2"<2<-0/4=<$''823$'
$'
........<<>%-'$C
........2";<<<2"<2<
........<?%-*'
........"<?%;""-FF GG"HIF"GGHIF"HH
........'"<AB-!'/EJ
.
最后的结果是,!?/E,/?"/E,?;/E。
.......-4&
........7"<>%#-K+:+K
........<+20*+7
........<"<>;
",
........<AB<>-读取设置值,并让 加
........'<A"B<>-将此值写入寄存器,并让 " 加
........2"<-判断是否设置完所有 " 个寄存器
........"-若没有写成,继续
.
设置存储控制器。
.......'<?%!!!-设置堆栈
........+-初始化 4!'3
............................................-++ 函数需要 个参数:
........<?%-")目标地址?%,这是
4& 的起始地址
........7"<>-)源地址 ?, 代码都存在 4 地址 开
始处
........7<>"-)复制长度?"F8'H
........+-调用 函数 +
........<?3+-设置返回地址
........2<?- 指令和 指令只能前后跳转 的范围,故使
用向 2 赋值的方法进行跳转
剩余11页未读,继续阅读
tjx163
- 粉丝: 18
- 资源: 392
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
- SPC统计方法基础知识.pptx
- MW全能培训汽轮机调节保安系统PPT教学课件.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论1