上一篇文章介绍了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 上中断的实现的更多相关文章

  1. uC/OS II原理分析及源码阅读(一)

    uC/OS II(Micro Control Operation System Two)是一个可以基于ROM运行的.可裁减的.抢占式.实时多任务内核,具有高度可移植性,特别适合于微处理器和控制器,是和 ...

  2. 【小梅哥SOPC学习笔记】NIOS II处理器运行UC/OS II

    SOPC开发流程之NIOS II 处理器运行 UC/OS II 这里以在芯航线FPGA学习套件的核心板上搭建 NIOS II 软核并运行 UCOS II操作系统为例介绍SOPC的开发流程. 第一步:建 ...

  3. uboot在s3c2440上的移植(1)

    一.移植环境 主  机:VMWare--Fedora 9 开发板:Mini2440--64MB Nand,Kernel:2.6.30.4 编译器:arm-linux-gcc-4.3.2.tgz u-b ...

  4. 【原创】uC/OS II 任务切换原理

    今天学习了uC/OS II的任务切换,知道要实现任务的切换,要将原先任务的寄存器压入任务堆栈,再将新任务中任务堆栈的寄存器内容弹出到CPU的寄存器,其中的CS.IP寄存器没有出栈和入栈指令,所以只能引 ...

  5. S3C2440上LCD驱动(FrameBuffer)实例开发讲解

    一.开发环境 主  机:VMWare--Fedora 9 开发板:Mini2440--64MB Nand, Kernel:2.6.30.4 编译器:arm-linux-gcc-4.3.2 二.背景知识 ...

  6. 【转】OS X Base System 上没有足够的空间来进行安装

    今天在windows环境下安装IOS虚拟机,安装过程中报了一个错:“OS X Base System ”上没有足够的空间来进行安装.如图: 之后的解决办法是:点击上方的[实用工具]->[磁盘工具 ...

  7. os.path.join合并 os.path.dirname返回上一级目录 os.path.exists(path) os.stat('path/filename')获取文件/目录信息

    import os str1 = "grsdgfd" str2 = "wddf" str3 = "gddgs" # print(str1 + ...

  8. S3C2440上RTC时钟驱动开发实例讲解(转载)

    嵌入式Linux之我行,主要讲述和总结了本人在学习嵌入式linux中的每个步骤.一为总结经验,二希望能给想入门嵌入式Linux的朋友提供方便.如有错误之处,谢请指正. 共享资源,欢迎转载:http:/ ...

  9. SPI在linux3.14.78 FS_S5PC100(Cortex A8)和S3C2440上驱动移植(deep dive)

    由于工作的原因,对SPI的理解最为深刻,也和SPI最有感情了,之前工作都是基于OSEK操作系统上进行实现,也在US/OS3上实现过SPI驱动的实现和测试,但是都是基于基本的寄存器操作,没有一个系统软件 ...

随机推荐

  1. ABP框架系列之九:(Abp-Session-会话)

    Introduction ASP.NET Boilerplate provides IAbpSession interface to obtain current user and tenant wi ...

  2. 关于SGA中的granule size

    1.什么是granule? granule直译为颗粒,ORACLE为SGA 中的组件(eg:log buffer/db buffer/large pool等)分配的最小单元为一个granule. 所以 ...

  3. 去除swagger ui的红色 error 错误提示

    去除swagger ui的红色 error 错误提示 自定义js文件中加入以下的代码. 加入自定义的js方法看这里 http://www.cnblogs.com/wang2650/archive/20 ...

  4. 利用Burp Suite攻击Web应用

    i春秋作家:Passerby2 web应用测试综述: Web应用漏洞给企业信息系统造成了很大的风险.许多web应用程序漏洞是由于web应用程序缺乏对输入的过滤.简而言之Web应用程序利用来自用户的某种 ...

  5. 11.webview、shareSDK

    布局: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:la ...

  6. VMware Tools安装教程

    安装依赖: sudo yum install eject 步骤: 确保 Linux 虚拟机已打开电源. 如果正在运行 GUI 界面,请打开命令 shell. 注意:以 root 用户身份登录,或使用 ...

  7. 使用广播-BroadcastReceiver最详细解析

    女孩:BroadcastReceiver是什么呀? 男孩:Broadcast是广播的意思,在Android中应用程序之间的传输信息的机制,BroadcastReceiver是接收广播通知的组件,广播和 ...

  8. react小知识

    概述 有句话说得很好,代码是写给人看的,顺便让机器执行而已.所以我总结了一些写react不太注意的地方,供以后开发时参考,相信对其他人也有用. 组件封装 由于组件其实就是React.createEle ...

  9. linux下的初始化系统systemd简科普

    systemd是什么?名字很奇怪,不认识. 扒一扒wiki,你就会知道我是谁了? 在下有眼不识泰山,原来你就是盘古老爷爷用的开天辟地大斧头啊. 贫穷不可怕,可怕的是贫穷限制了你的想象--------- ...

  10. Ubuntu 16.04 安装 arm-linux-gcc 交叉编译工具

    工作需要,最近在编译linux嵌入式内核时,需要安装arm-linux-gcc交叉编译,实际上,安装这个交叉编译器的难度没啥.不过,这里有些问题还是值得我去思考和记录下来的. 这个系统的上的编译器用的 ...