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

uCOS

开发平台:

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.     PRESERVE8
  57.     AREA    |subr|, CODE, READONLY
  58.             IMPORT  OSTCBCur                    ;指向当前任务TCB的指针
  59.             IMPORT  OSTCBHighRdy                ;指向将要运行的任务TCB的指针
  60.             IMPORT  OSPrioCur                   ;当前任务的优先级
  61.             IMPORT  OSPrioHighRdy               ;将要运行的任务的优先级
  62.             IMPORT  OSTaskSwHook                ;任务切换的钩子函数
  63.             IMPORT  OSRunning                   ;uC/OS-II运行标志
  64.             IMPORT  OsEnterSum                  ;关中断计数器(关中断信号量)
  65.             IMPORT  SWI_Exception               ;软中断异常处理程序
  66.             
  67.             EXPORT  __OSStartHighRdy            
  68.             EXPORT  OSIntCtxSw                  ;中断退出时的入口,参见startup.s中的IRQ_Handler
  69.             EXPORT  SoftwareInterrupt           ;软中断入口
  70. ;/*********************************************************************************************************
  71. ;** 函数名称: SoftwareInterrupt
  72. ;** 功能描述: 软件中断,用于提供一些系统服务,功能参考os_cpu_c.c文件
  73. ;** 输 入:   依功能而定
  74. ;** 输 出 :  依功能而定
  75. ;** 全局变量: 无
  76. ;** 调用模块: SWI_Exception
  77. ;** 
  78. ;** 作 者: 陈明计
  79. ;** 日 期: 2003年6月5日
  80. ;**-------------------------------------------------------------------------------------------------------
  81. ;** 修 改: 陈明计
  82. ;** 日 期: 2003年6月11日
  83. ;**-------------------------------------------------------------------------------------------------------
  84. ;** 修 改: 陈明计
  85. ;** 日 期: 2003年6月13日
  86. ;**-------------------------------------------------------------------------------------------------------
  87. ;** 修 改: 陈明计
  88. ;** 日 期: 2003年6月19日
  89. ;**-------------------------------------------------------------------------------------------------------
  90. ;********************************************************************************************************/
  91. ;软件中断
  92. SoftwareInterrupt
  93.         LDR     SP, StackSvc            ; 重新设置堆栈指针
  94.         STMFD   SP!, {R0-R3, R12, LR}
  95.         MOV     R1, SP                  ; R1指向参数存储位置
  96.         MRS     R3, SPSR
  97.         TST     R3, #T_bit              ; 中断前是否是Thumb状态
  98.         LDRNEH  R0, [LR,#-2]            ; 是: 取得Thumb状态SWI号
  99.         BICNE   R0, R0, #0xff00
  100.         LDREQ   R0, [LR,#-4]            ; 否: 取得arm状态SWI号
  101.         BICEQ   R0, R0, #0xFF000000
  102.                                         ; r0 = SWI号,R1指向参数存储位置
  103.         CMP     R0, #1
  104.         LDRLO   PC, =OSIntCtxSw
  105.         LDREQ   PC, =__OSStartHighRdy   ; SWI 0x01为第一次任务切换
  106.         BL      SWI_Exception
  107.         
  108.         LDMFD   SP!, {R0-R3, R12, PC}^
  109.         
  110. StackSvc           DCD     (SvcStackSpace + SVC_STACK_LEGTH * 4 - 4)
  111. ;/*********************************************************************************************************
  112. ;** 函数名称: OSIntCtxSw
  113. ;** 功能描述: 中断退出时的入口
  114. ;** 输 入:   R3    :当前任务的状态寄存器CPSR(即SPSR的值)
  115. ;**           R4-R12:当前任务的R4-R11
  116. ;**           当前处理器模式的堆栈结构(出栈次序):R0-R3、R12、PC(当前任务的)
  117. ;** 输 出 :  无
  118. ;** 全局变量: OSPrioCur,OSPrioHighRdy,OSPrioCur,OSPrioHighRdy
  119. ;** 调用模块: 无
  120. ;** 
  121. ;** 作 者: 陈明计
  122. ;** 日 期: 2003年6月5日
  123. ;**-------------------------------------------------------------------------------------------------------
  124. ;** 修 改: 陈明计
  125. ;** 日 期: 2003年6月11日
  126. ;**-------------------------------------------------------------------------------------------------------
  127. ;** 修 改: 陈明计
  128. ;** 日 期: 2003年6月13日
  129. ;**-------------------------------------------------------------------------------------------------------
  130. ;** 修 改: 陈明计
  131. ;** 日 期: 2003年6月19日
  132. ;**-------------------------------------------------------------------------------------------------------
  133. ;********************************************************************************************************/
  134. OSIntCtxSw
  135.                                                     ;下面为保存任务环境
  136.         LDR     R2, [SP, #20]                       ;获取PC
  137.         LDR     R12, [SP, #16]                      ;获取R12
  138.         MRS     R0, CPSR
  139.         MSR     CPSR_c, #(NoInt | SYS32Mode)
  140.         MOV     R1, LR
  141.         STMFD   SP!, {R1-R2}                        ;保存LR,PC
  142.         STMFD   SP!, {R4-R12}                       ;保存R4-R12
  143.         MSR     CPSR_c, R0
  144.         LDMFD   SP!, {R4-R7}                        ;获取R0-R3
  145.         ADD     SP, SP, #8                          ;出栈R12,PC
  146.         
  147.         MSR     CPSR_c, #(NoInt | SYS32Mode)
  148.         STMFD   SP!, {R4-R7}                        ;保存R0-R3
  149.         
  150.         LDR     R1, =OsEnterSum                     ;获取OsEnterSum
  151.         LDR     R2, [R1]
  152.         STMFD   SP!, {R2, R3}                       ;保存CPSR,OsEnterSum
  153.                                                     ;保存当前任务堆栈指针到当前任务的TCB
  154.         LDR     R1, =OSTCBCur
  155.         LDR     R1, [R1]
  156.         STR     SP, [R1]
  157.         BL      OSTaskSwHook                        ;调用钩子函数
  158.                                                     ;OSPrioCur <= OSPrioHighRdy
  159.         LDR     R4, =OSPrioCur
  160.         LDR     R5, =OSPrioHighRdy
  161.         LDRB    R6, [R5]
  162.         STRB    R6, [R4]
  163.                                                     ;OSTCBCur <= OSTCBHighRdy
  164.         LDR     R6, =OSTCBHighRdy
  165.         LDR     R6, [R6]
  166.         LDR     R4, =OSTCBCur
  167.         STR     R6, [R4]
  168. OSIntCtxSw_1
  169.                                                     ;获取新任务堆栈指针
  170.         LDR     R4, [R6]
  171.         ADD     SP, R4, #68                         ;17寄存器CPSR,OsEnterSum,R0-R12,LR,SP
  172.         LDR     LR, [SP, #-8]
  173.         MSR     CPSR_c, #(NoInt | SVC32Mode)        ;进入管理模式
  174.         MOV     SP, R4                              ;设置堆栈指针
  175.         LDMFD   SP!, {R4, R5}                       ;CPSR,OsEnterSum
  176.                                                     ;恢复新任务的OsEnterSum
  177.         LDR     R3, =OsEnterSum
  178.         STR     R4, [R3]
  179.     
  180.         MSR     SPSR_cxsf, R5                       ;恢复CPSR
  181.         LDMFD   SP!, {R0-R12, LR, PC }^             ;运行新任务
  182. ;/*********************************************************************************************************
  183. ;** 函数名称: __OSStartHighRdy
  184. ;** 功能描述: uC/OS-II启动时使用OSStartHighRdy运行第一个任务,
  185. ;**           OSStartHighRdy会调用__OSStartHighRdy
  186. ;** 输 入:   无
  187. ;** 输 出 :  无
  188. ;** 全局变量: OSRunning,OSTCBCur,OSTCBHighRdy,OsEnterSum
  189. ;** 调用模块: OSTaskSwHook
  190. ;** 
  191. ;** 作 者: 陈明计
  192. ;** 日 期: 2003年6月5日
  193. ;**-------------------------------------------------------------------------------------------------------
  194. ;** 修 改: 陈明计
  195. ;** 日 期: 2003年6月13日
  196. ;**-------------------------------------------------------------------------------------------------------
  197. ;********************************************************************************************************/
  198. __OSStartHighRdy
  199.         MSR     CPSR_c, #(NoInt | SYS32Mode)
  200.                                                 ;告诉uC/OS-II自身已经运行
  201.         LDR     R4, =OSRunning
  202.         MOV     R5, #1
  203.         STRB    R5, [R4]
  204.         BL      OSTaskSwHook                    ;调用钩子函数
  205.         LDR     R6, =OSTCBHighRdy
  206.         LDR     R6, [R6]
  207.         B       OSIntCtxSw_1
  208.         AREA    SWIStacks, DATA, NOINIT,ALIGN=2
  209. SvcStackSpace      SPACE   SVC_STACK_LEGTH * 4  ;管理模式堆栈空间
  210.     END
  211. ;/*********************************************************************************************************
  212. ;**                            End Of File
  213. ;********************************************************************************************************/