s3c2440——swi异常

发布者:Jinghua6666最新更新时间:2021-09-30 来源: eefocus关键字:s3c2440  系统复位 手机看文章 扫描二维码
随时随地手机看文章

系统复位的时候,从0地址开始执行,这个时候系统处于svc管理模式。


一般而言,我们的app应用程序是处于用户模式的,但是用户模式不能访问硬件,必须处于特权模式才可以。所以这里我们用swi软中断方式来实验。swi异常会让cpu进入svc模式。


首先,系统复位,执行代码,此刻处于svc模式,然后我们切换模式改变成为用户模式,再使用swi指令,处理软中断。

由于切换了模式,需要重新设置栈,因为我们要调用c函数,而栈我们是在sdram的最高地址往下开辟的。


这里,我们的swi异常发生时,硬件会让程序从地址0x8的地方开始执行,所以我们仿照之前的未定义异常编写软中断处理函数:


do_swi:

    /* 执行到这里之前:

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

     * 2. SPSR_svc保存有被中断模式的CPSR

     * 3. CPSR中的M4-M0被设置为10011, 进入到svc模式

     * 4. 跳到0x08的地方执行程序 

     */


    /* sp_svc未设置, 先设置它 */

    ldr sp, =0x33e00000


    /* 保存现场 */

    /* 在swi异常处理函数中有可能会修改r0-r12, 所以先保存 */

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

    stmdb sp!, {r0-r12, lr}  


    //mov r4, lr

    

    /* 处理swi异常 */

    mrs r0, cpsr

    ldr r1, =swi_string

    bl printException


    //sub r0, r4, #4

    ldr r0,=my_swi

    bl printSWIVal

    

    /* 恢复现场 */

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

    

swi_string:

    .string "swi exception"


.align 4


韦老大的代码通过swi异常保存lr的方式来达到读取软中断号,这样其实麻烦了,所以我直接在我们的swi 0x123处加上标签(my_swi:),这样直接就知道swi 0x123这条指令的地址,解引用这个地址,就可以得到0x123这个数值,而不用通过保存lr的值之后,再减去4的方式,可读性更高,代码也更简单呀!


这样,当代码运行到swi 0x123是,就会出现我们软中断异常处理,打印消息如下:

先发生未定义异常,然后发生swi异常。

上图是swi异常的打印函数,为什么取地址解引用之后,还要对0xff000000取反相与呢?

我们看看arm指令格式:

我们忽略cond条件(全为1,上篇随笔也有说到),而且紧跟着的4位也都是1,所以高八位都是1,即ff,所以我们要把高八位清零,剩下的就是我们my_swi标签地址内存中正真的数据了。


再说一下切换成usr用户的时候我们使用了 bic指令。


BIC指令的格式为:
BIC{条件}{S}  目的寄存器,操作数1,操作数2
BIC指令用于清除操作数1的某些位,并把结果放置到目的寄存器中。操作数1应是一个寄存器,
操作数2可以是一个寄存器、被移位的寄存器、或一个立即数。操作数2为32位的掩码,如果在
掩码中置了某一位1,则清除这一位。未设置的掩码位保持不变。
eg:
bic r0,r0,#0x1f
0x1f=11111b
其含义:清除r0的bit[4:0]位。

 

然后:

msr和mrs很像,不要混淆了。

mrs:(r:寄存器 ,s:状态  英文缩写)

将状态寄存器的内容传送至通用寄存器

msr:(s:状态 ,r:寄存器)

通用寄存器传送至状态寄存器传送指令

msr和mrs这两个指令从右往左看这三个字母,开头都是m就不管了,sr表示r->s(r到s),rs表示s->r(s到r),就是把什么寄存器传到什么寄存器去。

比如我们上面的msr cpsr, r0:表示把通用寄存器r0传送到状态寄存器cpsr。

关键字:s3c2440  系统复位 引用地址:s3c2440——swi异常

上一篇:ARM的7种工作模式、37个通用寄存器、CPSR程序状态寄存器
下一篇:TQ2440裸机中断(软中断swi)

推荐阅读最新更新时间:2024-11-08 11:04

基于ARM9芯片的S3C2440和Linux操作系统设计SPI驱动程序
  在嵌入式开发过程中,许多系统通常使用串口驱动来满足通信要求,但在实际应用中,使用SPI通信方式会更加高效和快捷[2]。SPI接口是一种高速、高效的串行接口技术,因而SPI设备在数据通信应用中十分方便[3]。本文基于ARM9芯片的S3C2440和Linux操作系统,设计了一种SPI驱动程序,该驱动程序功能可靠灵活、易于移植,可应用于多种嵌入式平台,实现ARM与设备之间的通信。   1 硬件说明   1.1 S3C2440开发平台   采用三星公司的SoC芯片S3C2440[4]作为核心处理器,主频为400 MHz,并与64 MB SDRAM和64 MB NAND Flash共同组成核心部分。此外,该平台也为用户提供了大量的通
