您的位置:控制工程论坛网论坛 » 嵌入式系统 » ARM核对异常的处理和中断处理

netwell

netwell   |   当前状态:在线

总积分:5615  2024年可用积分:0

注册时间: 2006-12-06

最后登录时间: 2017-03-16

空间 发短消息加为好友

ARM核对异常的处理和中断处理

netwell  发表于 2008/9/21 14:49:37      813 查看 1 回复  [上一主题]  [下一主题]

手机阅读

    当产生异常时, ARM核拷贝CPSR寄存器的内容SPSR_<mode>寄存器中,同时设置适当的CPSR 位、改变处理器状态进入ARM 态和处理器模式,从而进入相应的异常模式。在设置中断禁止位禁止相应中断(如果需要)后,ARM核保存返回地址到LR_<mode>,同时设置PC为相应的异常向量。当异常返回时, 异常处理需要从SPSR_<mode>寄存器中恢复CPSR的值,同时从LR_<mode>恢复PC,具体的异常返回指令如下:

Ø 从SWI和Undef异常返回时使用:

movs pc, LR;

Ø 从FIQ、IRQ和预取终止返回时使用:

SUBS PC, LR,#4;

Ø 从数据异常返回时使用:

SUBS PC, LR,#8

在使用上述指令异常返回时,如果LR之前被压栈的话使用LDM “∧”, 例如:

LDMFD SP!, {PC}∧


    下面的函数为一个中断处理函数,其前面加了__irq关键字。

__irq void pwm0_irq_handler(void)

{

//Deassert PWM0 interrupt signal

unsigned int i="AT91F"_PWMC_GetInterruptStatus(AT91C_BASE_PWMC);

// Clear the LED's. On the Board we must apply a "1" to turn off LEDs

AT91F_PIO_SetOutput(AT91C_BASE_PIOA, led_mask[0]);

AT91F_PWMC_StopChannel(AT91C_BASE_PWMC,AT91C_PWMC_CHID1);

AT91F_AIC_ClearIt(AT91C_BASE_AIC,AT91C_ID_PWMC);

AT91F_AIC_AcknowledgeIt(AT91C_BASE_AIC);

}

    当编译器器编译这个函数时,除了保存ATPCS规则规定的寄存器以外,还保存了CPSR及PC的值。在函数的返回时,还自动添加了SUBS PC, LR, #4和从SPSR寄存器恢复CPSR寄存器值的指令。用这种方式处理以后,中断处理函数可以和普通函数一样的使用。

1楼 0 0 回复
  • rando

    rando   |   当前状态:离线

    总积分:670  2024年可用积分:0

    注册时间: 2008-09-20

    最后登录时间: 2008-09-21

    空间 发短消息加为好友

    rando   发表于 2008/9/21 14:49:37

    CPSR寄存器值的指令
    2楼 回复本楼

    引用 rando 2008/9/21 14:49:37 发表于2楼的内容

总共 , 当前 /