Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1049959
  • 博文数量: 178
  • 博客积分: 10222
  • 博客等级: 上将
  • 技术积分: 2215
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-03 11:27
个人简介

有所追求

文章分类

全部博文(178)

文章存档

2012年(1)

2011年(5)

2010年(3)

2009年(78)

2008年(91)

我的朋友

分类:

2009-03-15 18:33:07

谢谢您的推荐
 
LPC2000系列中断嵌套处理
ARM的中断管理体系与51系列微控制器不一样。ARM的中断不会自动嵌套,要自己相应代码保护中断寄存器入口的现场,以及后面的回复现场等。ZLG提供的代码中提到了关于中断嵌套现场保护的代码,如下:
NoInt       EQU 0x80
USR32Mode   EQU 0x10
SVC32Mode   EQU 0x13
SYS32Mode   EQU 0x1f
IRQ32Mode   EQU 0x12
FIQ32Mode   EQU 0x11
 
    CODE32
    AREA    IRQ,CODE,READONLY
    MACRO
$IRQ_Label HANDLER $IRQ_Exception_Function
        EXPORT  $IRQ_Label                      ; 输出的标号
        IMPORT  $IRQ_Exception_Function         ; 引用的外部标号
$IRQ_Label
        SUB     LR, LR, #4                      ; 计算返回地址
        STMFD   SP!, {R0-R3, R12, LR}           ; 保存任务环境
        MRS     R3, SPSR                        ; 保存状态
        STMFD   SP, {R3,LR}^                    ; 保存SPSR和用户状态的SP,注意不能回写
                                                ; 如果回写的是用户的SP,所以后面要调整SP
        NOP
        SUB     SP, SP, #4*2
        MSR     CPSR_c, #(NoInt | SYS32Mode)    ; 切换到系统模式
      
        BL      $IRQ_Exception_Function         ; 调用c语言的中断处理程序
        MSR     CPSR_c, #(NoInt | IRQ32Mode)    ; 切换回irq模式
        LDMFD   SP, {R3,LR}^                    ; 恢复SPSR和用户状态的SP,注意不能回写
                                                ; 如果回写的是用户的SP,所以后面要调整SP
        MSR     SPSR_cxsf, R3
        ADD     SP, SP, #4*2                    ;
        LDMFD   SP!, {R0-R3, R12, PC}^          ;
    MEND
 
;/* 以下添加中断句柄,用户根据实际情况改变 */
;/* Add interrupt handler here,user could change it as needed */
;/*中断*/
;IRQ_Handler HANDLER IRQ_Exception

 我们仅需要在下面添加中断句柄即可。
 对于中断嵌套的编写,应按以下方式实现:
 1、保存当前中断使能寄存器VICIntEnable的值;
 2、禁止当前中断;
 3、清楚中断逻辑;
 4、使能VIC,使之能响应其他中断;
 5、中断处理服务程序;
 6、恢复保存的中断使能寄存器的值。
 中断嵌套中,并不分优先级的高低,高优先级的中断可嵌套低优先级的中断。特别要注意,要明确自己的中断编写,否则可能中断嵌套混乱出错。不建议多层中断嵌套。
阅读(1121) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~