加入收藏 设为首页 帮助中心
 
论坛首页
用户登录 | 用户注册 | 最新悬赏 | 最新贴子 | 会员中心 | 贴子搜索 | 网站地图 | 帮助中心 | 联系我们
站内搜索:
现在位置 > 维库电子开发网论坛 > 嵌入式系统/ARM技术 >
ARM-Linux 中断分析

帖子主题:
ARM-Linux 中断分析

你还没有登录,无法发表回复,请首先 登录.. [注 册]
积分:473 witech6466
发表于:2007-7-3 14:30:00 楼主
级别:四星
积分:473分
注册:2006年08月19日

ARM-Linux 中断分析

                                                                

                                        保定慧通科技  garyguo

                                        http://www.witech.com.cn

                                        *版权所有,引用请注明出处!

     ARM体系结构中,把复位、中断、快速中断等都看作‘异常’,当这些‘异常’发生时,CPU会到固定地址处去找指令,他们对应的地址如下:

          地址                异常类型      进入时的工作模式

          0x00000000         Reset                 Supervisor

          0x00000004         Und                  Undefined

          0x00000008         Soft interupt           Supervisor

          0x0000000c         Abort(prefetch)        Abort

          0x00000010         Abort(data)            Abort

          0x00000014         Reserved              Reserved

          0x00000018         IRQ                   IRQ

          0x0000001c         FIQ                   FIQ

     首先要明确的一点就是,无论内存地址空间是如何映射的,以上这些地址都不会变,比如当有快速中断发生时,ARM将铁定到0X0000001C这个地址处取指令。这也是BOOTLOADER把操作系统引导以后,内存必须重映射的原因!否则操作系统不能真正接管整套系统!

     LINUX启动以后要初始化这些区域,初始化代码在main.c中的start_kernel()中,具体是调用函数trap_ini()来实现的。如下面所示(具体可参照entry-armv.S):

     .LCvectors:         swi    SYS_ERROR0

                   b       __real_stubs_start + (vector_undefinstr - __stubs_start)

                   ldr     pc, __real_stubs_start + (.LCvswi - __stubs_start)

                   b       __real_stubs_start + (vector_prefetch - __stubs_start)

                   b       __real_stubs_start + (vector_data - __stubs_start)

                   b       __real_stubs_start + (vector_addrexcptn - __stubs_start)

                   b       __real_stubs_start + (vector_IRQ - __stubs_start)

                   b       __real_stubs_start + (vector_FIQ - __stubs_start)

     ENTRY(__trap_init)

                   stmfd         sp!, {r4 - r6, lr}

 

积分:473 witech6466
发表于:2007-7-3 14:30:00 1 楼
级别:四星
积分:473分
注册:2006年08月19日

     在具体的ARM芯片中会有很多的中断类型,每一种类型的中断用以上结构来表示:

struct irqdesc irq_desc[NR_IRQS];   /* NR_IRQS根据不同的MCU会有所区别*/

     在通过request_irq()函数注册中断服务程序的时候,将会把中断向量和中断服务程序对应起来。

     我们来看一下request_irq的源码:

     int request_irq(unsigned int irq, void (*handler)(int, void *, struct pt_regs *),

                    unsigned long irq_flags, const char * devname, void *dev_id)

     {

         unsigned long retval;

         struct irqaction *action;

         if (irq >= NR_IRQS || !irq_desc[irq].valid || !handler ||

             (irq_flags & SA_SHIRQ && !dev_id))

                   return -EINVAL;

         action = (struct irqaction *)kmalloc(sizeof(struct irqaction), GFP_KERNEL);

         if (!action)              /*  生成action结构*/

                   return -ENOMEM;

         action->handler = handler;

         action->flags = irq_flags;

         action->mask = 0;

         action->name = devname;

         action->next = NULL;

         action->dev_id = dev_id;

         retval = setup_arm_irq(irq, action);   /*把中断号irq和action 对应起来*/

         if (retval)

                   kfree(action);

         return retval;

     }

     其中第一个参数irq就是中断向量,第二个参数即是要注册的中断服务程序。很多同仁可能疑惑的是,我们要注册的中断向量号是怎么确定的呢?这要根据具体芯片的中断控制器,比如三星的S3C2410,需要          通过读取其中的中断状态寄存器,来获得是哪个设备发生了中断:

      (保定慧通科技  garyguo     http://www.witech.com.cn ;  *版权所有,引用请注明出处!)

     if defined(CONFIG_ARCH_S3C2410)

     #include <asm/hardware.h>

                   .macro  disable_fiq

                   .endm

                   .macro  get_irqnr_and_base, irqnr, irqstat, base, tmp

                   mov  r4, #INTBASE             @ virtual address of IRQ registers

                   ldr     \irqnr, [r4, #0x8]  @ read INTMSK   中断掩码寄存器

                   ldr     \irqstat, [r4, #0x10]   @ read INTPND  中断寄存器

                   bics    \irqstat, \irqstat, \irqnr

                   bics    \irqstat, \irqstat, \irqnr

                   beq      

积分:359 dengjing2168
发表于:2007-7-3 14:30:00 2 楼
级别:四星
积分:359分
注册:2006年08月18日

www.chinasrx.com
思瑞讯的ARM7开发板怎么样啊

4555555555555578888888888888//////////////////866666666666544444

 
积分:359 电子精灵2168
发表于:2007-7-3 14:30:00 3 楼
级别:四星
积分:359分
注册:2006年08月18日

刚刚接触这些东西,还不是很明白.不过还是谢谢楼主.
 
积分:420 aalinana1242
发表于:2007-7-3 14:30:00 4 楼
级别:四星
积分:420分
注册:2006年08月15日

这是啥啊?
 
 

本任务已结贴!!
网站简介s广告服务网站地图帮助信息联系方式问题报告
Copyright 2007 - 2008 bbs.weeqoo.com
Powered By weeqoo Version 8.0.0XML