研一的时候在S3C6410的开发板上完成了一个简单的bootloader的设计,有一些想法可以顾及到其他处理器的设计上,在这里和大家分享一下。 晚一些的时候我再跟大家讲如何去设计 :)
首先什么叫做bootloader?在我看来,其实bootloader就是一个搬运工,负责将串行或并行flash中的数据搬运至sdram,再将pc指针切换至sdram的映射地址。大家也许会问,8/16位单片机或者CORTEX-M系列的处理器为啥不需要bootloader,在这里其实是有误区的,其实这些处理器也是有bootloader的,后面我会给大家讲具体流程。拿8051和cortex-m系列的处理器来说事,这两种CPU都是哈佛结构的CPU,现在的CPU在设计时兼顾了哈佛和普林斯顿的优势,所以已经没有一个比较清晰的界限来定义CPU是属于哈佛或是普林斯顿结构。
首先程序员写完了相关你可以“看见”的代码之后,按照大家的说法,编译链接后会生成一个hex文件,再利用各种方式将hex文件下载至单片机内部的flash,接着会对处理器进行复位操作,系统会从一个起始地址开始运行,系统会将数据段搬移至系统的ram中去。并初始化堆和栈,ram和flash分开,这便是哈佛结构的精髓之所在!
有些人可能就会问了?我在使用keil或是iar的时候没有看到相关的”搬移“工作啊?真是成也萧何,败也萧何。这也算是当代软件的一个缺失吧,这些事情,keil的编译器都帮你做了,它自动的生成这部分“搬移”代码,而这个代码作为程序员是没有办法在IDE窗口中看到的,这也不能说不是一种悲哀。当然你如果感兴趣,也可以看的到这方面的过程,具体方式有很多种。例如如果你使用的mentor公司的gnu工具链的话,因为gcc没有自动生成”搬移“代码,因此在startup.a中是可以看到这部分搬移过程的。keil中也可以看到,提醒大家一下,objdump :)
当代软件有时候帮你做的事,从理论上减轻了你的工作量,但是却让你没有办法接触到最为核心的知识。这种做法无异于饮鸩止渴,当然这仅仅只是我的看法,我是一直gnu的支持者,就向很多人是windows的支持者一样。在工具使用方面,一直都是仁者见仁,智者见智,在这里,应该提倡百家争鸣!好啦!今天就写这么多吧,改天跟大家讨论如何在bootloader中设计应该注意一些问题。
处理器boot的简单概念及误区