Os_cpu_a.s
上传用户:zfj3589
上传日期:2022-07-13
资源大小:635k
文件大小:10k
源码类别:

微处理器开发

开发平台:

C/C++

  1. ;/****************************************Copyright (c)**************************************************
  2. ;**                               广州周立功单片机发展有限公司
  3. ;**                                     研    究    所
  4. ;**                                        产品一部 
  5. ;**
  6. ;**                                 http://www.zlgmcu.com
  7. ;**
  8. ;**--------------文件信息--------------------------------------------------------------------------------
  9. ;**文   件   名: os_cpu_s.s
  10. ;**创   建   人: 陈明计
  11. ;**最后修改日期: 2003年6月19日
  12. ;**描        述: μCOS-II在LPC210x上的移植代码汇编代码部分,用ADS1.2编译
  13. ;**
  14. ;**--------------历史版本信息----------------------------------------------------------------------------
  15. ;** 创建人: 陈明计
  16. ;** 版  本: V1.0
  17. ;** 日 期: 2003年6月5日
  18. ;** 描 述: 原始版
  19. ;**
  20. ;**------------------------------------------------------------------------------------------------------
  21. ;** 修改人: 陈明计
  22. ;** 版  本: V1.1
  23. ;** 日 期: 2003年6月11日
  24. ;** 描 述: 配合Vectors.s更正IRQ嵌套的BUG而作相应的修改
  25. ;**
  26. ;**------------------------------------------------------------------------------------------------------
  27. ;** 修改人: 陈明计
  28. ;** 版  本: V1.2
  29. ;** 日 期: 2003年6月13日
  30. ;** 描 述: 按照μCOS-II V2.52的要求修改(以前是基于μCOS-II V2.0)
  31. ;**
  32. ;**------------------------------------------------------------------------------------------------------
  33. ;** 修改人: 陈明计
  34. ;** 版  本: V1.3
  35. ;** 日 期: 2003年6月19日
  36. ;** 描 述: 不完全按照μCOS-II V2.52的要求以提高效率
  37. ;**
  38. ;**--------------当前版本修订------------------------------------------------------------------------------
  39. ;** 修改人: 
  40. ;** 日 期:
  41. ;** 描 述:
  42. ;**
  43. ;**------------------------------------------------------------------------------------------------------
  44. ;********************************************************************************************************/
  45. ;定义系统模式堆栈的大小
  46. SVC_STACK_LEGTH     EQU         32
  47. NoInt       EQU 0x80
  48. USR32Mode   EQU 0x10
  49. SVC32Mode   EQU 0x13
  50. SYS32Mode   EQU 0x1f
  51. IRQ32Mode   EQU 0x12
  52. FIQ32Mode   EQU 0x11
  53. ;T_bit用于检测进入异常前cpu是否处于THUMB状态
  54. T_bit               EQU         0x20
  55.     CODE32
  56.     AREA    |subr|, CODE, READONLY
  57.             IMPORT  OSTCBCur                    ;指向当前任务TCB的指针
  58.             IMPORT  OSTCBHighRdy                ;指向将要运行的任务TCB的指针
  59.             IMPORT  OSPrioCur                   ;当前任务的优先级
  60.             IMPORT  OSPrioHighRdy               ;将要运行的任务的优先级
  61.             IMPORT  OSTaskSwHook                ;任务切换的钩子函数
  62.             IMPORT  OSRunning                   ;uC/OS-II运行标志
  63.             IMPORT  OsEnterSum                  ;关中断计数器(关中断信号量)
  64.             IMPORT  SWI_Exception               ;软中断异常处理程序
  65.             
  66.             EXPORT  __OSStartHighRdy            
  67.             EXPORT  OSIntCtxSw                  ;中断退出时的入口,参见startup.s中的IRQ_Handler
  68.             EXPORT  SoftwareInterrupt           ;软中断入口
  69. ;/*********************************************************************************************************
  70. ;** 函数名称: SoftwareInterrupt
  71. ;** 功能描述: 软件中断,用于提供一些系统服务,功能参考os_cpu_c.c文件
  72. ;** 输 入:   依功能而定
  73. ;** 输 出 :  依功能而定
  74. ;** 全局变量: 无
  75. ;** 调用模块: SWI_Exception
  76. ;** 
  77. ;** 作 者: 陈明计
  78. ;** 日 期: 2003年6月5日
  79. ;**-------------------------------------------------------------------------------------------------------
  80. ;** 修 改: 陈明计
  81. ;** 日 期: 2003年6月11日
  82. ;**-------------------------------------------------------------------------------------------------------
  83. ;** 修 改: 陈明计
  84. ;** 日 期: 2003年6月13日
  85. ;**-------------------------------------------------------------------------------------------------------
  86. ;** 修 改: 陈明计
  87. ;** 日 期: 2003年6月19日
  88. ;**-------------------------------------------------------------------------------------------------------
  89. ;********************************************************************************************************/
  90. ;软件中断
  91. SoftwareInterrupt
  92.         LDR     SP, StackSvc            ; 重新设置堆栈指针
  93.         STMFD   SP!, {R0-R3, R12, LR}
  94.         MOV     R1, SP                  ; R1指向参数存储位置
  95.         MRS     R3, SPSR
  96.         TST     R3, #T_bit              ; 中断前是否是Thumb状态
  97.         LDRNEH  R0, [LR,#-2]            ; 是: 取得Thumb状态SWI号
  98.         BICNE   R0, R0, #0xff00
  99.         LDREQ   R0, [LR,#-4]            ; 否: 取得arm状态SWI号
  100.         BICEQ   R0, R0, #0xFF000000
  101.                                         ; r0 = SWI号,R1指向参数存储位置
  102.         CMP     R0, #1
  103.         LDRLO   PC, =OSIntCtxSw
  104.         LDREQ   PC, =__OSStartHighRdy   ; SWI 0x01为第一次任务切换
  105.         BL      SWI_Exception
  106.         
  107.         LDMFD   SP!, {R0-R3, R12, PC}^
  108.         
  109. StackSvc           DCD     (SvcStackSpace + SVC_STACK_LEGTH * 4 - 4)
  110. ;/*********************************************************************************************************
  111. ;** 函数名称: OSIntCtxSw
  112. ;** 功能描述: 中断退出时的入口
  113. ;** 输 入:   R3    :当前任务的状态寄存器CPSR(即SPSR的值)
  114. ;**           R4-R12:当前任务的R4-R11
  115. ;**           当前处理器模式的堆栈结构(出栈次序):R0-R3、R12、PC(当前任务的)
  116. ;** 输 出 :  无
  117. ;** 全局变量: OSPrioCur,OSPrioHighRdy,OSPrioCur,OSPrioHighRdy
  118. ;** 调用模块: 无
  119. ;** 
  120. ;** 作 者: 陈明计
  121. ;** 日 期: 2003年6月5日
  122. ;**-------------------------------------------------------------------------------------------------------
  123. ;** 修 改: 陈明计
  124. ;** 日 期: 2003年6月11日
  125. ;**-------------------------------------------------------------------------------------------------------
  126. ;** 修 改: 陈明计
  127. ;** 日 期: 2003年6月13日
  128. ;**-------------------------------------------------------------------------------------------------------
  129. ;** 修 改: 陈明计
  130. ;** 日 期: 2003年6月19日
  131. ;**-------------------------------------------------------------------------------------------------------
  132. ;********************************************************************************************************/
  133. OSIntCtxSw
  134.                                                     ;下面为保存任务环境
  135.         LDR     R2, [SP, #20]                       ;获取PC
  136.         LDR     R12, [SP, #16]                      ;获取R12
  137.         MRS     R0, CPSR
  138.         MSR     CPSR_c, #(NoInt | SYS32Mode)
  139.         MOV     R1, LR
  140.         STMFD   SP!, {R1-R2}                        ;保存LR,PC
  141.         STMFD   SP!, {R4-R12}                       ;保存R4-R12
  142.         MSR     CPSR_c, R0
  143.         LDMFD   SP!, {R4-R7}                        ;获取R0-R3
  144.         ADD     SP, SP, #8                          ;出栈R12,PC
  145.         
  146.         MSR     CPSR_c, #(NoInt | SYS32Mode)
  147.         STMFD   SP!, {R4-R7}                        ;保存R0-R3
  148.         
  149.         LDR     R1, =OsEnterSum                     ;获取OsEnterSum
  150.         LDR     R2, [R1]
  151.         STMFD   SP!, {R2, R3}                       ;保存CPSR,OsEnterSum
  152.                                                     ;保存当前任务堆栈指针到当前任务的TCB
  153.         LDR     R1, =OSTCBCur
  154.         LDR     R1, [R1]
  155.         STR     SP, [R1]
  156.         BL      OSTaskSwHook                        ;调用钩子函数
  157.                                                     ;OSPrioCur <= OSPrioHighRdy
  158.         LDR     R4, =OSPrioCur
  159.         LDR     R5, =OSPrioHighRdy
  160.         LDRB    R6, [R5]
  161.         STRB    R6, [R4]
  162.                                                     ;OSTCBCur <= OSTCBHighRdy
  163.         LDR     R6, =OSTCBHighRdy
  164.         LDR     R6, [R6]
  165.         LDR     R4, =OSTCBCur
  166.         STR     R6, [R4]
  167. OSIntCtxSw_1
  168.                                                     ;获取新任务堆栈指针
  169.         LDR     R4, [R6]
  170.         ADD     SP, R4, #68                         ;17寄存器CPSR,OsEnterSum,R0-R12,LR,SP
  171.         LDR     LR, [SP, #-8]
  172.         MSR     CPSR_c, #(NoInt | SVC32Mode)        ;进入管理模式
  173.         MOV     SP, R4                              ;设置堆栈指针
  174.         LDMFD   SP!, {R4, R5}                       ;CPSR,OsEnterSum
  175.                                                     ;恢复新任务的OsEnterSum
  176.         LDR     R3, =OsEnterSum
  177.         STR     R4, [R3]
  178.     
  179.         MSR     SPSR_cxsf, R5                       ;恢复CPSR
  180.         LDMFD   SP!, {R0-R12, LR, PC }^             ;运行新任务
  181. ;/*********************************************************************************************************
  182. ;** 函数名称: __OSStartHighRdy
  183. ;** 功能描述: uC/OS-II启动时使用OSStartHighRdy运行第一个任务,
  184. ;**           OSStartHighRdy会调用__OSStartHighRdy
  185. ;** 输 入:   无
  186. ;** 输 出 :  无
  187. ;** 全局变量: OSRunning,OSTCBCur,OSTCBHighRdy,OsEnterSum
  188. ;** 调用模块: OSTaskSwHook
  189. ;** 
  190. ;** 作 者: 陈明计
  191. ;** 日 期: 2003年6月5日
  192. ;**-------------------------------------------------------------------------------------------------------
  193. ;** 修 改: 陈明计
  194. ;** 日 期: 2003年6月13日
  195. ;**-------------------------------------------------------------------------------------------------------
  196. ;********************************************************************************************************/
  197. __OSStartHighRdy
  198.         MSR     CPSR_c, #(NoInt | SYS32Mode)
  199.                                                 ;告诉uC/OS-II自身已经运行
  200.         LDR     R4, =OSRunning
  201.         MOV     R5, #1
  202.         STRB    R5, [R4]
  203.         BL      OSTaskSwHook                    ;调用钩子函数
  204.         LDR     R6, =OSTCBHighRdy
  205.         LDR     R6, [R6]
  206.         B       OSIntCtxSw_1
  207.         AREA    SWIStacks, DATA, NOINIT,ALIGN=2
  208. SvcStackSpace      SPACE   SVC_STACK_LEGTH * 4  ;管理模式堆栈空间
  209.     END
  210. ;/*********************************************************************************************************
  211. ;**                            End Of File
  212. ;********************************************************************************************************/