源:ARM的启动代码(1):介绍

  很多朋友搞嵌入式,写起代码来一点问题没有,到最后上板子调试的时候,挂了。究其原因,还是对芯片的启动地址、启动方式、bootloader和操作系统的衔接出了问题。今天就闲聊一下这个问题。
  对于一个新处理器,我们最关心的是什么呢?并不是它支持不支持C编译器,有没有良好的开发环境。从程序员的角度说,要把一个新处理器吃透,必须明白两样东西:a)新处理器的内存模型;b)新处理器的中断方式、中断源等等。以ARM的AT91SAM9260为例。
  一个ARM芯片可能有N种不同的启动方式,支持从SPI flash启动、Norfalsh、nandflash、片内rom 等等。一些操作系统,如vxworks、ecos也支持这些五花八门的启动方式,如果不理解内存模型,会认为这些方式是完全不同的。但从有经验的嵌入式软件工程师眼里,这些方式其实都是一种方式扩展出来的。所有的ARM一上电以后,都是进入SVC模式、中断关闭、ARM指令,从0x0处执行代码。 我们来考察一个问题,SP flash和Nandflash是用什么总线的呢?SPI 和 8Bit or 16bit, 在代码中可以通过简单的赋值和地址方式来访问spi flash和nandflash中的内容吗?是不可以的,读取spi flash/nandflash,写入spi flash/nandflash首先要写入命令,然后准备缓冲区,刷新数据。所有这些不可能简简单单的通过一条LDR、STR指令完成对存储单元的访问。专业的话来说,SPIflash/nandflash并不是和系统统一编址的。一上电以后,ARM从0x0处执行,是无法通过复杂的方式获取0x0处的数据,只能通过简单的总线动作完成。也就是,想直接用spiflash/nandflash启动ARM那是天方夜谭……为什么有的ARM可以用spiflash/nandflash启动系统呢?AT91SAM9260 就是一个这样的芯片。

  我们来看看AT91SAM9260的芯片存储结构:0x0~0x0FFF FFFF是internal memories,就是芯片内部的存储器。0x0~ 0x0F FFFF 是boot memory, 0x10 0000 到 0x10 7FFF是ROM。0x20 0000~0x20 0FFF是 SRAM0,0x30 0000 ~ 0x30 0FFF 是 SRAM1。boot memory是什么?boot memory是一个空闲的地址。可将SRAM0、ROM映射到该地址来,也就是用控制寄存器,选择ROM、SRAM0映射到boot memory位置。如果访问boot memory的地址,也就是访问被映射到该位置的ROM或SRAM0地址内容。例如,如果boot memory映射了SRAM0,访问0x10 的位置与0x20 0010位置是等价的。芯片一上电后,默认的映射是ROM,ROM是什么?原来是ATMEL为9260定义的一段启动代码,出厂就固化在里面。它会寻找Dataflash(ATMEL的一种flash),从flash中加载bootloader,或寻找nandflash、norflash,加载bootloader。
  ARM上电从内存0x0开始执行,9260将rom映射到boot memory的位置,即执行的rom中的代码。从外设中加载bootloader。这个过程就顺利成章了,boot memory在arm7中是经常可见的,用以解决ARM的启动和异常向量的问题。是个非常完美的解决方案。
  到这里,我们就明白了,其实从nandflash/spi flash/uart/网络等方式加载应用程序,实际上,ARM裸机是做不到的,必须要告诉ARM方法。也就是说,我们必须写个程序告诉ARM,从什么口,什么方法可以把正确的代码载入内存。明白了这一点,就需要弄清楚地址了,就是将什么东西加载到什么位置。其实这个问题并不复杂,关键就是把一些概念分清楚就好了。

  1. 我们的代码加载到芯片统一编址的什么位置,这个地址整个芯片内部都是通行可见的。
  2. 我们的代码存储在spi flash/nandflash这样非统一编制的器件上,代码在这些器件上的地址从哪里开始?其实这个地址对ARM来说已经不是统一编制的地址了,只需要编程人员明了,写好驱动,从指定位置加载就好。如果厂家已经写好驱动,这个地址已经固定了,对于编程人员来说,将代码写入nandflash/spi flash不能再随心所欲了,因为无法改变驱动中的起始地址了。
  3. 被加载代码的格式。如果是原始二进制格式,参考1)就可以了。但如果是elf文件,那就稍微麻烦了:elf文件中含有每一块数据加载到芯片的什么位置,但不管怎么说,思路都是一样的,将合适的代码加载到芯片特定的位置。

  修改这些地址的位置也是不同的,Bootloader可以配置将目标加载到的位置、获取目标代码的位置和获取目标代码的方法;工具链的链接脚本可以修改每个段(数据段、代码段)的位置。硬件的片选信号也决定着器件统一编址的位置。所以,在设计ARM启动代码的时候,不能孤立的去看芯片资料,需要统一从全局考虑。

