【ARM裸板】未定义指令异常分析及示例

发布者:梦中的额吉最新更新时间:2020-03-06 来源: eefocus关键字:ARM裸板  未定义指令  异常分析 手机看文章 扫描二维码
随时随地手机看文章

1.未定义指令异常示例

根据5.1可知,执行异常处理函数之前,硬件会处理的事情:

 1.lr_und保存有被中断模式中的下一条即将执行的指令的地址

 2.SPSR_und保存被中断模式CPSR

 3.CPSR的[M4:M0]=[11011],进入到und模式

 4.跳到0x04的模式执行程序,即跳到b do_und这一指令

/*====================================异常向量表===========================================*/

_start:

b reset   //vector 0: reset(0地址对应reset)

  ldr pc, =und_addr //绝对跳转,跳转至sdram中,vector 4: und  (发生未定义指令异常,则进入“处理未定义异常函数”)


und_addr:

.word do_und //存放地址,确保这一地址存放在内存的前4K中

 /*=================================处理未定义异常=========================================*/

 do_und:


/*执行到这里之前:

*1.lr_und保存有被中断模式中的下一条即将执行的指令的地址

*2.SPSR_und保存被中断模式CPSR

*3.CPSR的[M4:M0]=[11011],进入到und模式

*4.跳到0x04的模式执行程序,即跳到`b do_und`这一指令

*/

    /* sp_und 设置栈,因为后面函数需要栈 */

    ldr sp, =0x34000000


    /* 保存现场 */

    /* lr是异常处理完后的返回地址,也需要保存 */

    stmdb sp!, {r0-r12,lr} //在und异常处理函数总有可能需要用到r0~r12,因此先保存下来


    /* 处理und异常 */

    mrs r0,cpsr //把cpsr的值放入r0

    ldr r1, =und_string

    bl printException


    /* 恢复现场 */

    ldmia sp,{r0-r12,pc}^ //将lr的值赋给pc ,`^`会把spsr的值恢复到cpsr中


und_string:

.string "undefined instruction exception"

.align 4  //确保4字节对齐


1.1 在汇编中加入string

官方文档


.string "str" Copy the characters in str to the object file. You may specify more than one string to copy, separated by commas. Unless otherwise specified for a particular machine, the assembler marks the end of each string with a 0 byte. You can use any of the escape sequences described in section Strings.


在字符串后最好加一句·.align 4 ,确保后续的程序4字节对齐


und_string:

.string "undefined instruction exception"

.align 4  //确保4字节对齐


1.2 MRS & MSR

ARM中有两条指令用于在状态寄存器通用寄存器之间传送数据


MRS: 状态寄存器到通用寄存器的传送指令

mrs r0,cpsr //将CPSR的值读出放在r0

MSR: 通用寄存器到状态寄存器的传送指令

msr cpsr, r0 //将r0的值写入CPSR

1.3 设置und的栈

由于后面需要保存寄存器数数据、以及发生函数调用并且需要传递参数,需要用到栈,因此需要先设置栈(随便指向一块未使用的内存)

    /* sp_und 设置栈,因为后面函数需要栈 */

    ldr sp, =0x34000000


1.4 保存现场

根据未定义指令异常寄存器资源,在und异常处理函数总有可能需要用到r0~r12,因此先保存下来(保存在栈中)

以及lr寄存器,后面还需要返回

stmdb sp!, {r0-r12,lr}

在这里插入图片描述

1.5 处理异常

打印提示发生未定义异常,并打印CPSR的值

mrs r0,cpsr //把cpsr的值放入r0


1.6 恢复现场

依次恢复r0~r12的值,恢复cpsr的值,并把lr的值赋给PC,

ldmia sp,{r0-r12,pc}^ //`^`会把spsr的值恢复到cpsr中


1.7 验证

CPSR = 0x600000db

确实满足CPSR的 [M4:M0] = 11011,为未定义指令异常

  • 在这里插入图片描述

在这里插入图片描述

2.程序执行过程

在这里插入图片描述

关键字:ARM裸板  未定义指令  异常分析 引用地址:【ARM裸板】未定义指令异常分析及示例

上一篇:【ARM裸板】软件中断分析及示例
下一篇:【ARM裸板】ARM模式、异常与状态

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

分析一个关于STM32 芯片异常复位的经典案例!
前言 本篇主要是介绍一种处理问题的思路,即当我们在做STM32应用开发过程中,遇到芯片异常复位,或者进入了异常处理时,如何通过集成开发环境,如IAR,KEIL等查看相应的ARM内核寄存器,定位出应用软件产生异常的地方! 问题描述 某STM32用户反馈,当使用STM32L4芯片的时候,程序运行一段时间后,会忽然复位。复位后程序继续运行,但是还会继续复位,原因不详! 问题分析 针对于此类问题,我们可以按照一个统一的思路去处理。分析本案例的大致步骤如下: 1、初步确定复位的原因,是硬件复位,如外部NRST被拉低,还是软件复位,包括软件直接调用复位,或者看门狗复位,还是低功耗模式如standby模式被唤醒时产生中断; 2、查看复位
[单片机]
<font color='red'>分析</font>一个关于STM32 芯片<font color='red'>异常</font>复位的经典案例!
Linux下ARM程序编写
 有些学习过Bootloader和内核的朋友肯定会知道,在调用C语言函数之前肯定会有一段汇编代码在前面铺路,进行一些必要的初始化工作;而那些只学过单片机而没有学过ARM的朋友肯定会觉得很奇怪,在单片机中写C代码,前面完成可以不用任何汇编代码。这是为什么呢?   这主要是因为我们的开发环境(这里主要是指编译环境)的不同,在开发单片机程序的时候,开发环境(如KEIL)会在编译C代码的时候,给我添加启动代码(startup-51)或者在编译时已经由编译器在后台为我们初始化好了。而在开发ARM程序时,ARM处 理器支持多种模式,多种功能,而在不同的领域不同的项目里面,我们可以有选择的、适当的选择这些功能,这时,编译器就不知道我们需要什么功能
[单片机]
Linux下<font color='red'>ARM</font><font color='red'>裸</font><font color='red'>板</font>程序编写
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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