IRQ.s
上传用户:ssllxx2007
上传日期:2022-06-12
资源大小:784k
文件大小:4k
源码类别:

uCOS

开发平台:

C/C++

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