历史上的今天
返回首页

历史上的今天

今天是:2024年09月02日(星期一)

正在发生

2021年09月02日 | 006_mini2440裸机异常和中断

2021-09-02 来源:eefocus

基于ARM920T的S3C2440的7种操作模式

1、User (usr): The normal ARM program execution state

2、 FIQ (fiq): Designed to support a data transfer or channel process

3、 IRQ (irq): Used for general-purpose interrupt handling

4、 Supervisor (svc): Protected mode for the operating system

5、 Abort mode (abt): Entered after a data or instruction prefetch abort

6、 System (sys): A privileged user mode for the operating system

7、 Undefined (und): Entered when an undefined instruction is executed


操作模式介绍

1、FIQ

The FIQ (Fast Interrupt Request) exception is designed to support a data transfer or channel process, and in ARM state has sufficient private registers to remove the need for register saving (thus minimizing the overhead of context switching).

Irrespective of whether the exception was entered from ARM or Thumb state, a FIQ handler should leave the interrupt by executing SUBS PC,R14_fiq,#4

2、IRQ

The IRQ (Interrupt Request) exception is a normal interrupt caused by a LOW level on the nIRQ input. IRQ has a lower priority than FIQ and is masked out when a FIQ sequence is entered. It may be disabled at any time by setting I bit in the CPSR, though this can only be done from a privileged (non-User) mode.

Irrespective of whether the exception was entered from ARM or Thumb state, an IRQ handler should return from the interrupt by executing SUBS PC,R14_irq,#4.

3、Abort

An abort indicates that the current memory access cannot be completed. It can be signaled by the external ABORT input. ARM920T checks for the abort exception during memory access cycles.

4、Software Interrupt

The Software Interrupt Instruction (SWI) is used for entering Supervisor mode, usually to request a particular supervisor function. A SWI handler should return by executing the following irrespective of the state (ARM or Thumb): MOV PC,R14_svc.

5、Undefined Instruction

When ARM920T comes across an instruction which cannot be handled, it takes the undefined instruction trap. This mechanism may be used to extend either the THUMB or ARM instruction set by software emulation. After emulating the failed instruction, the trap handler should execute the following irrespective of the state (ARM or Thumb): MOVS PC,R14_und.


异常向量地址以及模式切换

下图所示为异常向量的地址以及异常发生时进入什么模式

例如:当系统复位时进入Supervisor模式,此时程序跳转到地址0开始执行程序

在这里插入图片描述

处理异常需要进行的操作

