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 上中断的实现的更多相关文章
- uC/OS II原理分析及源码阅读(一)
uC/OS II(Micro Control Operation System Two)是一个可以基于ROM运行的.可裁减的.抢占式.实时多任务内核,具有高度可移植性,特别适合于微处理器和控制器,是和 ...
- 【小梅哥SOPC学习笔记】NIOS II处理器运行UC/OS II
SOPC开发流程之NIOS II 处理器运行 UC/OS II 这里以在芯航线FPGA学习套件的核心板上搭建 NIOS II 软核并运行 UCOS II操作系统为例介绍SOPC的开发流程. 第一步:建 ...
- uboot在s3c2440上的移植(1)
一.移植环境 主 机:VMWare--Fedora 9 开发板:Mini2440--64MB Nand,Kernel:2.6.30.4 编译器:arm-linux-gcc-4.3.2.tgz u-b ...
- 【原创】uC/OS II 任务切换原理
今天学习了uC/OS II的任务切换,知道要实现任务的切换,要将原先任务的寄存器压入任务堆栈,再将新任务中任务堆栈的寄存器内容弹出到CPU的寄存器,其中的CS.IP寄存器没有出栈和入栈指令,所以只能引 ...
- S3C2440上LCD驱动(FrameBuffer)实例开发讲解
一.开发环境 主 机:VMWare--Fedora 9 开发板:Mini2440--64MB Nand, Kernel:2.6.30.4 编译器:arm-linux-gcc-4.3.2 二.背景知识 ...
- 【转】OS X Base System 上没有足够的空间来进行安装
今天在windows环境下安装IOS虚拟机,安装过程中报了一个错:“OS X Base System ”上没有足够的空间来进行安装.如图: 之后的解决办法是:点击上方的[实用工具]->[磁盘工具 ...
- os.path.join合并 os.path.dirname返回上一级目录 os.path.exists(path) os.stat('path/filename')获取文件/目录信息
import os str1 = "grsdgfd" str2 = "wddf" str3 = "gddgs" # print(str1 + ...
- S3C2440上RTC时钟驱动开发实例讲解(转载)
嵌入式Linux之我行,主要讲述和总结了本人在学习嵌入式linux中的每个步骤.一为总结经验,二希望能给想入门嵌入式Linux的朋友提供方便.如有错误之处,谢请指正. 共享资源,欢迎转载:http:/ ...
- SPI在linux3.14.78 FS_S5PC100(Cortex A8)和S3C2440上驱动移植(deep dive)
由于工作的原因,对SPI的理解最为深刻,也和SPI最有感情了,之前工作都是基于OSEK操作系统上进行实现,也在US/OS3上实现过SPI驱动的实现和测试,但是都是基于基本的寄存器操作,没有一个系统软件 ...
随机推荐
- 目录命令(tree)
TREE 命令: // 描述: 以图形方式显示驱动器中路径或磁盘的目录结构. // 语法: tree [<Drive>:][<Path>] [/f] [/a] // 参数: / ...
- python入门之两种方法修改文件内容
1.占硬盘修改 import os file_name="兼职.txt" new_file_name="%s.new".% file_name old_str= ...
- 下拉列表 通过option 改变div的内容
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...
- Aizu 0525 Osenbei 搜索 A
Aizu 0525 Osenbei https://vjudge.net/problem/Aizu-0525 题目: IOI製菓では,創業以来の伝統の製法で煎餅(せんべい)を焼いている.この伝統の製法 ...
- MFC字体样式和颜色设置
在编写MFC界面程序时,可能会使用不同大小或者颜色的字体,这里稍做记录. 使用方法 CFont *m_pFont;//创建新的字体 m_pFont = new CFont; m_pFont->C ...
- suse下修改主机名
export HOSTNAME=主机名 echo $HOSTNAME>/etc/HOSTNAME /etc/rc.d/boot.localnet stop /etc/rc.d/boot.loca ...
- docker学习笔记-命令大全
容器生命周期管理 • Run OPTIONS说明: • -a :显示所有的容器,包括未运行的. • -f :根据条件过滤显示的内容. • --format :指定返回值的模板文件. • -l :显示最 ...
- JavaScript标准库之 ---- Object
Object.assign() 方法可以把任意多个的源对象自身的可枚举属性拷贝给目标对象,然后返回目标对象. 语法: Object.assign(target, ...sources) 参数: ta ...
- POJ - 1321 棋盘问题 简单搜索 dfs 格子
点这里去看题 思路:本题的难点在k<n的情况,所以我们可以另dfs中的两个参数分别代表起始行和待放棋子个数(待放棋子只能放在起始行后面的行),然后用一个c[8]来表示每一列放旗子的情况来判断列不 ...
- hdu 1069 Monkey and Banana 【动态规划】
题目 题意:研究人员要测试猴子的IQ,将香蕉挂到一定高度,给猴子一些不同大小的箱子,箱子数量不限,让猩猩通过叠长方体来够到香蕉. 现在给你N种长方体, 要求:位于上面的长方体的长和宽 要小于 下面 ...