[单片机]
基于ARM9芯片的<font color='red'>S3C2440</font>和Linux操作<font color='red'>系统</font>设计SPI驱动程序
基于S3C2440嵌入式Linux的步进电机驱动程序
在嵌入式Linux开发过程中需要为指定设备编写和编译驱动程序,这与以往在PC机上的Linux驱动开发明显不同,本文设计了基于S3C2440嵌入式Linux下激光雕刻系统的步进电机驱动程序。 1 硬件系统的设计 步进电机开环控制系统主要由中央控制器、步进电机驱动器、传感器以及步进电机四大部分组成。本系统采用基于ARM920t内核的S3C244 0A微处理器作为控制系统的中央控制器,该芯片主频400MHz,最高可达到533MHz,内含多种设备接口,存储器使用64MB的Nand Flash和64MB的SDRAM。图1所示为控制系统框图。 2 系统的工作原理 本系统主要控制两个两相混合式步进电机,分别代表X轴和Y轴带动
[单片机]
基于<font color='red'>S3C2440</font>嵌入式Linux的步进电机驱动程序
keil4.74中运行s3c2440程序出现警告 进行一步骤修改
安装提示 一步一步的修改 解析 警告 warning: A1608W: MOV pc, rn  instruction used, but BX  rn  is preferred。  这需要配置keil软件 在option属性中Asm选项卡中去掉Enable ARM/Thumb Interworking选项。 编译出现一个警告 src2440init.s(341): warning: A1876W: Use of '|' as a synonym for the :OR: operator is deprecated. 警告信息:warning: A1876W: Use of ‘|’ as
[单片机]
keil4.74中运行<font color='red'>s3c2440</font>程序出现警告 进行一步骤修改
移植Linux-3.4.2内核到S3C2440
一、BootLoader引导内核过程 1、Bootloader的工作 1.1、将内核读入内存 1.2、保存内核启动参数到指定位置,内核启动时去这个位置解析参数 1.3、启动内核、传入机器ID 二、内核的启动流程 内核首要目的是挂载根文件系统,启动应用程序,内核启动的过程大致为以下几步: 1.检查CPU和机器类型 2.进行堆栈、MMU等其他程序运行关键的东西进行初始化 3.打印内核信息 4.执行各种模块的初始化 5.挂接根文件系统 6.启动第一个init进程 对于ARM的处理器,内核第一个启动的文件是arc/arm/kernel下面的head.S文件 第一阶段: 首先截取部分head.S文件 ENTRY(stext
[单片机]
s3c2440看门狗定时器的应用
看门狗定时器的主要作用是在程序因为干扰而跑飞后,能够使系统复位,不至于使系统永远的死下去。 它的原理与一般的定时器没有多大区别,就是先要设置好一段时间,当超过这段时间后,就从当前运行的程序中跳出进入中断处理程序中。但两者的主要差别是,一般的定时器中断是我们希望它发生的,因此我们不会在定时器中断发生前的那个时间段内干预它;而看门狗定时器中断是我们不希望它发生的,因此我们要想方设法地避免其发生。主要的方法就是在中断发生前,重新对看门狗定时器的寄存器进行赋值,使它的定时器重新开始计时。这种方法俗称喂狗,形象地比喻就是一条看门狗每隔一段时间(比如说一个小时)就会饿,所以就要叫唤,唯一使它不叫的方法就是给它喂食,那么下次叫唤的时间就是从当
[单片机]
1.10.2_I2C_S3C2440的I2C控制器_P
2440通过I2C总线连接设备(AT24Cxx),芯片内部有一个I2C控制器。 当主机(2440)Master为Transmitter时,从机Slave为Receiver,当主机Master为Receiver时,从机Slave为Transmitter。 下图是2440的I2C总线框图。从左往右看,首先是I2C的时钟,I2C的时钟源是PCLK(50MHz),经过一个4bit的分频器,产生I2C的时钟。通过IICSTAT寄存器发出信号,通过IICDS发送数据或接受数据。 数据的传输格式如下图如所示。首先发出开始信号S,然后是7位的从设备地址,1位的读写标志位,然后等待从机返回一个ACK信号,如果是发送数据,那么就将1B数
[单片机]
1.10.2_I2C_S3C2440的I2C控制器_P
AD9779A的寄存器配置及PLL频带优化
    随着科学技术的发展,通信、测量等各个领域对信号源的要求越来越高,高速任意波形发生器成为市场的热点。高速DAC作为任意波形发生器的关键部分,其性能对高速信号有着极大的影响。AD9779A是目前国内能买到的性能较高的高速DAC芯片,内部集成PLL倍频电路、同步控制、增益控制等功能模块,通过SPI接口和外部通信,可以设置优化各种功能以达到最佳性能。 1 AD9779A简介     AD9779A是Analog Devices公司生产的双通道16位高速宽动态范围数DAC,采样率1Gsps,允许高至奈奎斯特频率的多载波生成。0.18μm CMOS工艺制作,工作电压1.8~3.3 V,采样率1 Gsps时功耗1 W,具有高速、低功
[网络通信]
基于ARM9处理器S3C2440的GPS导航终端机的设计
0 引言     随着汽车等各种车辆交通工具的普及,车辆导航设备的需求也变得日益旺盛。作为车载设备.不仅要有可靠的性能,而且需要具有便携、低功耗和低价格等特点。而采用基于ARM微处理器的嵌入式系统与GPS模块相配合的GPS导航终端机的设计方案,可以很好的满足这一系统需求。为此,本文介绍了一种利用ARM9开发板和GPS模块实现GPS导航功能的终端机的软硬件结构和设计方法。 1 GPS导航系统结构     本文所介绍的GPS全球定位导航系统按功能可分为嵌入式主控模块、GPS模块、显示模块、扩展模块及供电模块等五大部分。     嵌入式主控模块基于S3C2440处理器,主要负责对GPS导航模块数据的响应、处理和控制。在硬件上,主控模块就
[嵌入式]
热门资源推荐
热门放大器推荐
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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