ARM的启动代码(2):AT91SAM9260启动详解

ARM的启动代码(3):异常向量

ARM的启动代码(1):介绍(转)的更多相关文章

  1. ARM Linux启动代码分析

    前言 在学习.分析之前首先要弄明白一个问题:为什么要分析启动代码? 因为启动代码绝大部分都是用汇编语言写的,对于没学过或者不熟悉汇编语言的同学确实有一定难度,但是如果你想真正深入地学习Linux,那么 ...

  2. arm:启动代码判断是从nand启动还是从norflash启动,拷贝程序到内存的过程

    一.nand启动和nor启动:[1] CPU从0x00000000位置开始运行程序. 1.nand启动: 如果将S3C2440配置成从NANDFLASH启动(将开发板的启动开关拔到nand端,此时OM ...

  3. ARM上电启动及Uboot代码分析

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/qianlong4526888/article/details/27698707 注意:由于文档是去年 ...

  4. ARM启动代码中_main 与用户主程序main()的区别

    1.1  问题描述     __main函数的作用是什么呀?1.2  问题剖析     __main函数是C/C++运行时库的一个函数,嵌入式系统在进入应用主程序之前必须有一个初始化的过程,使用__m ...

  5. ARM Cortex-M底层技术(2)—启动代码详解

    杂谈 工作了一天,脑袋比较乱.一直想把底层的知识写成一个系列,希望可以坚持下去.为什么要写底层的东西呢?首先,工作用到了这部分内容,最近和内部Flash打交道比较多,自然而然会接触到一些底层的东西:第 ...

  6. STM32启动代码分析及其汇编学习-ARM

    STM32 启动代码 Author By YuCloud 边看启动文件边学汇编 汇编 see ARM: Assembler User Guide see: https://blog.csdn.net/ ...

  7. S3C2440启动代码2440init.s彻底解析

    可以选择nand启动和nor启动,这两者之间的关系通过一个按键来选择 这个OM0有何玄机,在数据手册中有这么一段 位宽RAM启动了(当然,还得设置一些东西,下面就说), Nanaflash启动经历的过 ...

  8. S3C6410的启动代码分析 一

    本文开始第一篇,启动代码的编写,注意,仅仅是启动代码,并不是bootloader,因为只有boot,没有loader. 第一要明确:CPU上电之后,会从某个固定地址执行指令.ARM结构的CPU从地址0 ...

  9. STM32启动代码详细分析

    最近需要学习iap的功能,因此离不开stm32的启动代码的分析,以前看了很多遍,都看不懂,读书百遍,其义自见,因此我有看了一遍,下面的文章,挺好的,因此转载: 在上电复位后,我们都知道会先运行启动代码 ...

随机推荐

  1. js入门实例

    <!DOCTYPE html> <html> <body> <h1>My First Web Page</h1> <p>My F ...

  2. java 设计模式之单利模式以及代理模式(静态)

    1:单利模式: public class Singleton { private static Singleton uniqueInstance = null; private Singleton() ...

  3. 把Ubuntu用户目录下的目录名改成英文

    直接改名字是不行的,一重启就回去了 方法一: 把中文文件夹改成相应的英文文件夹,再修改配置文件 ~/.config/user-dirs.dirs XDG_DESKTOP_DIR="$HOME ...

  4. PAT (Advanced Level) 1094. The Largest Generation (25)

    简单DFS. #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> ...

  5. MySQL常用命令总结2

    USE db_name; //使用(打开)数据库 SELECT DATABASE(); //查看当前打开的数据库 CREATE TABLE tb_name( column_name data_type ...

  6. VS2013编译FileZilla0.9.44

    2014年,FileZilla更新了一下,到了44版本了,貌似也是用VS2013的工程做的项目,所以下载了server的安装包,然后安装SourceCode即可(需要安装InterFace,是安装必选 ...

  7. 最短路径算法专题2----Dijkstra

    这个算法适用于求单源最短路径,从一点出发,到其余个点的最短路径. 算法要点: 1.用二维数组存放点到点的距离-----不能相互到达的点用MAX代替距离 2.用dis数组存放源点到任意其他一点的距离-- ...

  8. Friends and Subsequences

    Friends and Subsequences Mike and !Mike are old childhood rivals, they are opposite in everything th ...

  9. PAT (Advanced Level) 1070. Mooncake (25)

    简单贪心.先买性价比高的. #include<cstdio> #include<cstring> #include<cmath> #include<vecto ...

  10. 深入浅出Ajax(四)

    function initPage() { btn.onmouseover = buttonOver; btn.onmouseover = buttonOut; } 如上,浏览器只会运行指定的最后一个 ...