GNU μC/OS-II 在 S3C2440 上中断的实现

发布者:MysticalEssence最新更新时间:2024-08-09 来源: elecfans关键字:GNU  μC  OS-II  S3C2440  中断 手机看文章 扫描二维码
随时随地手机看文章

上一篇文章介绍了S3c2440的中断体系结构,今天我们来分析一下GNU-uC/OS-II在S3c2440上中断的实现。


首先找到IRQ的中断的向量,位于 2440init.S :

OK ,我们通过名字找到了这个函数:


OS_CPU_IRQ_ISR:


STMFD   SP!, {R1-R3}            

MOV     R1, SP

ADD     SP, SP, #12                   

SUB     R2, LR, #4             


MRS     R3, SPSR        


MSR     CPSR_cxsf, #SVCMODE|NOINT 


STMFD   SP!, {R2}              

STMFD   SP!, {R4-R12, LR}


LDMFD   R1!, {R4-R6}

STMFD   SP!, {R4-R6}

STMFD   SP!, {R0}           


STMFD   SP!, {R3}         

LDR     R0,=OSIntNesting                

LDRB    R1,[R0]

ADD     R1,R1,#1

STRB    R1,[R0]


CMP     R1,#1                           

BNE     1f


LDR     R4,=OSTCBCur           

LDR     R5,[R4]

  STR     SP,[R5]  

1:

MSR    CPSR_c,#IRQMODE|NOINT   

LDR     R0, =INTOFFSET

    LDR     R0, [R0]

LDR     R1, =INTMSK

LDR     R1, [R1]

MOV     R3, #1

LSL     R4, R3,R0

TST     R4, R1

BNE 2f

    LDR     R1, =IRQ_STARTADDRESS

