ARM简单启动代码及中断处理分析

发布者:电子艺术大师最新更新时间:2015-11-17 来源: eefocus关键字:ARM  启动代码  中断处理 手机看文章 扫描二维码
随时随地手机看文章
前言:本篇分析的是一个最精简的启动代码,并且包含一个简单的中断处理,C程序部分省略,重点分析汇编部分,这是因为对于我来说,汇编代码实在是让人厌烦,但是又不能不用。
 
下面是对代码的分析,红色部分是分析结果
 
.extern main                  //.extern 表示main在另外的文件中定义,在这里要引用,至于为什么只声明了extern而没                                    //有声明别的,目前还不知道,不过都声明一下,应该没问题
.text                        //.text 表示后面的内容编译出来放在代码段
.global _start              //.global 告诉编译器后面声明的是一个全局可见的名字,由于这是启动代码,所以cpu上电后                                  //必须要找到_start函数,所以_start必须声明为全局的,当然这个名字可以改,无所谓
_start:                     //查看反汇编地址就可以发现,_start的地址就是0x0
b Reset      //不带返回的跳转到Reset中,为什么不用返回呢,因为没必要,reset中直接进入到主函数内了
 
HandleUndef:                  //查看反汇编地址可知HandleUndef的地址位0x04,这个很好理解,因为一条指令4个字节
b HandleUndef   //在这里由于是精简的启动代码,所以一旦发生了未定义异常时,就让CPU自己玩死自己吧
HandleSWI:                    //反汇编地址0x08,其他分析同上
b HandleSWI
 
HandlePrefetchAbort:             //反汇编地址0x0C,其他分析同上
b HandlePrefetchAbort
 
HandleDataAbort:                  //反汇编地址0x10,其他分析同上
b HandleDataAbort
 
HandleNotUsed:                    //反汇编地址0x14,其他分析同上
b HandleNotUsed
 
HandleIRQ:                      
b HandlerIRQ       //反汇编地址0x18,看到这里相比就有点感觉了,0x18是普通中断向量地址,这个就有很                                       //多地方可说了,首先这里依然是使用B指令进行跳转,这个之所以不直接用BL的原因                                        ///是,中断还不太算是调用函数那么简单,发生中断的时候,要保存现场,而现场的数                                      //据有很多,具体为R0-R12、PC、CPSR的内容,这些都需要进栈保存,所以这些的内容不                                      //是BL一条命令能完成的,所以保存现场的内容就直接放到了中断程序中了。其次要特别                                     //注意这个里面跳转的程序时HandlerIRQ不是HandleIRQ,如果还像上面那样,那么发生中                                     //断时,CPU就会不停的循环来回跳了,所以这点需要特别留意,当然还有一种方法,就是                                     //不要这条命令的标号HandleIRQ,直接使用一条 b  HandlerIRQ即可。
 
HandleFIQ:
b HandleFIQ      //反汇编地址位0x1C,由于本程序只分析简单的普通中断,所以认为发生快速                                //中断的时候,让CPU自己玩
 
Reset:
ldr sp,=4096              //由于要在汇编中调用C函数,所以要先设置堆栈指针,具体为什么,就                                                    //不详细分析了,简单的说,C函数要使用很多的中间内存存放运算数据,所以                                             //要开辟一段堆栈用。这里还要特别提到一点,由于ARM工作模式的特点,此时                                               //设置的堆栈指针SP,即R14,对应的是系统模式下的堆栈指针寄存器,即R14_svc
bl disable_watch_dog      //关闭看门狗  
 
msr cpsr_c,# 0xd2          //设置CPU进入到中断模式
ldr sp,=3072               //由于发生中断时,要用到堆栈用于保存现场,所以需要先设置中断模式下的堆                                              //栈指针地址(设置堆栈指针就相当于开辟堆栈了,因为堆栈就是有堆栈指针的                                              //一片普通内存区域),即设置R14_irq,特别注意R14_irq和R14_svc是不一样                                              //的,只是同名,但是指向的物理地址是完全不同的。
 
