历史上的今天
返回首页

历史上的今天

今天是:2025年01月16日(星期四)

正在发生

2020年01月16日 | ARM的启动代码(1):介绍

2020-01-16 来源:eefocus

很多朋友搞嵌入式,写起代码来一点问题没有,到最后上板子调试的时候,挂了。究其原因,还是对芯片的启动地址、启动方式、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启动代码的时候,不能孤立的去看芯片资料,需要统一从全局考虑。

推荐阅读

史海拾趣

苏州锋驰(Feng)公司的发展小趣事
检查反馈电路的连接和元件是否正常工作,确保反馈信号准确传递。
ADPOW公司的发展小趣事

ADPOW公司成立于XXXX年,初期是一个小型电子技术研发团队。创始人凭借对电子技术的深刻理解和市场需求的敏锐洞察,带领团队专注于电源管理技术的研发。经过数年的不懈努力,团队成功开发出一款高效、稳定的电源管理芯片,这一技术突破为ADPOW公司后续的发展奠定了坚实的基础。

Hitachi (Renesas )公司的发展小趣事

ADPOW公司始终将技术研发作为公司发展的核心驱动力。公司投入大量资源用于研发新技术、新产品,不断推陈出新。同时,公司积极与高校、研究机构等合作,引进先进技术和人才,为公司的持续发展注入新的活力。

GS Technology公司的发展小趣事
用于显示电信号的波形和峰值。
CAROLCABLE公司的发展小趣事

CAROLCABLE公司的创立,标志着电子线缆行业迎来了一位新的竞争者。在电子科技飞速发展的时代背景下,创始人凭借对线缆技术的深刻理解和市场需求的敏锐洞察,决定创立CAROLCABLE公司。公司初期,面临着资金短缺、技术瓶颈和市场认知度低等多重挑战。然而,创始人凭借着坚定的信念和不懈的努力,带领团队克服了一个又一个困难。他们积极研发新产品,优化生产工艺,提高产品质量,逐渐在市场上站稳了脚跟。

随着公司业务的不断拓展,CAROLCABLE开始与一些知名的电子企业建立合作关系,为其提供高质量的线缆产品。这些合作不仅为公司带来了稳定的订单和收入,也进一步提升了CAROLCABLE在行业内的知名度和影响力。

BAE Systems公司的发展小趣事

BAE Systems公司的前身可以追溯到多个历史悠久的英国航空与电子企业。1910年成立的布里斯托飞机公司、1918年成立的英格兰电子公司,以及1927年成立的Vickers-Armstrongs,这些企业在各自的领域内都取得了显著的成就。到了1960年,这些企业经过整合,形成了英国飞机公司,这标志着英国航空与电子工业的一次重要合并。这一整合不仅增强了英国在航空领域的实力,也为后来的BAE Systems公司打下了坚实的基础。

问答坊 | AI 解惑

接地装置及其运行维护

电气设备的任何部分与大地(土壤)间作良好的电气连接称为接地。 接地是确保电气设备正常工作和安全防护的重要措施。电气设备接地通过接地装置实施。接地装置由接地体和接地线组成。与土壤直接接触的金属体称为接地体;连接电气设备与接地体之间的导 ...…

查看全部问答>

更改!我想原创,才发现没想法,于是就改行发现别人的想法

这是一个巧合,以前我从不把两个电池并联使用,从来都是串联!直到有一天,我看别人的文里面有个电路图,图里有两个电池,电池是准并联的,因为有两个二极管!电池并联的情况,如下图1              &n ...…

查看全部问答>

Power Architecture Study Notes

Capture 0 A big picturePPC function category:1. Interger (Fixed-point) Facility, using 32 GPRs(General Purpose Registers), each register have 32/64 bits for different mode. 2. Floating-point Facility, using 32 FPRs (Floating- ...…

查看全部问答>

wince5.0环境下对话框中显示图片问题

{                 TRACE(L\"CONINIT_MULTITHREADED ERR…

查看全部问答>

有哪位朋友用过讯飞公司的s3011语音芯片?请指教!

有哪位朋友开发嵌入式产品时用过讯飞公司的s3011语音芯片,本人在使用过程 中遇到不少问题,有哪位朋友有经验帮助咨询一下,谢谢了。…

查看全部问答>

招聘音频视频开发兼职开发

招聘兼职人员做视频音频软硬件开发,要求从事过此方面的工作,如做过MP3、MP4、电视机顶盒等的开发,有意者请将个人简历发送至邮箱nuaacom@163.com,符合我们意向的人员我们将与您联系,谢谢!…

查看全部问答>

写了个IIC键盘驱动有些错误,大牛们过来看看能否解决,同时功能上是否能实现!

附件里面我放了源代码,同时也将源代码帖到下面: /*IIC键盘程序:CPU是S3C2440,嵌入式操作系统是linux2.6.13,IIC键盘芯片是ZLG7290(周立功的片子);硬件中断连接方法, 将ZLG7290的INT按键中断引脚接GPF2(将GPF2配置成中断功能EINT2),当有按键按 ...…

查看全部问答>

急!!PXA270+uboot+wince5.0问题

想跟大侠们请教一个PXA270+uboot+wince5.0问题,现在uboot已经调试好了,uboot通过tftp下载NK.nb0到sdram中,运行NK时没有串口信息输出。经过“点灯法”发现程序能运行完src\\kenel\\oal\\startup.s,此后跳转到kernelstart(位于WINCEROOT\\Private\ ...…

查看全部问答>

UCGUI中文手册,打包共24个

今天在这里看到一个UCGUI的中文手册,是分开的,要下这个的朋友们可能真有点惨,我这正好有这个,打个包给大家分享…

查看全部问答>