MOV     LR, PC

    LDR     PC, [R1, R0, LSL #2]


2:

LDR     R0, =INTOFFSET

    LDR     R0, [R0]

MOV     R1, #1

MOV     R1, R1, LSL R0

LDR     R0, =SRCPND

LDR     R2, [R0]

ORR     R2, R1,R2

STR     R2, [R0]


LDR     R0, =INTPND

LDR     R2, [R0]

ORR     R2, R1,R2

STR     R2, [R0]

MSR CPSR_c,#SVCMODE|NOINT

BL OSIntExit


LDMFD   SP!,{R4}

MSR SPSR_cxsf,R4

LDMFD   SP!,{R0-R12,LR,PC}^            

有点长,我们挑关键的部分分析。

看这三行代码:


LDR     R1, =IRQ_STARTADDRESS

MOV     LR, PC

LDR     PC, [R1, R0, LSL #2]

IRQ_STARTADDRESS 是这样定义的:


.equ IRQ_STARTADDRESS , 0x33ffff00


当前PC保存到LR,然后PC直接跳到了 R1 + R0 * 4 这个地址处(LSL #2 代表左移2位,相当于 *4)。


R0的值来自这个寄存器


LDR     R0, =INTOFFSET

LDR     R0, [R0]

上一篇文章中我们也说过了,INTOFFSET 这个寄存器可以查出当前是哪个中断源在发生请求。


假如现在Timer1请求中断,那么 INTOFFSET 的值就是 11.


R1 + R0 * 4 的结果计算得出就是 0x33FFFF2C 。


这个地址处是什么数据呢?


我们在Timer初始化程序中找到了这个:


pIRQ_TIMER1 = (uint32)OSTickISR;


头文件中找到了这个:

OK,这样就在 0x33FFFF2C 地址处存储了 OSTickISR 的入口地址,从而就执行了Timer1的中断服务程序。

执行完ISR之后,汇编的那段程序之后又完成了清中断的操作。

其实在这个过程中有一个要点容易被忽视,IRQ异常发生时,PC跳转到异常向量处,那么IRQ异常向量应该存储在 0x18 这个位置处的啊,可我们一开始说到的是执行 'b OS_CPU_IRQ_ISR' 这条语句,它的地址应该是0x30000018呀(我们的程序在SDRAM中运行,如图定义):

可为什么执行的是它呢?

这个时候MMU这位大将就要派上用场了,程序中通过这条语句将地址做了映射,

MMU_SetMTT(0x00000000,0x03f00000,(uint32)_start,RW_CB)

所以找到的就是0x30000018位置处的向量啦。


关键字:GNU  μC  OS-II  S3C2440  中断 引用地址:GNU μC/OS-II 在 S3C2440 上中断的实现

上一篇:S3C2440 nand_flash驱动程序
下一篇:S3C2440的中断体系结构

推荐阅读最新更新时间:2024-11-02 11:58

单片机学习之十一:中断方式按键
1、 实验现象 最右面的数码管初始显示0,每次按下外部按键K0执行加一,计数到九时重新回零。 2、 实验目的 掌握中断方式响应按键的原理 掌握中断服务程序的具体编写:如何进行键的识别,如何去抖动 3、 实验任务分析 上一个试验我们了解了查询方式按键的原理。当单片机工作于查询方式的时候,要不间断的对外部按键进行查询,其间单片机不能干其他的任何工作。如果单片机的工作量较大,这种方式就很难适应。 为了进一步提高单片机的工作效率,可以采用中断方式。 中断方式的按键响应过程如下:单片机处理自己的工作,如果有按键按下,向单片机发出中断请求,单片机就会停下现在正在处理的工作,转去执行中断程序,执行之后回来继续刚才的工作;如果
[单片机]
单片机学习之十一:<font color='red'>中断</font>方式按键
MSP430与I2C总线接口技术的高效输出方案研究
MSP430单片机自从2000年问世以来,就以其功能完善、超低功耗、开发简便的特点得到了许多设计人员的青睐。MSP430与传统的51单片机在结构上有很大的区别。其中之一就是:在MSP430的外围接口电路中,没有提供像51那样控制外设读、写、地址锁存信号的硬件电路。与这种接口电路相适应,MSP430更倾向使用I2C总线以及ISP等基于串行接口的外围器件。另一方面,随着I2C技术的发展和成熟,其硬件结构简单、高速传输、器件丰富等特点使该类器件的应用越来越广泛。因此研究新型单片机MSP430与I2C总线接口技术有着重要的意义。本文针对这一问题进行研究,分析研究了 MSP430与I2C总线接口的原理和方法,提出了高效的接口方法,介绍了优化
[单片机]
MSP430与I2<font color='red'>C</font>总线接口技术的高效输出方案研究
【ARM】s3c2410之gpio调试
调试准备 编译工具:MDK470a 开发板:s3c2410 调试方式:经mdk编译后得到 hex文件,用hex2bin工具转换成bin文件,通过usb下载,在DNW上观察 Code-1 #define GPFCON (*(volatile unsigned long*)0x56000050) #define GPFDAT (*(volatile unsigned long*)0x56000054) //===PORT F GROUP //端口: GPF7 GPF6 GPF5 GPF4 GPF3 GPF2 GPF1 GPF0 //信号: LED_1 LED
[单片机]
MAX7219的c程序
#include AT89X51.H #include intrins.h //#include absacc.h /*--------------------------------------------------*/ sbit dis_DIN=P1^0; /*显示串行数据输入端*/ sbit dis_LOAD=P1^1; /*显示数据锁存端*/ sbit dis_CLK=P1^2; /*显示时钟输入端*/ #define NoOp 0x00 /*空操作*/ #define Digit0 0x01 /*数码管1*/ #define Digit1 0x02 /*数码管
[单片机]
AT89C2051在点钞机外接显示屏中的应用
  大家知道,LED数码管是由发光二极管作为显示字段的数码型显示器件。在数码管显示器中,一般情况下都采用动态扫描式显示方式。所谓扫描式,就是当有多个七段(带小数点的为八段)显示器要显示时,将其各个对应引脚接在一起,也就是说,所有的a段接在一起,b段也接在一起,依此类推。而利用各七段显示器的共阳(或共阴)极来确定哪一个七段显示器要显示。这样做的目的有二:(1)省电;(2)节省输出端口。   本电路利用89C2051的端口与数码的笔段接法为: P1.1-- C; P1.2-- D; P1.3-- E; P1.4-- B; P1.5-- A; P1.6-- F; P1.7-- G ,且三只数码管的笔段a~g又是并联在一起的。数码管的公共端
[单片机]
AT89<font color='red'>C</font>2051在点钞机外接显示屏中的应用
用51单片机定时器中断设计电子钟
把前天设计的时钟的功能补全了一些,贴上来, #include reg52.h #define uchar unsigned char sbit rd=P2^6; sbit wr=P2^5; sbit lcde=P2^7; sbit k1=P1^0; sbit k2=P1^1; sbit k4=P1^3; sbit k8=P1^7; uchar code table1 = 2011-11-05 ; uchar code table2 = 00:00:00 ; uchar code table3 ={{ MON },{ TUE },{ WED },{ THU },{ FRI },{ SAT },{ SUN }};
[单片机]
基于STC89C52的全自动洗碗机的设计
洗碗机是一种自动清洗餐具的厨房设备,它的出现减轻了炊事员及家庭“煮夫”的劳动强度,并且提高了相应地工作效率。目前,洗碗机在欧美已经广泛用于普通家庭中。有数据统计,在欧美主要国家,洗碗机的普及率已达到70%以上,几乎是家家户户必备的厨房生活电器,由于洗碗机在中国的发展时间较短,家庭普及率很低。随着科技和时代的进步,人们追求生活的便利性也在增长,洗碗机必然受到当代青年的追求。 1、系统设计 本设计是一种基于单片机去实现自动洗碗机的功能,实现一键操作整个过程。本设计的洗碗机主要过程包括自动进水、循环洗碗、自动出水的功能,并能实时地显示出当前剩余的时间;另外,为了更好地实现生活的便利性,该系统还设计了对碗筷等进行紫外光消毒、风干等功能
[单片机]
基于STC89<font color='red'>C</font>52的全自动洗碗机的设计
TI C2000 DSP 大奖赛决赛在合工大圆满举行!
2008年6月2日,由德州仪器(TI)主办,合肥工业大学协办的2008年TI C2000 DSP大奖赛的决赛在合肥工业大学成功举行。 本次大赛是TI第一次举办C2000系列DSP的大赛,分为自由命题组和TI命题组,吸引了来自合肥工业大学、南京航空航天大学、清华大学、上海交通大学、同济大学、湖北汽车工业学院、北京化工大学、东北电力大学等十几支参赛对伍。C2000 DSP在马达控制、高速传感、数字电源等方面得到了广泛的设计应用,有些设计产品已经在产业届得到了良好的市场反映,如合肥工业大学的基于TMS320F2812的配网自动化终端FTU的设计和实现和上海交通大学的基于TMS320F2812的经济型数控车床控制器设计。
[焦点新闻]
小广播
设计资源 培训 开发板 精华推荐

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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