msr cpsr_c,# 0xdf          //从普通中断模式返回到系统模式
 
bl init_led             //这个非常值得分析,首先这里使用了BL指令进行跳转,BL指令的特点就是,跳转                                            //的同时,会自动的将PC的值放到LR中,而且,如果后面跳转的是C函数的话,C函                                            //数中就不用设置返回命令了,而如果BL后面跟的是一个汇编子程序,那就需要程                                            //序员自己添加返回命令,这是为什么呢?如果用专业术语说,如果调用C函数,                                            //函数运行结束后,编译器会自动的将上面保存的LR中的内容减去4重新传递给                                              //PC(为什么减4下面分析),也就实现了自动返回的功能,但是汇编函数不行,因                                           //为汇编的编译器没有这项功能,所以通俗的讲,为什么C语言是高级语言,除了语                                           //法高级人性化,配套的编译器也比较人性化,会帮程序员做一些通用的工作。而                                           //汇编语言就比较一根筋,所有的事儿,哪怕是最简单的事儿,都要程序员一条一                                           //条的把代码敲上去告诉它怎么干(这也是我为什么讨厌汇编的原因,比较懒,呵                                           //呵),至于调用汇编子程序怎么返回怎么做,分析在下面
bl init_irq            //分析同上
msr cpsr_c,# 0x5f       //开中断,即允许普通中断IRQ
 
ldr lr,=halt_loop        //这个也很有意思,在这里为什么不直接用 bl main代替这两条命令呢,因                                                  //为。。。。。想嘚瑟一下(玩笑了),主要是想学习另外一种常见常用的跳转方                                            //法。BL命令很好用,但是有缺点,就是跳转的范围,因为它只能跳转区区32MB,                                           //换算成ARM的命令,也就只有8M的地址(因为一条命令4个字节),也就                                                   //是-4MB~+4MB,所以范围有限,而嵌入式程序,尤其是有操作系统时,程序存放地                                          //址跨度比较大,所以呢,需要有一个长跳转指令,所以就引出了LDR命令,这个命                                          //令的跳转范围是4G,所以知道为什么LDR长用了吧,因为无论地址在哪,它都能跳                                          //到,跳转范围大是LDR命令的优点,但是它也有缺点,就是它负责跳转,不能保存                                          //PC,如果在跳转前不往LR中放返回地址,就会出现,跳到了子程序的位置,子程序                                          //执行完后,跳不回来了,所以如果使用ldr调用子程序,一定要在调用前给LR一个                                          //返回地址。
ldr pc,=main
 
halt_loop:
b halt_loop         //main函数的返回地址,或者说是返回操作,让CPU原地踏步
 
HandlerIRQ:                   
sub lr,lr,# 4         //这条指令用于计算中断处理完毕后的返回地址,在这里有个隐含的地方,即当发生中                                        //断时,处理器会自动的向LR寄存器中存放被中断指令的地址加4,或者也可以理解成,             
                         //存放的是PC的值,而PC的值是当前运行命令地址加8,虽然发生了中断,但是CPU仍然会                                      //运行完当前命令后才去处理中断,所以LR-4的值,正是被中断指令的下一条命令,当中                                      //断处理完毕以后,返回到被中断指令的下一条指令进行执行。
stmdb sp!,{r0-r12,lr}   //入栈指令,表示将R0~R12,以及LR寄存器的内容入栈,这个命令格式暂不分析,具体的可以参考                             //相关手册
ldr lr,=int_return      //这两条命令的分析跟上面跳转到main函数原理是一样的,可以使用一条命令
                            //bl EINT_Handle代替,因为这个程序本身并不大,不会超过4Kb
