因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序,然后不断地调试。在这个程序之前,先要深入去了解ARM的中断方式,知道它有7种工作方式。下面先看初始化的代码是怎么样初始化不同模式栈的。
/* IRQMODE。 */
orr r1,r0,#0x12|0xc0
msr cpsr,r1
ldr sp,=IRQ_MODE_SP_START
这段代码,就是初始化IRQ模式的栈,这样在IRQ中断时就可以使用栈了。
S3C44B0的中断过运行过程是这样的:
当有中断发生时,就会跳到FLASH中的地址0x18处理取到一条指令并执行,因为那里只允许放一条指令,因此只能放一条跳转指令了。比如:ldr pc,=0x0c000018 ,这条指令就是跳到SDRAM里运行,意思从0x0c000018取一条指令运行,其实我总是在那地址里放一条跳转指令的,这样又到相应的中断处理程序了。比如在那里一条:
b irq,这条指令就是跳到IRQ的中断处理程序运行,它的作用就是根据不同的中断源来进一步查找不同的中断处理程序。它的代码如下:
/*
采用IRQ中断,查找各个中断的入口函数地址,并且跳到相应的入口函数运行。
*/
irq:sub sp,sp,#4 /* 保留一个栈给PC */
stmfd sp!,{r8-r9}
ldr r9,=I_ISPR /* 读取中断源寄存器 */
ldr r9,[r9]
cmp r9, #0x0 /* 如果没有中断源发生,就退出去。 */
beq IDLE_IRQ
mov r8,#0x0 /* 计算中断源对应的中断程序位置 */
LOOP_IRQ:
movs r9,r9,lsr #1
bcs HAVE_IRQ
add r8,r8,#4 /* 每个中断入口占4个字节 */
b LOOP_IRQ
HAVE_IRQ:
ldr r9,=CONFIG_SDRAM_START+4*8 /* 从HandleADC中断入口 */
add r9,r9,r8
ldr r9,[r9]
str r9,[sp,#8] /* 保存到前面保留的SP位置 */
ldmfd sp!,{r8-r9,pc} /* 跳到中断程序运行. */
IDLE_IRQ: /* 没有中断处理。 */
ldmfd sp!,{r8-r9}
add sp,sp,#4
subs pc,lr,#4
这段代码的功能就是先从S3C44B0的中断源保存寄存器I_ISPR取出中断源的标识位,然后不断移位,判断这位是否有中断,如果有中断就处理它。根据移位来算出它的中断入口地址在那里,这样的做法,就可以动态地改变中断入口函数。CONFIG_SDRAM_START+4*8,这个就是中断入口函数基地址,如果是第一位有中断,就是ADC中断。
那么就直接跳到这个地址运行就OK了。
比如我使用S3C44B0的TICK中断,就是时间片中断。就会在相应的地址设置入口函数,使用如下代码:
///////////////////////////////////////////////////////////////////////////////
//函数名称: TickInstall
//函数功能: 安装Tick中断函数。
//输入参数:
//输出参数:
//返 回 值:
//开发人员: 蔡军生
//时 间: 2006/02/13
//修改说明:
//
///////////////////////////////////////////////////////////////////////////////
void TickInstall(unsigned int nTickFunc)
{
//
*((unsigned int *)(INT_ADDR_START + 20*4)) = nTickFunc;
}
上面语句就是把一个中断入口函数设置为时间片运行函数。当有TICK中断时,就会跑到时间片函数里运行了。
总结一下,写一个S3C44B0的中断处理需要做以下几部分工作:
1. 在FLASH里0x18处放一条跳转指令,跳到SDRAM里运行。
2. 在SDRAM里0x0c000018处,放一条跳转指令,跳到IRQ子程序运行。
3. 写一段IRQ处理程序。
4. 写一段处理实际中断源的处理函数。
5. 设置中断寄存器,清除中断源屏蔽位。
上一篇:学习ARM开发(18)
下一篇:学习ARM开发(16)
推荐阅读最新更新时间:2024-11-14 11:34
设计资源 培训 开发板 精华推荐
- 用于 AD7884 16 位高速 ADC 的 AD780 精密 3V 基准的典型应用电路
- L9954LXP 门执行器驱动器的典型应用
- 使用 Analog Devices 的 LT8609SEV 的参考设计
- NE555Electronpiano
- TCR2LN33 200mA、3.3V输出电压CMOS低压降稳压器的典型应用
- LT1764AEFE-1.8 3.3 VIN 至 2.5 VOUT LDO 稳压器的典型应用
- KITFS6507LAEEVM: FS6507, 系统基础芯片, ASIL B, DCDC 0.8 A Vcore, LDT, CAN, LIN
- 使用 Analog Devices 的 LTC2908CDDB-C1 的参考设计
- 基本 LT1070 反激式稳压器测试电路
- LTC1470 的典型应用 - 单路和双路 PCMCIA 保护的 3.3V/5V VCC 开关