OS_CPU_A.A51
上传用户:jyxpgd88
上传日期:2013-04-13
资源大小:90k
文件大小:5k
源码类别:

uCOS

开发平台:

C/C++

  1. $NOMOD51
  2. ; The uC/OS II port for Dallas 80C390 on Keil C51 V7
  3. ;
  4. ; Ported date:     Dec 2, 2003
  5. ; By:              Stuart Wright (swright@jiskoot.com)
  6. ; Target platform: Keil C51 V7.07 and above 
  7. ; Based on port for 8051 by John X. Liu, China, (johnxliu@163.com)
  8. NAME OS_CPU_A_ASM
  9. ; ?C_XBP is the simulated external stack pointer in large mode, but its origianal
  10. ; declare makes it can not be used in c files, so redeclare it in this module 
  11. ; insteading of the old one
  12. PUBLIC ?C_XBP, C_XBP ;
  13. EXTRN   CODE(_?C_OSCtxSw)
  14. PUBLIC _?LoadCtx, STACK_START, _?OSCtxSw, _?KCOSCtxSw
  15. #include "reg390.h"
  16. LoadXBP MACRO
  17. MOV  DPX,#0
  18. MOV DPH, C_XBP
  19. MOV DPL, C_XBP+1
  20. ENDM
  21. SaveXBP MACRO
  22. PUSH IE
  23. CLR EA
  24. MOV C_XBP,   DPH
  25. MOV C_XBP+1, DPL
  26. POP IE
  27. ENDM
  28. LoadREG MACRO   REG
  29. MOVX A,   @DPTR
  30. MOV REG, A
  31. ENDM
  32. SaveREG MACRO   REG
  33. MOV A, REG
  34. MOVX @DPTR,  A
  35. ENDM
  36. ; The PUSHA now emulates the pushing sequence what Keil C does.
  37. PUSHR MACRO
  38. ; IRP REG, <ACC, B, DPX, DPH, DPL, DPX1, DPH1, DPL1, DPS, PSW, 0, 1, 2, 3, 4, 5, 6, 7> ;Code for two DPTR's
  39. IRP REG, <ACC, B, DPX, DPH, DPL, PSW, 0, 1, 2, 3, 4, 5, 6, 7> ;Code for one DPTR ; Code for one DPTR
  40. PUSH REG
  41. ENDM
  42. ENDM
  43. POPR MACRO
  44. ; IRP REG, <7, 6, 5, 4, 3, 2, 1, 0, PSW, DPS, DPL1, DPH1, DPX1, DPL, DPH, DPX, B, ACC> ;Code for two DPTR's
  45. IRP REG, <7, 6, 5, 4, 3, 2, 1, 0, PSW, DPL, DPH, DPX, B, ACC> ;Code for one DPTR ; Code for one DPTR
  46. POP REG
  47. ENDM
  48. ENDM
  49. ; Declare the external stack pointer by ourself, so that we can use it freely.
  50. ; you know, in the name of '?C_XBP' it can not be used in c modules but in the 
  51. ; name of 'C_XBP' it can do.
  52. DT?C_XBP SEGMENT DATA
  53. RSEG DT?C_XBP
  54. ?C_XBP: ; These two labels point to the same address
  55. C_XBP: ;
  56. DS 2
  57. ; Declare a label 'Stack' in the hardware stack segment so that we know where it begins.
  58. ?STACK SEGMENT IDATA
  59. RSEG ?STACK
  60. STACK_START:
  61. DS 1
  62. ; Load context from the external stack pointed by C_XBP
  63. PR?LoadCtx      SEGMENT CODE
  64. RSEG PR?LoadCtx
  65. _?LoadCtx:
  66. LoadXBP ; Load the C_XBP to DPTR
  67. LoadREG SP ; Load the hardware stack pointer
  68. INC DPTR ;
  69.         MOV     R0, SP ; Now we pop the hardware stack
  70. LC_1: ; from the external one.
  71. LoadREG @R0 ; Did not use the PUSH ACC instruction for if we want to
  72. INC     DPTR ; do so, we have to DEC DPTR, which costs much.
  73. DEC     R0 ;
  74. CJNE    R0, #BYTE0 (STACK_START-1), LC_1 ;
  75. SaveXBP ; after the hardware stack has been popped,
  76. ; the external stack pointer should be adjusted
  77. RestoreCtx:
  78. WANTFASTER EQU 1
  79. $IF WANTFASTER
  80. POP PSW ; A little bit dangerous but it works. C is PSW.7 and EA is IE.7
  81. MOV EA, C ; They are at the same bit location of a byte.
  82. $ELSE
  83. POP ACC ; Safe way to do the same thing.
  84. RLC A ;
  85. MOV EA, C ;
  86. $ENDIF
  87. ; Now that the context has been loaded into hardware
  88.   POPR ; stack, what we need do is just popping them upto registers.
  89. ;
  90. RET ; Now everything is ready, a RET will bring the task to run.
  91. ; Task level context switch entry point, which is intended to be called by task gracefully. 
  92. _?OSCtxSw:
  93. PUSHR ; Save current context first into hardware stack
  94. PUSH IE
  95. _?KCOSCtxSw: ; Now begin pushing hardware stack to external one
  96. LoadXBP ; Load the external stack pointer first to prepare storing 
  97. ; data into it.
  98. MOV A, SP ; Calculate how much memory in external stack needed
  99. CLR C ; so that we can adjust the external stack pointer
  100. SUBB A, #BYTE0 (STACK_START-1) ; Calculated the length of hardware stack
  101. MOV R0, A ; Save the length of hardware stack to R0, which is used as a counter on saving hardware stack.
  102. INC A ; Add the space for storing SP
  103. CLR C
  104. XCH A, DPL ; Now ACC contains the right amount of external stack memory should be used.
  105. SUBB A, DPL ; Adjust the external pointer.stored in DPTR to make to point to the new stack top from where we will store hardware stack.
  106. JNC SC_1
  107. DEC DPH
  108. SC_1:
  109. MOV DPL,A ; Now DPTR contains the external stack pointer after pushing context into external stack.
  110. SaveXBP ; Save to external stack pointer.
  111. ; Keeps the DPTR containing the external stack pointer still.
  112. SaveREG SP ; Save hardware stack pointer in the top of external stack
  113. SC_2:
  114. INC DPTR ;
  115. POP ACC ; Pop the data from hareware stack
  116. MOVX @DPTR, A ; and save into external one.
  117. DJNZ    R0, SC_2 ; Remember, R0 contains the hardware stack's length.
  118. LJMP _?C_OSCtxSw ; 
  119. END