ldr pc,=EINT_Handle
int_return:
ldmia sp!,{r0-r12,pc}^   //出栈指令,跟上面的入栈指令相呼应,表示将sp对应的地址内容递增(因为ARM的堆栈式满递减                              //形式)的依次存放到r0~r12,以及pc中,而且这个很有意思,按照顺序,sp即r13肯定不包括在                              //内,所以到pc的时候,赋值的内容寄存器正好是LR,而LR已经在中断开头处理了,而且^表示将                             //spsr的值复制到cpsr中,至此完成了中断的返回

关键字:ARM  启动代码  中断处理 引用地址:ARM简单启动代码及中断处理分析

上一篇:ARM之协处理器CP15
下一篇:ARM寄存器介绍

推荐阅读最新更新时间:2024-03-16 14:39

基于ARM核的ADμC7024在医疗电子中的应用
0 引言 随着信息技术的迅猛发展和人民生活水平的提高,极大地推动了医疗电子设备的发展,当今医疗电子设备的发展趋势是高精度、实时性、低功耗和小尺寸,作为医疗电子设备中核心地位的MCU(微处理器)也随着这一发展趋势向前不断衍变着。由早期的8位MCU发展到目前的32位RISC(精简指令集计算机)MCU。美国ADI公司根据市场的需要最新推出了一款基于ARM(高级精简指令集计算机)核的微处理器ADμC7024便是目前32位RISC MCU的杰出代表。ADμC7024卓越的处理能力、集成众多片上外围器件和芯片低功耗的特点,完全胜任目前医疗电子设备的需求及未来的发展目标。 本文以ADμC7024在医疗电子中监护产品脉搏血氧计的
[单片机]
Syntiant如何利用孵化器和Arm生态系统进行AI开发
本文编译自Arm官方博客,作者 Syntiant公司硬件副总裁Dave Garrett Syntiant成立于2017年,联合创始人兼首席执行官Kurt Busch经历了一个激动人心的时刻。当他观看孩子用iPad聊天时,他看到了一个商机,就是将人工智能(AI)和机器学习(ML)创新带入语音激活系统,并改变它们的交互方式。 截至2021年1月,Syntiant已向市场交付了两个AI芯片,出货量超过1000万个,其技术已在Amazon Alexa上获得认证,并在CES上获得殊荣。不到四年,该公司就从包括亚马逊,应用材料,博世,英特尔投资,微软和摩托罗拉在内的全球一些最大的投资者和公司筹集了超过6500万美元的风险投资。 这
[嵌入式]
基于ARM处理器的嵌入式防火墙总体架构设计
集中式防火墙通常架构在内部网络与外部网络之间,用于对流入和流出网络的数据包进行实时检测,过 滤存在安全威胁的数据信息.集中式防火墙处理数据信息速度快、消耗低、延迟短,目前已经广泛应用于网络 规划建设中.但是,集中式防火墙的架构实现需要浪费大量资金成本,只能够对外部网络流入的安全威胁进行检测,无法保障内部网络的安全,而且其架构依赖于网 络拓扑结构,存在较多的问题和弊端。分布式防火墙能 够解决集中式防火墙实现过程中的诸多问题。 本文研究的是基于硬件的嵌入式防火墙实现机制,给出了基于ARM处理器的嵌入式防火墙安全保 护机制总体设计,提出了嵌入式防火墙软件架构和硬 件架构,详细分析了嵌入式防火墙实现过程中的关键 技术,包括芯片选型、硬
[单片机]
基于<font color='red'>ARM</font>处理器的嵌入式防火墙总体架构设计
如何安装arm-linux-gcc编译器
如何安装ram-linux-gcc,之前安装过几次,刚开始没有成功,觉得很麻烦,后来又一次,安装成功了,爽啊,所以想跟各位分享一下。 首先准备好arm-linux-gcc的包,比如说是arm-linux-gcc-fh.tar.gz,首先是解压缩,路径可以随便放,但是个人建议最好放在/opt这个目录下面,使用如下命令: tar xvzf arm-linux-gcc-fh.tar.gz(空格)C(空格/(注意这之间的空格),然后就解压缩好了,接下来就是要修改一下配置文件了,切换到root权限,然后,输入如下命令: vi /etc/bash.bashrc 然后在最后面一行加入如下语句: expor
[单片机]
ARM内核的中断技术
1 ARM7TDMI简介 ARM7TDMI是一款经典的通用32位微处理器,采用精简指令系统(RISC)和流水线结构。典型应用如GPS、PDA、双向寻呼机、移动电话、板卡间高速通信等。 ARM7TDMI 定义有7种工作模式,本文涉及到的有:用户模式,程序正常运行时的模式;快中断模式,处理器响应快中断而进入的模式;中断模式,处理响应常规中断而进入的模式;监督模式,操作系统的保护模式。处理器响应软件中断时即进入监督模式。下面重点介绍ARM7TDMI的中断特性。主要特性如表1所列。 表1 中断特性表 向量地址 中断类型 工作模式 优先级 返回地址 0x8 软件中断 SWI模式 6 pc-4 0x18 常规则中断 IRQ模式
[单片机]
基于ARM与MEMS的AHRS设计
目前MEMS传感器在消费类电子产品中得到广泛应用,但是MEMS角速率陀螺仪存在严重的零点漂移和随机误差,在捷联惯性导航解算中会产生积分误差,难以达到应用的精度。加速度计和磁场计能分别测量出重力加速度和地磁场这两个不相关的三维矢量,可以作为平台姿态的观测矢量来校准陀螺仪。扩展卡尔曼滤波可以结合这几种传感器的特点,以陀螺仪测量得到的角速率作预测更新,以重力加速度和磁场观测更新,得到更高精度的姿态角信息。   1 硬件结构   MEMS器件的AHRS硬件基本组成为三轴角速率陀螺仪、三轴加速度计、三轴磁阻传感器和STM32系列微处理器STM32F103U8T6。航向姿态参考系统的硬件结构如图1所示。   IMU采用整合了16位的三轴
[模拟电子]
基于<font color='red'>ARM</font>与MEMS的AHRS设计
ARM嵌入式汽车节能控制系统
  引言   由于各种原因,公交车总是不断重复加速—减速或停车—再加速的过程。通过加装本节能装置,当汽车需要制动时,在主控单元的控制下,可将汽车行驶时具有的巨大动能通过空气压缩机转化成高压气体的势能并储存起来,从而实现汽车减速或停车。当汽车需要启动或加速时,用储存起来的高压气体势能代替燃油来驱动汽车,从而实现汽车能量的回收再利用,达到节能的效果。同时由于汽车在起动或加速时能耗最大,如果汽车是用燃油驱动,则此时油料燃烧不充分,燃烧效果最差,而且产生的噪音最大。   系统工作原理   本系统主要由三部分组成,即检测部分,控制部分和执行机构。检测部分包括踏板位置传感器、曲轴位置传感器、压缩机活塞位置传感器、汽车运行速度传感器、储气
[汽车电子]
从0学ARM-基于Exynos4412的pwm详解
一、什么是PWM PWM,英文名Pulse Width Modulation,是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就是说通过调节占空比的变化来调节信号、能量等的变化,占空比就是指在一个周期内,信号处于高电平的时间占据整个信号周期的百分比,例如方波的占空比就是50%. 二、PWM信号输出输出和作用 1. 如果要实现PWM信号输出如何输出呢? 1)可以直接通过芯片内部模块输出PWM信号,前提是这个I/O口要有集成的pwm控制器,只需要通过对应的寄存器即可,这种自带有PWM输出的功能模块在程序设计更简便,同时数据更精确。 2)但是如果IC内部没有
[单片机]
从0学<font color='red'>ARM</font>-基于Exynos4412的pwm详解
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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