portmacro.inc 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. ;/*
  2. ; FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd.
  3. ; All rights reserved
  4. ;
  5. ;
  6. ; ***************************************************************************
  7. ; * *
  8. ; * FreeRTOS tutorial books are available in pdf and paperback. *
  9. ; * Complete, revised, and edited pdf reference manuals are also *
  10. ; * available. *
  11. ; * *
  12. ; * Purchasing FreeRTOS documentation will not only help you, by *
  13. ; * ensuring you get running as quickly as possible and with an *
  14. ; * in-depth knowledge of how to use FreeRTOS, it will also help *
  15. ; * the FreeRTOS project to continue with its mission of providing *
  16. ; * professional grade, cross platform, de facto standard solutions *
  17. ; * for microcontrollers - completely free of charge! *
  18. ; * *
  19. ; * >>> See http://www.FreeRTOS.org/Documentation for details. <<< *
  20. ; * *
  21. ; * Thank you for using FreeRTOS, and thank you for your support! *
  22. ; * *
  23. ; ***************************************************************************
  24. ;
  25. ;
  26. ; This file is part of the FreeRTOS distribution.
  27. ;
  28. ; FreeRTOS is free software; you can redistribute it and/or modify it under
  29. ; the terms of the GNU General Public License (version 2) as published by the
  30. ; Free Software Foundation AND MODIFIED BY the FreeRTOS exception.
  31. ; >>>NOTE<<< The modification to the GPL is included to allow you to
  32. ; distribute a combined work that includes FreeRTOS without being obliged to
  33. ; provide the source code for proprietary components outside of the FreeRTOS
  34. ; kernel. FreeRTOS is distributed in the hope that it will be useful, but
  35. ; WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  36. ; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  37. ; more details. You should have received a copy of the GNU General Public
  38. ; License and the FreeRTOS license exception along with FreeRTOS; if not it
  39. ; can be viewed here: http://www.freertos.org/a00114.html and also obtained
  40. ; by writing to Richard Barry, contact details for whom are available on the
  41. ; FreeRTOS WEB site.
  42. ;
  43. ; 1 tab == 4 spaces!
  44. ;
  45. ; http://www.FreeRTOS.org - Documentation, latest information, license and
  46. ; contact details.
  47. ;
  48. ; http://www.SafeRTOS.com - A version that is certified for use in safety
  49. ; critical systems.
  50. ;
  51. ; http://www.OpenRTOS.com - Commercial support, development, porting,
  52. ; licensing and training services.
  53. ;*/
  54. SYS_MODE EQU 0x1f
  55. SVC_MODE EQU 0x13
  56. IRQ_MODE EQU 0x12
  57. IMPORT ulCriticalNesting
  58. IMPORT pxCurrentTCB
  59. IMPORT ulPortTaskHasFPUContext
  60. IMPORT ulAsmAPIPriorityMask
  61. IMPORT ulICCPMR
  62. MACRO
  63. portSAVE_CONTEXT
  64. ; Save the LR and SPSR onto the system mode stack before switching to
  65. ; system mode to save the remaining system mode registers
  66. SRSDB sp!, #SYS_MODE
  67. CPS #SYS_MODE
  68. PUSH {R0-R12, R14}
  69. ; Push the critical nesting count
  70. LDR R2, =ulCriticalNesting
  71. LDR R1, [R2]
  72. PUSH {R1}
  73. ; Does the task have a floating point context that needs saving? If
  74. ; ulPortTaskHasFPUContext is 0 then no.
  75. LDR R2, =ulPortTaskHasFPUContext
  76. LDR R3, [R2]
  77. CMP R3, #0
  78. ; Save the floating point context, if any
  79. FMRXNE R1, FPSCR
  80. VPUSHNE {D0-D15}
  81. VPUSHNE {D16-D31}
  82. PUSHNE {R1}
  83. ; Save ulPortTaskHasFPUContext itself
  84. PUSH {R3}
  85. ; Save the stack pointer in the TCB
  86. LDR R0, =pxCurrentTCB
  87. LDR R1, [R0]
  88. STR SP, [R1]
  89. MEND
  90. ; /**********************************************************************/
  91. MACRO
  92. portRESTORE_CONTEXT
  93. ; Set the SP to point to the stack of the task being restored.
  94. LDR R0, =pxCurrentTCB
  95. LDR R1, [R0]
  96. LDR SP, [R1]
  97. ; Is there a floating point context to restore? If the restored
  98. ; ulPortTaskHasFPUContext is zero then no.
  99. LDR R0, =ulPortTaskHasFPUContext
  100. POP {R1}
  101. STR R1, [R0]
  102. CMP R1, #0
  103. ; Restore the floating point context, if any
  104. POPNE {R0}
  105. VPOPNE {D16-D31}
  106. VPOPNE {D0-D15}
  107. VMSRNE FPSCR, R0
  108. ; Restore the critical section nesting depth
  109. LDR R0, =ulCriticalNesting
  110. POP {R1}
  111. STR R1, [R0]
  112. ; Ensure the priority mask is correct for the critical nesting depth
  113. LDR R2, =ulICCPMR
  114. CMP R1, #0
  115. MOVEQ R4, #255
  116. LDRNE R4, =ulAsmAPIPriorityMask
  117. STR R4, [r2]
  118. ; Restore all system mode registers other than the SP (which is already
  119. ; being used)
  120. POP {R0-R12, R14}
  121. ; Return to the task code, loading CPSR on the way.
  122. RFEIA sp!
  123. MEND
  124. END