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

发布者:快乐舞动最新更新时间:2016-07-13 来源: eefocus关键字:ARM  启动代码  异常向量 手机看文章 扫描二维码
随时随地手机看文章
ARM的启动代码是非常重要的代码,直接关系到系统的稳定性和可靠性(这里主要讨论arm7, arm9;cortex系列的会在后续的文章中讨论)。上次我们通过两则文章讨论了ARM启动代码的过程,

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

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

 这次我们聊聊ARM的代码的具体编写。那么什么样的代码会涉及到这些问题呢?

1.Bootloader或者位于启动序列上进行加载其他应用程序的程序;

2.单独的二进制镜像,直接可以在ARM处理器上直接执行。

 

这两种代码都需要对 ARM 的启动过程有深入理解。说深入理解,其实只有一条,闹闹记住,ARM7,ARM9的异常向量表从地址0开始。这是铁打不能改变的事实。这样一来,所有的程序都要用0地址存储自己的向量表,这岂不是成了稀缺资源。所以不同家的ARM芯片都提供了一些办法解决这种问题。

 

对于arm7,很多芯片使用片内的flash。如at91sam7x256。为了方便,经常需要bootloader + 应用程序的方式。At91sam7x256提供了一个叫boot Memory的地址,1Mbytes, 从0x0~0x000F FFFF。可以映射成为内部的Flash和内部的SRAM。这个映射是:

Boot Memory: 0x0~0x000F FFFF, 1Mbytes

Internal Flash: 0x0010 0000~0x001F FFFF, 1Mbytes

Internal SRAM:0x0020 0000~0x002F FFFF, 1Mbytes

当Boot Memory映射成Internal Flash,flash的地址仍然从0x0010 0000开始,但是从0x0访问,等同于访问0x0010 0000;当映射成为 Internal SRAM,SRAM地址不变,访问0x0地址,等同于访问0x0020 0000。其实硬件做起来很简单,就是将地址线用逻辑电路稍微处理一下。

 

由于代码都要存放在FLASH里,否则,没电以后,啥都没有了,也无法再次启动。所以,异常向量要从0x0开始,那么自然也要把向量放在这个位置,7x256上电以后默认boot memory 映射从flash开始。也就是说,把向量放在0x0010 0000即可解决这样的问题。

 

当0x0010 0000被占用以后,bootloader 的向量问题解决了,那用户代码的中断向量怎么办呢?不可能把bootloader的向量擦了,把用户自己的向量写入,那岂不是bootloader也完了?这里有个小技巧,如果用户程序从0x0010 1000开始,向量依然从这个位置开始。只不过,在打开中断,向量真正起作用前,将0x0010 1000这个地方向量到SRAM的首地址上,然后切换Boot Memory映射SRAM。那么向量依然从0x0开始。这样的话,无论多少级boot代码,都可以完美的解决该问题。

 

ARM9除了以上的方法,还有个终极的利器,那就是MMU,你高兴放哪就放哪,在向量起作用之前,用MMU将其地址变换为0即可。一点技术含量都没有。

 

道理总是简单的,实现起来总是有点点弯弯绕。我们看看实际的实现吧。这是7x256的向量代码:

 

