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

发布者:平静的33号最新更新时间:2020-01-16 来源: eefocus关键字:ARM  启动代码  bootloader 手机看文章 扫描二维码
随时随地手机看文章

很多朋友搞嵌入式,写起代码来一点问题没有,到最后上板子调试的时候,挂了。究其原因,还是对芯片的启动地址、启动方式、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  启动代码  bootloader 引用地址:ARM的启动代码(1):介绍

上一篇:ARM在进入main函数之前会做什么
下一篇:ARM启动代码的分析

推荐阅读最新更新时间:2024-11-04 16:07

基于ARM高速闪存MCU应对广泛嵌入式需求
  由于采用了ARM7TDMI-S内核,LPC2000系列MCU工作频率达60MHz,与其他8-bit产品相比具有更强的功能延展性。同时它借助片上存储器加 模块实现了“零等待访问”高速闪存功能,提高了指令执行的效率。   此外,LPC2000的外设接口非常丰富,包括UART、SPI、I2C、CAN、ADC、 PWM、RTC等。LPC2000系列MCU应用领域非常广泛,从网络通信、 马达控制,到汽车和消费电子都适合于涉足。   嵌入式系统是面向用户、面向产品、面向应用的,它是将先进计算机技术、半导体技术和电子技术以及各行业的具体应用相结合的产物,因此它是一个高度密集、不断创新的知识集成系统。作为嵌入式系统,它必须能够根据应用的需
[应用]
ARM系统软硬件简介
硬件:集成在芯片上的ARM处理器,通过存储器地址映射的寄存器来访问外设,还包括一种特殊的外设,被叫做控制器,用来实现存储器控制以及中断,片内AMBA把外设和处理器连接到一起 软件:​初始化代码配置硬件到一个确定的状态,成功后操作系统被加载执行,操作系统提供了一个通用的编程环境,便于各种应运高效能的利用系统硬件资源,驱动设备给外设提供标准的编程接口;一个应运程序完成系统一个特定任务
[单片机]
双声道音箱放出5.1效果,谭军笑说SRS小儿科
  ARM原中国区总经理谭军博士近日再现江湖时,已变身为英国一家名不见经传的音频技术公司Sontia的亚太区总经理。那么,这家公司到底拥有什么魔力竟能使得谭军从名震全球半导体业的ARM公司来屈身俯就呢?让我们先看一下这家成为于2004年的小公司的创始人背景。   这家有风险投资支持的Sontia公司的创始人是英国一位资深音乐人Chris Vernon,他是一个录音工程师和获奖的音频技术讲师,拥有多项国际专利,而且还是George Martin爵士的英国国家音乐教程中的技术组长。他认为Dolby Digital、THX、QSOUND、SRS和DTS的技术都不能达到中高端高保真音响公司所感兴趣的高保真音效,因此创立了这家公司来弥补业
[手机便携]
双声道音箱放出5.1效果,谭军笑说SRS小儿科
ARM处理器的Cache之cortex a8
Cache 是位于 CPU与主存储器DRAM(Dynamic RAM,动态存储器)之间的少量超高速静态存储器 SRAM(static RAM),其是为了解决 CPU 与 主存之间速度匹配问题而设置的,不能由用户直接寻址访问。 具有 Cache 的计算机,当 CPU 需要进行存储器存取时,首先检查所需数据是否在 Cache中。如果存在,则可以直接存取其中的数据而不必插入任何等待状态,这是最佳状态,称为高速命中;当 CPU 所需信息不在 Cache 中时,则需切换存取主存储器,由于速度较慢,需要插入等待,这种情况称为 高速未命中;在CPU存取主存储器的时候,按照最优化原则将存储信息同时写入到 Cache 中以保证下次可能的
[单片机]
<font color='red'>ARM</font>处理器的Cache之cortex a8
基于嵌入式Linux和Arm的远程监控模块的设计
引言 嵌入式系统是以应用为中心、以计算机技术为基础、软件硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。其中基于嵌入式Linux的远程配置模块的设计越来越得到人们的关注。通过基于嵌入式Linux的远程配置模块设计,远程专家和相关技术人员可以从Internet网上任意节点对服务器端所连接的设备的运行状态进行监控.并执行操作的修改。 系统的主要功能是通过计算机可使远程专家和相关技术人员在异地通过系统的客户器端监控多台设备的运行状态。系统在设备端的服务器端不仅仅承担一些实时检测系统状态的任务.而且需要把这些记录信息进行保存,并对客户端软件发出的请求进行相应的处理,系统在硬件上扩展了网卡模块、输入
[单片机]
基于嵌入式Linux和<font color='red'>Arm</font>的远程监控模块的设计
ARM USB 通信
采用ZLG的动态链接库,动态装载。 ARM是Context-M3-1343。 在C++ Builder 6 中开发的上位机通信软件。 USB通信代码如下: //--------------------------------------------------------------------------- #include vcl.h #pragma hdrstop #include Unit1.h //#include zyUSBDev.h //--------------------------------------------------------------------------
[单片机]
ARM AVI 视频播放 基于 2440 freambuffer 绘制
AVI 文件格式 图解 整理: AVI 是一种容器,里面放什么格式的数据都可以 视频编码:格式可以是 H264, MPEG-4, MJPEG ,因为 MJPEG 比较简单,所以仅支持 MJPEG 的 avi 视频。 音频编码:PCM16, mp3 因为 PCM 编码,文件实在过大,所以仅支持 mp3 编码。 难点: 1, 由于ARM 内存比较小,不能使用 mmap ,不能一次性全部读进 内存。 2,mp3 音频解码,暂不支持。 使用 狸窝全能视频转换器进行格式转换 数据块说明 movi 中是保存有,视频,音频数据。 00dc 表示是 视频数据,然后是4个字节的长度 全部 avi 文件中只有一个 movi LIST
[单片机]
<font color='red'>ARM</font> AVI 视频播放 基于 2440 freambuffer 绘制
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved