ARM920T_内核 und与svc异常模式分析

发布者:532829319hmk最新更新时间:2019-08-22 来源: eefocus关键字:ARM920T  内核  und  svc  异常模式 手机看文章 扫描二维码
随时随地手机看文章

一、undefined异常模式

0. 当执行未定义指令时进入und模式,进入过程:


CPU跳至0x4地址执行代码,自动保存CPSR寄存器值至SPSR寄存器,我们要做的就是在0x4处跳转到另一段代码,用这段代码完成现场保护,以及异常处理,最后退出异常。此处使用NOR启动,并且在0x0处执行reset时已经将NOR中的所有代码重定位至SDRAM中,所以跳转时不能用相对跳转(b和bl),必须使用绝对地址跳转,这样CPU将到SDRAM(0x30000000)中执行代码。


ldr pc, =und /*vector 4*/

    und:

/*设置专属sp_und*/

ldr sp,=0x34000000

/*保护现场*/

stmdb sp!, {r0-r12,lr}

/*异常处理*/

bl print2

mrs r0,cpsr

ldr r1,=und_string

bl printException

/*恢复现场*/

ldmia sp!, {r0-r12,pc}^

und_string:

.string "und exception!"

.align(4)

 

1. 因为und模式有自己的专属sp_und所以第一步设置sp地址


2. CPSR寄存器已经有硬件自动保存,此处只需要保存r0-r12和lr寄存器(lr保存执行未定义指令时的下一条指令的地址),此处我加了打印调试信息的print函数,调试关键点:调试函数不能在进入异常后放在保护现场的代码之前,否则异常的现场被改变,之后程序必然跑飞。


3. 异常处理部分分别用r0和r1传出cpsr的值和字符串"und exception!"的地址,用printException函数打印出。


4. 最后恢复现场,当{  }中有pc时,加^会自动将SPSR的值恢复至CPSR。


5. 未定义指令部分:


ldr pc,=uart

uart:

bl uart0_init

bl print1

und_code:

.word 0xdeadc0de

6. uart是为了初始化串口,以便打印调试信息,und_code是未定义指令,此处有bug,注释掉bl  print1时不能发生未定义异常,未debug


输出结果:

cpsr值得M4-M0为11011同下图的数据手册中的值一致

2018.12.3补充,print1处的bug是因为print1改变了cpsr的值使0xdeadc0de成为不可执行指令,debug方法,去掉print1,未定义指令改为0xeeadc0de.


二、svc异常模式

0. 异常的进入与处理与und异常几乎一样,注意点为:


/* 复位之后, cpu处于svc模式

* 现在, 切换到usr模式

*/

mrs r0, cpsr      /* 读出cpsr */

bic r0, r0, #0xf  /* 修改M4-M0为0b10000, 进入usr模式 */

orr r0, r0, #0x10

msr cpsr, r0

 

/* 设置 sp_usr */

ldr sp, =0x33f00000

1. 执行swi 0x***  指令,内核从用户模式切换至svc模式,CPU跳至0x4地址执行代码,之后同und异常流程一样。


ldr pc, =swi /*vector 8*/

swi:

/*设置专属sp_svc*/

ldr sp,=0x33e00000

/*保护现场*/

stmdb sp!, {r0-r12,lr}

/*异常处理*/

mov r4,lr

bl print4

mrs r0,cpsr

ldr r1,=swi_string

bl printException

sub r0, r4, #4

bl printSWIVal

/*恢复现场*/

ldmia sp!, {r0-r12,pc}^

swi_string:

.string "swi exception!"

.align (4)

2. lr 保存了执行的swi 0x***  指令的下一条指令的地址,将lr-4即可得到swi指令的地址,printSWIVal打印了该处的值。


在将 lr 的值取出至r0前不能做其他操作,例如输出调试信息,否则 之前 lr 的值将被改变


3.输出结果:

cpsr的M4-M0为10011与数据手册一致

SWI val也与进入时的指令相同


关键字:ARM920T  内核  und  svc  异常模式 引用地址:ARM920T_内核 und与svc异常模式分析

上一篇:C语言函数指针数组在ARM中断中的应用
下一篇:S5PV210开发 -- 前言

推荐阅读最新更新时间:2024-11-10 14:33

