因为最近本人要做一个 bf537 程序的启动程序,主要研究了 uboot 的一些资料和 537 的引导模式的资料。下面谈谈对 537 的启动和加载一些理解。
在说 537 的加载之前,有必要先要了解一下 537 的 ldr 文件的结构, ldr 文件的单元是许多 block, 每个 block 块都包含 10 个字节的文件头,每个 10 字节的文件头包含 4 字节的地址段, 4 字节的 COUNT (字节数)段, 2 字节的标志段。 Blackfin 的代码加载模式以 flash 引导模式为例来描述:上电— > 复位— > 片内 bootrom 执行,读flash 的 0x0 地址,按照 block 头中的 4 个字节地址,和字节数,把 block 搬移到 ram 中指定的地址,如此往复。(前面省略了初始化代码的执行过程,因为本人认为它对解释此过程没有意义,反而容易迷惑,故省略),以上是代码的加载过程,此过程跟 uboot 没有一毛钱的关系。
启动方式跟代码的加载方式没有太大的联系,所谓 8 中启动模式,只是处理器从何处开始执行或者说是从何处加载执行代码而已,加载过程跟 flash 引导下加载类似,都是按照 block 块的结构加载的,唯一的不同就是代码的来源不同。
启动过程,这里就涉及到一些 uboot 的知识了,其实本人认为如果设置成 Flash 引导模式的话,根本不用uboot ,在这里 uboot 的作用就显得很弱了,就只是一个更新系统的作用。下面慢慢说来,所谓 uboot 引导,其实就是在应用程序启动之前,先运行 uboot , uboot 的强大功能在于更新系统,就是程序下载(程序搬移)。为了能够实现程序下载的功能, uboot 首先要初始化一下处理器的一些寄存器,如设置时钟频率等,为下载功能代码的运行建立一个软件环境。所以如此说来, uboot 的运行就可以 这么描述:
(1) 调用一系列的初始化函数。
(2) 进去命令循环(即整个 boot 的工作循环),接受用户从串口输入的命令,然后进行相应的工作。(这里可以运行一些调试命令和下载命令)
在第二步这里一般是有个等待时间的,等待时间到,没有任何命令输入, uboot 就自动跳转到应用程序,完成所谓的引导。
个人认为, uboot 的主要作用还是在下载程序,如果在等待时间内,什么命令都不输入,就直接继续往下运行了,这时 uboot 的作用其实并不大。所以 uboot 只是在系统启动前的一段代码而已,这段代码就是实现了程序下载功能(当然你得输入命令),就是系统的在线更新。
其实代码的加载,启动模式, uboot 的引导过程,这三者的关系更像是从微观想宏观的扩展,要弄清 537 的程序的加载和整个系统的启动过程。不要把代码的加载和 uboot 的引导弄混了,根据以上的分析,他们其实并没有什么联系。加载(以 Flash 引导为例)是从 flash 一个一个 block 得往 ram 里面复制,此时这些工作是由 537 的片内bootrom 做的。而 uboot 引导的主要完成的功能是,在系统需要更新时,把新系统下载到 Flash 的制定区域内,此时这些工作是由 uboot 来完成的,在系统不需要更新时, uboot 运行完了就直接去运行用户程序了,此时 uboot 是没什么用的。
以上是本人对 537 的程序加载, uboot 引导的理解,错误之处,欢迎拍砖。
|