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