__vector:

    LDR     PC, [PC,#24]    ; Absolute jump can reach 4 GByte

    LDR     PC, [PC,#24]    ; Branch to undef_handler

    LDR     PC, [PC,#24]    ; Branch to swi_handler

    LDR     PC, [PC,#24]    ; Branch to prefetch_handler

    LDR     PC, [PC,#24]    ; Branch to data_handler

    DC32    0               ; Reserved

    LDR     PC, [PC,#24] ; Branch to irq_handler

    LDR     PC, [PC,#24] ; Branch to fiq_handler

 

 

    DC32    _program_start

    DC32    ARM_ExceptUndefInstrHndlr

    DC32    ARM_ExceptSwiHndlr

    DC32    ARM_ExceptPrefetchAbortHndlr

    DC32    ARM_ExceptDataAbortHndlr

    DC32    0

    DC32    ARM_ExceptIrqHndlr

DC32    ARM_ExceptFiqHndlr

 

这里相对比较简单,对这个指令做一下解释。LDR     PC, [PC,#24]是将当前PC+24的地址的值载入到PC寄存器中。由于ARM流水线的问题,当前执行的指令,地址已经是后面两条了。所以,是+24并不是+32。也就是把_program_start加载入PC指针里。这段代码已经消除了指令当前位置对跳转位置的影响,可以随意的拷贝到任意的地方去执行。这段代码放在0x20 0000地方,可以正常执行;放在0x10 0000地方也可以正常执行。

 

RTEMS的ARM9(CSB337)启动向量:

vector_block:

        ldr     pc, Reset_Handler

        ldr     pc, Undefined_Handler

        ldr     pc, SWI_Handler

        ldr     pc, Prefetch_Handler

        ldr     pc, Abort_Handler

        nop

        ldr     pc, IRQ_Handler

        ldr     pc, FIQ_Handler

 

Reset_Handler:           b       bsp_reset

Undefined_Handler:      b       Undefined_Handler

SWI_Handler:             b       SWI_Handler

Prefetch_Handler:       b       Prefetch_Handler

Abort_Handler:           b       Abort_Handler

                        nop

IRQ_Handler:            b       IRQ_Handler

FIQ_Handler:            b       FIQ_Handler

Rtems是个复杂的操作系统,在汇编代码里安装的只是一个简单的复位向量。其它向量都只是简单的死循环。操作系统运行起来以后,还要再次安装向量的。向量指向操作系统的复杂的处理函数。但不管这些,向量存储的地址是没有改变的。Link脚本上可以看到向量被放在内部的SRAM的首地址上。(CSB337)

 

SECTIONS

{

    .base :

    {

        _sram_base = .;

 

/* reserve room for the vectors and function pointers */

arm_exception_table = .;    

. += 64;

连接器虽然把位置空出来了,但连接器依然不知道将vector_block放到什么位置。怎么办?这里的代码解释了一切。

 

        /*

         * Initialize the MMU. After we return, the MMU is enabled,

         * and memory may be remapped. I hope we don't remap this

         * memory away.

         */

        ldr     r0, =mem_map

        bl      mmu_init

 

        /*

         * Initialize the exception vectors. This includes the

         * exceptions vectors (0x00000000-0x0000001c), and the

         * pointers to the exception handlers (0x00000020-0x0000003c).

         */

        mov     r0, #0

        adr     r1, vector_block

        ldmia   r1!, {r2-r9}

        stmia   r0!, {r2-r9}

        ldmia   r1!, {r2-r9}

        stmia   r0!, {r2-r9}

 

Gnu的工具链并不针对某一个具体的平台。所以解决方案从某种意义上说,更具有普遍意义。先调用mmu_init,这是干什么,实际上是将MMU初始化,将我们定义的.base地址放到0x0位置去。然后紧接着下面的几行代码,是将上面的中断向量到0x0位置去。一共64个字节,实现4GB内的地址绝对跳转。

关键字:ARM  启动代码  异常向量 引用地址:ARM的启动代码(3):异常向量

上一篇:ARM基础:MMU 异常向量表 重映射
下一篇:ARM中的ADR ADRL LDR

推荐阅读最新更新时间:2024-03-16 15:00

基于ARM和FPGA的硬件平台实现嵌入式数控系统
引言 现有的数控系统中多采用工控机加运动控制卡的计算机数控系统方案进行运动控制器的设计。随着工控机整体功能日趋复杂,对运动控制系统的体积、成本、功耗等方面的要求越来越苛刻。现有计算机数控系统在运动控制方面逐渐呈现出资源浪费严重、实时性差的劣势。此外,数控系统的开放性、模块化和可重构设计是目前数控技术领域研究的热点,目的是为了适应技术发展和便于用户开发自己的功能。本文基于ARM和FPGA的硬件平台,采用策略和机制相分离的设计思想,设计了一种具有高开放性特征的嵌入式数控系统。该数控系统不仅具备了以往大型数控系统的主要功能,还具备了更好的操作性和切割性能,而且在开放性方面优势更为突出,使数控系统应用软件具有可移植性和互换性。 1 基
[单片机]
基于<font color='red'>ARM</font>和FPGA的硬件平台实现嵌入式数控系统
ARM处理器、iOS一统平板天下,x86与Win8机会在后头
2011年采用ARM处理器的平板电脑出货量预计达5千9百90万台,年成长率高达211%;然而采用x86处理器(目前主要应用于笔记本电脑或上网本处理器)平板电脑在2013年之前很难有高成长表现。根据DisplaySearch最新发布季度平板电脑分析报告指出,2011年全球平板电脑出货量预计低于6千万台,不过到了2017年将有机会成长到3亿3千万台,未来几年将有很高成长机会。 DisplaySearch资深分析师Richard Shim先生表示,随着平板电脑和笔记本电脑不断地演进与改善,二者的相似度愈来愈高,未来将影响到彼此市场。 图一:2010-2017全球平板电脑按处理器区分出货量预测(单位:百万台) 图二:2010-2017
[手机便携]
Arm与合肥高新技术产业开发区签署合作协议
Arm今日宣布与合肥高新技术产业开发区签署两项合作协议,共同建设Arm物联网协同创新中心并设立Arm中国研究生院项目。双方将携手打造物联网集成电路产业的聚合效应,为产业今后的蓬勃发展培养人才,积极推进合肥电子产业创新生态圈的建设。 Arm全球执行副总裁兼大中华区总裁吴雄昂表示:“一直以来,Arm积极响应国家推动产业创新与升级的政策,持续加大在中国的战略部署和投入,紧跟双创人才与新工科等教育改革步伐,促进本地产业核心竞争力的形成。此次Arm与合肥高新技术产业开发区签署两项合作协议,以创新中心汇聚智慧方案,以研究生院培养领军人才的实践,是我们在国内积极建设本土产业生态的又一个具体举措。” 安徽省省委常委、合肥市市委书记宋国权表示:
[半导体设计/制造]
Arm Helium技术—提升机器学习能力与信号处理性能
Arm Helium技术作为一种全新的M-Profile Vector Extension矢量扩充方案,能为Armv8.1-M架构带来经过强化的计算能力 新架构能够将最小型边缘设备的机器学习能力提升15倍,以及将信号处理性能提升5倍 新架构针对下一代Cortex-M处理器而设计,适用于需在本地进行决策的小型嵌入式设备 Arm宣布针对其下一代Armv8.1-M架构推出基于M-Profile Vector Extension (MVE)矢量扩充方案的Arm Helium技术。这一全新技术能够帮助开发者简化软件开发流程,并显著提升未来Cortex-M系列处理器的机器学习能力与信号处理性能。 业界正在加速推动创建一个拥有万
[物联网]
ARM7单片机(学习ing)—(KZ)、ARM7系列的相关频率的介绍
我之前做的实验中,好多都不知道那个pclk是怎么出来的~~我还纳闷的~~呵呵,这篇就详细介绍了我之前的那个大漏洞~~ 这篇虽然说是篇介绍,但是ARM7里面的频率还是很重要的,尤其是UART~~ 很多人都说FIFO是个大重点~~ 在LPC210X系列的单片机中,IIC、SPI、UART、PWM、定时/计数器还有就是在Startup.s文件里的初始化频率等等都是有关频率的~~ 所以就想把我现在用到的频率的相关知识总结一下~~ 由于前面已经介绍过PLL(锁相环),这里也就不说了~~ 不过可以参考一下PLL的介绍: http://blog.sina.com.cn/s/blog_7ec8fc2c01013b5j.html ARM7系列
[单片机]
<font color='red'>ARM</font>7单片机(学习ing)—(KZ)、<font color='red'>ARM</font>7系列的相关频率的介绍
SA:高通、苹果和联发科占据Arm移动计算芯片市场收益份额前三名
6月23日消息,Strategy Analytics手机元件技术(HCT)服务近期发布的研究报告指出,基于Arm的移动计算芯片市场(智能手机、平板电脑和笔记本电脑)收益在2021年增长了27%,达到351亿美元。基于Arm的移动计算芯片(AP)市场上,高通、苹果、联发科占据了收益份额前三名。 在基于Arm的移动计算芯片市场中,高通以34%的收益份额领先,其次是苹果和联发科,分别占31%和24%。 2021年,智能手机、平板电脑和笔记本电脑处理器分别占基于Arm的移动计算芯片总营收的88%、9%和3%。 基于Arm的移动计算市场在营收和出货量上都超过基于x86的移动计算市场。根据我们的估计,2021年,基于Arm的移动
[半导体设计/制造]
SA:高通、苹果和联发科占据<font color='red'>Arm</font>移动计算芯片市场收益份额前三名
集邦咨询:英伟达若收购了Arm,美国将主导全球芯片产业
针对英伟达拟以400亿美金收购全球IP龙头Arm一案,集邦咨询(TrendForce)旗下拓墣产业研究院表示,倘若英伟达成功收购软银旗下的Arm,美国将掌握x86与Arm两大阵营的生态系统,从而在CPU领域建立起无可撼动的地位,无疑将加大美国对中国半导体发展的牵制力道。 拓墣产业研究院分析师姚嘉洋指出,此收购案完成后,英伟达短期内的重心还是以数据中心与自动驾驶汽车两大领域为主。在数据中心方面,英伟达过去一直是重要配角,但长年来数据中心一直被英特尔的x86架构所垄断,尽管Arm阵营近期在超级运算领域取得冠军,但终究是宣誓大于实质意义。如今英伟达的GPU加上Arm的CPU架构,或许有机会一改数据中心的生态面貌。 而英伟达在自动驾驶
[手机便携]
基于ARM和蓝牙的无线信号采集系统的设计与实现
1 引 言     无线测试技术在工业领域有广泛的应用前景。在连线复杂并需要反复拆装被测设备和测试设备之间连线的场合,使用无线可以降低工作的复杂程度,节约大量的时间,提高测试环节的工作效率,尤其在有时间限制时其优越性更加明显。此外在不适宜连线的场合,如港口、码头、江河湖坝、野外勘测、石油勘探中油井深处环境参数的测量,使用无线测量具有有线测量无法比拟的优越性。   对于近距离的无线传输,蓝牙由于采用快速跳频技术,确保了链路的稳定,同时使干扰可能造成的影响变得很小,适合用于存在大量噪声干扰的工业测试环境中,由于无线传输的是数字量,因此在通常情况下没有传输误差,不会影响到系统的准确度,并且可以单芯片实现,体积功耗都能达到很小的水平。
[网络通信]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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