中国Linux公社论坛's Archiver

loonux 发表于 2013-7-23 11:00

ucos4skyeye中断安装函数有点不理解

void install_irqhandler(void * isr)
{
        /* ARM irq exception vector addr is 0x00000018  */
        unsigned int * irq_vec_addr = ( unsigned int * ) 0x18;

        /* this is isr entry address, could be another address like 0x3c, 0x58... */
        unsigned int * isr_entry_addr = ( unsigned int * ) 0x38;

        unsigned int instruction;
      
        /* set the ISR entry at 0x38  */
        *isr_entry_addr = (unsigned int)isr;
      
        /* make an instruction: it is machine-code for "ldr  pc, [pc, #(38-18-]"  */
/* pc是预取指令,会自动加8所以要得出中断处理函数地址的偏移量就后再减去pc事

  先自动加上的8才得到真正的偏移量 */
        instruction = ((unsigned int) isr_entry_addr  - (unsigned int)irq_vec_addr - 0x0 | 0xe59ff000;
      
        /* set this instruction at 0x18  */
        *irq_vec_addr = instruction;      
}
我的理解是当irq中断发生,从向量表0x18跳转到0x38去寻找中断处理函数。问题是0x38只是存放了isr的地址,没有使用ldr之类的指令pc指针怎么从0x38又跳转到isr的地址的呢?

loonux 发表于 2013-7-25 09:39

:-D 看代码不仔细,结贴了

页: [1]

Powered by Discuz! Archiver 6.1.0F  © 2001-2007 Comsenz Inc.