上一篇文章介绍了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. solr7.7.0搜索引擎使用(二)(添加搜索)

    一.安装完毕之后,需要为solr添加core,每一个搜索server就是一个core,solr可以有很多core,我们需要创建一个core用于我们的搜索 添加core的方式有两种: 第一种进入solr ...

  2. ubuntu 应用添加进环境变量

    BG:公司同事使用的电脑系统大多为windows ,有部分mac和Ubuntu(我就是那个部分Ubuntu),某些情况为了统一格式,便下载了一些解压即可使用的软件,但是每次点开文件夹然后点开程序很繁琐 ...

  3. js五道经典练习题--第五道成绩列表

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...

  4. python实战提升--1

    #python实战提升 1. 如何在列表.字典.集合中根据条件筛选数据? python中for _ in range(10)与for i in range(10)有何区别 下划线表示 临时变量, 仅用 ...

  5. 深圳scala-meetup-20180902(1)- Monadic 编程风格

    刚完成了9月份深圳scala-meetup,趁刮台风有空,把我在meetup里的分享在这里发表一下.我这次的分享主要分三个主题:“Monadic编程风格“.”Future vs Task and Re ...

  6. VMware Tools安装教程

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

  7. 使用Qt开发绘制多个设备的流量曲线图(附带项目图)

    一.说明: 在实际项目中,主要是使用Qt开发CS程序,当然主要是客户端.公司项目中有这个需求是实时显示多个设备的流量曲线图,设备将流量信息发给服务端,服务端再将信息通过Socket发给Qt客户端,Qt ...

  8. NHibernate删除数据时遇到deleted object would be re-saved by cascade级联问题

    今天在处理数据时遇到了这个问题,数据是一对多的关系,A包含多个B,想将某个B从A中移除,在保存时抛出如标题的问题,查找了下资料得知:由于在配置文件中设置了cascade为all,A和B存在级联关系,那 ...

  9. Spring 源码分析之 bean 依赖注入原理(注入属性)

         最近在研究Spring bean 生命周期相关知识点以及源码,所以打算写一篇 Spring bean生命周期相关的文章,但是整理过程中发现涉及的点太多而且又很复杂,很难在一篇文章中把Spri ...

  10. [EXP]ThinkPHP 5.0.23/5.1.31 - Remote Code Execution

    # Exploit Title: ThinkPHP .x < v5.0.23,v5.1.31 Remote Code Execution # Date: -- # Exploit Author: ...