嵌入式系统区别与简单的单片机(如stc89c51、stm32等),主要在于加载了linux系统。当然,不可忽略stm32可以加载ucOS(Micro Control Operation System)。ucOS是一个基本的带任务调度的实时操作系统(RTOS),用来做嵌入式入门比较合适。我会在后期有时间整理部分ucOS资料。对于裸板程序来说,arm的开发跟stc89c51和stm32区别不大。
现在个人PC基本都是windows系统(用苹果的土豪请无视我),有装系统经验的人应该知道计算机进入BIOS之后会通过GRUB进行系统引导,引导的就是我们的win7,win8,win10系统。同样的道理,本文所说的u-boot起得也是一个系统引导的作用,而引导的是linux系统。u-boot全称是Universal Boot Loader。嗯,其实就是一个boot loader。看其源码可以发现,它的大部分是从相应的linux内核中简化形成的。代码在git上可以查阅下载,但是在github上居然没有找到,希望有找到的同志告知一下,谢谢。
u-boot可以支持linux、NerBSD、VsWorks、QNX、RTEMS、ARTOS、LynxOS、Android(这里面有很多我也不了解,想深究的建议Google),其中对linux的支持最为完善。u-boot可以在PowerPC、ARM、x86、MIPS这些CPU上运行。据百度百科的说法是,以PowerPC的支持最为丰富。但我感觉那是前几年的情况。近几年PowerPC渐渐势弱,可能是功耗相对于x86过大的缘故。看一些相关资料就会发现,曾经无比强大的PowerPC将很有可能慢慢被淘汰。扯远了,总之u-boot支持ARM,我们可以在ARM上用,这就可以了。此外,u-boot提供了许多设备驱动源码。以我最近(2016年9月3号)下载的源码来看,足足提供了48个(在drivers文件夹中)。
下面来分析一下u-boot的加载方式。u-boot的工作模式分两种:启动加载模式和下载模式。
u-boot的启动流程分为stage1和stage2两个部分。
依赖CPU体系结构的代码在stage1阶段,以汇编语言实现。它包括:
1. 定义入口点
2. 设置异常向量
3. 设置CPU速度、时钟频率及中断控制寄存器
4. 初始化内存控制器
5. 将ROM中程序复制到RAM中
6. 初始化堆栈
7. 使用“ldrpc”指令转到RAm中执行
stage2阶段以C语言实现了一系列初始化并将环境参数读入内存。在很多资料上看到以前版本的启动函数在lib_arm文件夹下的board.c文件中,但是最近(2016年9月3日)的版本中没有这个文件夹,board.c文件倒是不少,不过都是增减过之后的。