IRQ.inc
上传用户:zddz2006
上传日期:2020-12-03
资源大小:261k
文件大小:4k
源码类别:

中间件编程

开发平台:

Visual C++

  1. ;/****************************************Copyright (c)**************************************************
  2. ;**                               广州周立功单片机发展有限公司
  3. ;**                                     研    究    所
  4. ;**                                        产品一部 
  5. ;**
  6. ;**                                 http://www.zlgmcu.com
  7. ;**
  8. ;**--------------文件信息--------------------------------------------------------------------------------
  9. ;**文   件   名: IRQ.inc
  10. ;**创   建   人: 陈明计
  11. ;**最后修改日期: 2004年8月27日
  12. ;**描        述: 定义IRQ汇编接口代码宏
  13. ;**
  14. ;**--------------历史版本信息----------------------------------------------------------------------------
  15. ;** 创建人: 陈明计
  16. ;** 版  本: v1.0
  17. ;** 日 期: 2004年8月27日
  18. ;** 描 述: 原始版本
  19. ;**
  20. ;**--------------当前版本修订------------------------------------------------------------------------------
  21. ;** 修改人:
  22. ;** 日 期:
  23. ;** 描 述:
  24. ;**
  25. ;**------------------------------------------------------------------------------------------------------
  26. ;********************************************************************************************************/
  27. NoInt       EQU 0x80
  28. USR32Mode   EQU 0x10
  29. SVC32Mode   EQU 0x13
  30. SYS32Mode   EQU 0x1f
  31. IRQ32Mode   EQU 0x12
  32. FIQ32Mode   EQU 0x11
  33. ;引入的外部标号在这声明
  34.         IMPORT  OSIntCtxSw                      ;任务切换函数
  35.         IMPORT  OSIntExit                       ;中断退出函数
  36.         IMPORT  OSTCBCur
  37.         IMPORT  OSTCBHighRdy
  38.         IMPORT  OSIntNesting                    ;中断嵌套计数器
  39.         IMPORT  StackUsr
  40.         IMPORT  OsEnterSum
  41.     CODE32
  42.     AREA    IRQ,CODE,READONLY
  43.     MACRO
  44. $IRQ_Label HANDLER $IRQ_Exception_Function
  45.         EXPORT  $IRQ_Label                      ; 输出的标号
  46.         IMPORT  $IRQ_Exception_Function         ; 引用的外部标号
  47. $IRQ_Label
  48.         SUB     LR, LR, #4                      ; 计算返回地址
  49.         STMFD   SP!, {R0-R3, R12, LR}           ; 保存任务环境
  50.         MRS     R3, SPSR                        ; 保存状态
  51.         STMFD   SP, {R3, SP, LR}^               ; 保存用户状态的R3,SP,LR,注意不能回写
  52.                                                 ; 如果回写的是用户的SP,所以后面要调整SP
  53.         LDR     R2,  =OSIntNesting              ; OSIntNesting++
  54.         LDRB    R1, [R2]
  55.         ADD     R1, R1, #1
  56.         STRB    R1, [R2]
  57.         SUB     SP, SP, #4*3
  58.         
  59.         MSR     CPSR_c, #(NoInt | SYS32Mode)    ; 切换到系统模式
  60.         CMP     R1, #1
  61.         LDREQ   SP, =StackUsr
  62.         
  63.         BL      $IRQ_Exception_Function         ; 调用c语言的中断处理程序
  64.         MSR     CPSR_c, #(NoInt | SYS32Mode)    ; 切换到系统模式
  65.         LDR     R2, =OsEnterSum                 ; OsEnterSum,使OSIntExit退出时中断关闭
  66.         MOV     R1, #1
  67.         STR     R1, [R2]
  68.         BL      OSIntExit
  69.         LDR     R2, =OsEnterSum                 ; 因为中断服务程序要退出,所以OsEnterSum=0
  70.         MOV     R1, #0
  71.         STR     R1, [R2]
  72.         MSR     CPSR_c, #(NoInt | IRQ32Mode)    ; 切换回irq模式
  73.         LDMFD   SP, {R3, SP, LR}^               ; 恢复用户状态的R3,SP,LR,注意不能回写
  74.                                                 ; 如果回写的是用户的SP,所以后面要调整SP
  75.         LDR     R0, =OSTCBHighRdy
  76.         LDR     R0, [R0]
  77.         LDR     R1, =OSTCBCur
  78.         LDR     R1, [R1]
  79.         CMP     R0, R1
  80.         ADD     SP, SP, #4*3                    ; 
  81.         MSR     SPSR_cxsf, R3
  82.         LDMEQFD SP!, {R0-R3, R12, PC}^          ; 不进行任务切换
  83.         LDR     PC, =OSIntCtxSw                 ; 进行任务切换
  84.     MEND
  85.     END
  86. ;/*********************************************************************************************************
  87. ;**                            End Of File
  88. ;********************************************************************************************************/