Linux-2.6.32.2内核在mini2440上的移植(四)---根文件系统制作(3)
移植环境 1,主机环境:VMare下CentOS 5.5 ,1G内存。 2,集成开发环境:Elipse IDE 3,编译编译环境:arm-linux-gcc v4.4.3,arm-none-linux-gnueabi-gcc v4.5.1。 4,开发板:mini2440,2M nor flash,128M nand flash。 5,u-boot版本:u-boot-2009.08 6,linux 版本:linux-2.6.32.2 7,参考文章: 嵌入式linux应用开发完全手册,韦东山,编著。 Mini2440 之Linux 移植开发实战指南 制作linux下根文件系统 系统启动挂载根文件系统时Kernel panic
[单片机]
3.4.2内核下I2C驱动之24CXX实例
at24cxx_dev.c部分: #include linux/kernel.h #include linux/module.h #include linux/platform_device.h #include linux/i2c.h #include linux/err.h #include linux/regmap.h #include linux/slab.h static struct i2c_board_info at24cxx_info = { I2C_BOARD_INFO( at24c08 , 0x50), }; static struct i2c_client *at2
[单片机]
瑞昱获授权使用Cadence Tensilica HiFi 音频/语音DSP IP内核
全球电子设计创新领先企业Cadence设计系统公司(NASDAQ:CDNS)今天宣布,瑞昱半导体公司(Realtek Semiconductor Corp)获得Cadence Tensilica(Cadence® Tensilica®)授权,可使用HiFi 音频/语音DSP(数字信号处理器)IP内核,配合Sensory公司(IC和嵌入式软件解决方案提供商)的TrulyHandsFree™方案一起,用以实现长时开启(Always-on)语音控制与识别技术。这种低功耗软硬件混合解决方案使得瑞昱可以向其移动通讯和电脑用户以最低功耗支持长时开启语音控制与识别的功能,这是一个非常显著的竞争优势。 Cadence Tensilica
[嵌入式]
基于Cortex-M3内核的TFT触摸屏在环境监控系统中的应用
0 引言 触摸屏是一种新型的电子输入设备,是目前最简单、方便、自然的一种人机交互方式,它赋予了多媒体以崭新的面貌,是极富吸引力的全新多媒体交互设备。将ARMCortex-M3内核和TFT触摸屏结合在一起,以环境监控系统为应用,对ARM公司的Cortex-M3内核进行了分析,并研究了Cortex-M3内核驱动TFT液晶屏幕的可行性。 1 系统工作原理 无线环境监控系统总体的设计框图如图1所示。以基于第二代Cortex-M3内核的LPC1758为核心,以TFT触摸屏为显示和控制单元,以2.4 GHz无线模块为通信单元,合理移植μCOS-II系统,对环境参数进行监测和控制。 2 硬件电路设计与实现 2.1 电源方案 硬件电路降压
[单片机]
基于Cortex-M3<font color='red'>内核</font>的TFT触摸屏在环境监控系统中的应用
凌力尔特推出低相位噪声整数N合成器内核 LTC6950
具 PLL 的 5 输出超低抖动时钟分配器,提供独特的多芯片输出同步方法。 加利福尼亚州米尔皮塔斯 (MILPITAS, CA) 2015 年 1 月 21 日 凌力尔特公司 (Linear Technology Corporation) 推出低相位噪声整数 N 合成器内核 LTC6950,该产品具超低抖动时钟分配输出电路。LTC6950 非常适用于产生和分配具高信噪比 (SNR) 时钟数据转换器必不可少的低抖动信号。当数字化或合成高模拟频率时,保持数据转换器时钟低抖动是实现出色 SNR 水平的基础。例如,新式电子系统需要用 ADC 直接数字化 RF 和高 IF 信号。凭借 18fsRMS 抖动 (在 12kHz
[网络通信]
凌力尔特推出低相位噪声整数N合成器<font color='red'>内核</font> LTC6950
minis3c2440移植之内核移植
说在前头:一般是基于支持s 3c2440的内核文件作相应的修改以适应自己的需求,如果单是纯粹的修改不支持s3c2440的内核文件或者自己写s3c2440的内核文件将会非常费时费事,也是一个人在短时间难以完成的工作。下面的修改也就是最基本的内核文件所必须的步骤,也就是我们所做的工作就是一个最小文件系统(最小文件系统:能是能使整个系统跑起来的系统软件和硬件)。一般的编程思路也是首先实现一个最基本的功能,再此基础上添加其他的功能,切忌一次性的写完全部的代码,然后已编译出现了一大堆错误,那可就真的挂了。 一、将linux-2.6.18.tar内核源代码的压缩包拷贝到linux的根目录下进行解压,然后进入linux-2.6.18的目录下修改配
[单片机]
Atmel开始提供Cortex-M7内核MCU,性能业界最高
Atmel供应基于ARM Cortex-M7的MCU,Atmel | SMART SAM S/E系列MCU目标面向物联网和工业市场 Atmel | SMART ARM Cortex-M7 MCU提供广泛的软件生态系统和第三方支持以及先进的内存和连接技术,性能比排名第二的竞争对手高50% 全球微控制器(MCU)及触控技术解决方案领域供应商Atmel公司 (纳斯达克股票交易代码:ATML)今日宣布,公司已开始批量生产市场上性能最高、基于ARM Cortex -M的MCU产品 Atmel | SMART SAM S70和E70系列。 与最接近的竞争对手相比,这些MCU的性能高出 50%,拥有更大的可配置SRAM、更大的
[单片机]
Linux内核异常处理体系结构详解(一)
【首先来区分一下两个概念:中断(Interrupt)和异常(Exception)。中断属于异常的一种,就拿2440开发板来说,他有60多种中断源,例如来自DMA控制器、UART、IIC和外部中断等。2440有一个专门的中断控制器来处理这些中断,中断控制器在接收到这些中断信号之后就需要ARM920T进入IRQ或FIQ模式进行处理,这两种模式也是中断异常的仅有模式。而异常的概念要广的多,它包括复位、未定义指令、软中断、IRQ等等。还有一点知识就是,中断这种异常在响应之前到来之前是需要程序员进行什么优先级、是否要屏蔽信号之类的初始化的,而其他比如未定义指令是不用的,只要发生了就跳到异常向量入口取址执行。因此下面初始化内容中的第(2)点是
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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