1、Preserves the address of the next instruction in the appropriate Link Register. If the exception has been entered from ARM state, then the address of the next instruction is copied into the Link Register (that is, current PC + 4 or PC + 8 depending on the exception.

2、Copies the CPSR( Current Program Status Register) into the appropriate SPSR(Saved Program Status Registers).

3、Forces the CPSR mode bits to a value which depends on the exception.

4、Forces the PC to fetch the next instruction from the relevant exception vector.


结束异常处理时需要进行的操作

1、Moves the Link Register, minus an offset where appropriate, to the PC. (The offset will vary depending on the type of exception.)

2、Copies the SPSR back to the CPSR.

3、Clears the interrupt disable flags, if they were set on entry.


未定义指令异常、软件中断异常

当代码运行遇到未定义指令时触发未定义指令异常,并跳到异常处理函数处通过串口打印输出cpsr寄存器的当前值。



.text     /* .text部分是处理器开始执行代码的地方,指定了后续编译出来的内容放在代码段     */

    

.global _start     /* .global关键字用来让一个符号对链接器可见,可以供其他链接对象模块使用         */

                        /* .global _start让_start符号成为可见的标识符,链接器才知道跳转到什么位置                          */ 


_start:

    b reset          /* vector 0    : Reset                 -> Supervisor      */

    ldr pc, und_addr /* vector 4    : Undefined instruction -> Undefined       */

    ldr pc, swi_addr /* vector 8    : Software Interrupt    -> Supervisor      */

    b halt /* vector 0x0c : Abort (prefetch)      -> Abort           */

    b halt /* vector 0x10 : Abort (data)          -> Abort       */

    b halt /* vector 0x14 : Reserved              -> Reserved   */

    ldr pc, irq_addr    /* vector 0x18 : Irq                   -> Irq   */

    b halt /* vector 0x1c : Fiq                   -> Fiq   */


und_addr:

.word do_und            /* 在当前位置放一个word型的值,这个值就是do_und */


swi_addr:

.word do_swi


irq_addr:

.word do_irq


do_und:

/****************************************************************

执行到这里之前:

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

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

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

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

***************************************************************/


ldr sp, =0x34000000 /* 设置堆栈 */


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

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

stmdb sp!, {r0-r12, lr}  

/* 保存现场 */

/* 处理und异常 */

mrs r0, cpsr

ldr r1, =und_string

bl printException

/* 恢复现场     */

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

und_string:

.string "undefined instruction exception"


.align 4


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

bl printSWIVal

  /* 恢复现场 */

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

swi_string:

.string "swi exception"


.align 4


do_irq:

/*********************************************************** 

* 执行到这里之前:

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

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

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

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

***********************************************************/


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

 

ldr sp, =0x33d00000


/* 保存现场 */

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

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

sub lr, lr, #4

stmdb sp!, {r0-r12, lr}  

/* 处理irq异常 */

bl handle_irq

/* 恢复现场 */

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


reset:

ldr r0, =0x53000000 /* 关闭看门狗       */

ldr r1, =0

str r1, [r0]

/* 设置MPLL, FCLK : HCLK : PCLK = 400m : 100m : 50m  */

/* LOCKTIME(0x4C000000) = 0xFFFFFFFF   */

ldr r0, =0x4C000000

ldr r1, =0xFFFFFFFF

str r1, [r0]


/* CLKDIVN(0x4C000014) = 0X5,tFCLK:tHCLK:tPCLK = 1:4:8 */

ldr r0, =0x4C000014

ldr r1, =0x5

str r1, [r0]


/* 设置CPU工作于异步模式 */

mrc p15,0,r0,c1,c0,0

orr r0,r0,#0xc0000000   /* R1_nF:OR:R1_iA     */

mcr p15,0,r0,c1,c0,0

/* 一旦设置PLL, 就会锁定lock time直到PLL输出稳定 */

/* 然后CPU工作于新的频率FCLK */

ldr r0, =0x4C000004

ldr r1, =(92<<12)|(1<<4)|(1<<0)

str r1, [r0]


/*********************************************************************

* 设置内存: sp 栈 

* 分辨是nor/nand启动

* 写0到0地址, 再读出来

* 如果得到0, 表示0地址上的内容被修改了, 它对应ram, 这就是nand启动

* 否则就是nor启动

*********************************************************************/

mov r1, #0

ldr r0, [r1] /* 读出原来的值备份 */

str r1, [r1] /* 0->[0] */ 

ldr r2, [r1] /* r2=[0] */

cmp r1, r2    /* r1==r2? 如果相等表示是NAND启动 */

ldr sp, =0x40000000+4096 /* 先假设是nor启动 */

moveq sp, #4096  /* nand启动 */

streq r0, [r1]    /* 恢复原来的值 */


bl sdram_init

/* 重定位text, rodata, data段整个程序 */

bl copy2sdram

/* 清除BSS段 */

bl clean_bss


/********************************************************************

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

* 现在, 切换到usr模式

* MRS指令用于将程序状态寄存器的内容传送到通用寄存器中

* MSR指令用于将操作数的内容传送到程序状态寄存器的特定域中

*******************************************************************/

mrs r0, cpsr          /* 读出cpsr */

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

bic r0, r0, #(1<<7)  /* 清除I位, 使能中断 */

msr cpsr, r0

/* 设置 sp_usr */

ldr sp, =0x33f00000


ldr pc, =uart

uart:

bl uart0_init


bl print1


ldr pc, =und_code

/* 故意加入一条未定义指令 */

und_code:

.word 0xdeadc0de  /* 未定义指令 */

bl print2


swi 0x123 /* 执行此命令, 触发SWI异常, 进入0x8执行 */


ldr pc, =main  /* 绝对跳转, 跳到SDRAM */


halt:

b halt


按键中断异常

1、按键原理图

在这里插入图片描述

由上图可知四个按键分别挂载在EINT0、EINT2、EINT11、EINT19上,其对应的2440的I/O口如下:

在这里插入图片描述

2、按键中断初始化程序


/* 初始化按键为外部中断源 */


void key_eint_init(void)

{

/* 1、 配置对应引脚为外部中断模式 */

GPFCON &= ~((3 << 0) | (3 <<  4));             //对应位清零(GPF0、GPF2)

GPFCON |=  ((2 << 0) | (2 <<  4));    //设置对应引脚为外部中断模式

GPGCON &= ~((3 << 6) | (3 << 22));            //对应位清零(GPG3、GPG11)

GPGCON |=  ((2 << 6) | (2 << 22));    //设置对应引脚为外部中断模式


/* 2、 配置对应引脚为内部上拉模式 */

GPFUP &= ~((1 << 0) | (1 <<  4));    // S2 、S3

GPGUP &= ~((1 << 6) | (1 << 22));    // S4 、S5


/* 3、 配置中断的双边沿触发方式                */

EXTINT0 |=  ((7 << 0) | (7 <<  8));    // S2 、S3

EXTINT1 |=  (7 << 12);    // S4

推荐阅读

史海拾趣

Hisetec Electronic Co Ltd公司的发展小趣事

背景:在21世纪初,电子产品市场迅速增长,智能手机和平板电脑等移动设备成为新宠。Hisetec Electronic Co Ltd公司凭借其在微电子封装技术的深厚积累,成功研发出一种高密度、低功耗的封装解决方案,大幅提升了手机芯片的能效比。

发展:该技术迅速被市场认可,多家知名手机制造商如三星、苹果等纷纷采用,Hisetec公司因此订单激增,市场份额大幅提升。公司不仅扩大了生产规模,还进一步加大了研发投入,不断推出新的封装技术,巩固了其在电子封装领域的领先地位。

Axiomtek公司的发展小趣事

背景:人才是企业发展的第一资源。Hisetec Electronic Co Ltd公司始终将人才战略作为企业发展的核心战略之一。

发展:公司建立了完善的人才培养、引进和激励机制,积极吸引国内外优秀人才加盟。同时,公司还加强与高校和科研机构的合作,共同培养高素质的电子专业人才。此外,公司还注重员工的职业发展和企业文化建设,营造了良好的工作环境和氛围。这些举措为Hisetec公司的可持续发展提供了有力的人才保障。

请注意,以上故事均为虚构,旨在展示电子行业企业可能的发展路径和策略。实际上,Hisetec Electronic Co Ltd公司的具体发展历程和故事可能有所不同。

Advanced Technology Corp公司的发展小趣事

ATC公司的初创时期充满了挑战与艰辛。公司由几位电子工程领域的专家创立,他们凭借对技术的深刻理解和敏锐的市场洞察,决定投身于电子产品的研发与生产。在资金匮乏、市场竞争激烈的环境下,他们夜以继日地工作,不断试验、改进,最终成功研发出了一款具有竞争力的电子产品,为公司的发展奠定了坚实基础。

Amphion Semiconductor Ltd公司的发展小趣事

为了进一步提升市场份额和品牌影响力,ATC公司积极开展市场拓展活动。公司加强与国际市场的联系,与多家知名企业建立了战略合作关系,共同开拓新的市场领域。同时,ATC公司还注重品牌塑造,通过参加行业展会、举办技术研讨会等方式,提升品牌知名度和美誉度。这些努力使得ATC公司在全球电子市场中占据了一席之地。

FDI [Future Designs , Inc.]公司的发展小趣事

随着环保意识的提高,电子产品的绿色环保问题日益受到关注。FDI公司积极响应这一趋势,投入大量资源研发绿色电子产品。公司采用环保材料和生产工艺,推出了一系列符合国际环保标准的电子产品。这些产品不仅具有优良的性能和品质,而且对环境友好,深受消费者的喜爱。

EMI Filter Company公司的发展小趣事

Panasonic作为电子行业的巨头,对EMI滤波器市场也早有布局。他们采取的是多元化的产品战略,针对不同行业和应用场景,推出了多种类型的EMI滤波器。无论是用于消费电子产品的片式滤波器,还是用于工业设备的大功率滤波器,Panasonic都能提供高质量的产品。这种多元化的产品战略,使得Panasonic在EMI滤波器市场上占据了重要的地位。他们的产品广泛应用于家电、汽车电子、工业自动化等领域,为全球电子行业的发展做出了重要贡献。

问答坊 | AI 解惑

一些电子设计的基础知识~~~

本帖最后由 paulhyde 于 2014-9-15 09:26 编辑 一些电子设计的基础知识~~~  …

查看全部问答>

[ARM烧写FLASH问题]

大家好,有个问题请教下大家啊。。很迷惑 因为有2410板子,是NAND FLASH + SDRAM 类型, 如果我想试着烧写FLASH,用JTAG,但是我没有并口,或者是USB转并口但好像转并口只能用于打印,无法JTAG。 于是买了一个ULINK2的防止品ULINK-ME, 可我才 ...…

查看全部问答>

PC与单片机串口通讯,系统重起

我是个菜鸟,最近要做个接收串口数据的程序,用的是VC6.0的oncomm控件来做的。照着龚建伟写的串口调试助手的那篇文章编写了代码,可以将单片机与PC机相连后一运行程序系统就重起,我觉得是接收的数据量太大将内存中系统数据区覆盖造成系统崩溃,可 ...…

查看全部问答>

常用集成电路的检测

常用集成电路的检测      1.微处理器集成电路的检测 微处理器集成电路的关键测试引脚是VDD电源端、RESET复位端、XIN晶振信号输入端、XOUT晶振信号输出端及其他各线输入、输出端。在路测量这些关键脚对地的电阻值和电压值,看 ...…

查看全部问答>

ModelSim SE 6.5破解 问题求教

ModelSim SE 6.5破解 1、生成LECENSE.dat文件 下载一个个ModelSim SE 6.5的破解文件,我下载的是ModelSim6.5_KeyGen文件夹,里面有个MentorKG.exe文件,双击它产生LECENSE.txt文件,将文件后缀txt改成dat。复制LECENSE.dat到Modelsim SE 6.5\\w ...…

查看全部问答>

求问单轴陀螺仪倾斜时测量到的数据是什么意义?!

RT求问单轴陀螺仪倾斜时测量到的数据是什么意义?!输出的数据对应的坐标系是芯片表面坐标还是惯性坐标哪位专业人士能解释一下?…

查看全部问答>

LPC800 板子已经发出来了

我刚才查了一天快递单号; 板子已经发出来了; 请大家注意查收; 查询网址:http://www.yto.net.cn/cn/index/index.html 同时,感谢网站的各位工作人员,节日期间还在工作! [ 本帖最后由 desk1983 于 2013-6-11 10:35 编辑 ]…

查看全部问答>

初学DSP,用ccs4运行的时候总是出现直接关闭,希望前辈们帮助,多谢

CCS4运行以后,直接关闭,然后跳出一个窗口,希望前辈们指导一下,多谢…

查看全部问答>

Altium designer 圆弧形阵列粘贴和极坐标的使用

是这样的,今天下午(6/11)有个朋友问到我一个圆弧形阵列粘贴的问题,提出了如下图所示的要求, 所以我在想可能做LED行业和其他的一些朋友,可能也会碰到这样的问题。我就捯饬了一番,然后 做个记录方便自己查看,也方便需要的朋友看看。 ...…

查看全部问答>

2015年高频组题目猜想

大神们,求猜题……器件清单看的我好迷茫啊 …

查看全部问答>