portmacro.inc 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  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. IMPORT ulCriticalNesting ;
  55. IMPORT pxCurrentTCB ;
  56. MACRO
  57. portRESTORE_CONTEXT
  58. LDR R0, =pxCurrentTCB ; Set the LR to the task stack. The location was...
  59. LDR R0, [R0] ; ... stored in pxCurrentTCB
  60. LDR LR, [R0]
  61. LDR R0, =ulCriticalNesting ; The critical nesting depth is the first item on...
  62. LDMFD LR!, {R1} ; ...the stack. Load it into the ulCriticalNesting var.
  63. STR R1, [R0] ;
  64. LDMFD LR!, {R0} ; Get the SPSR from the stack.
  65. MSR SPSR_cxsf, R0 ;
  66. LDMFD LR, {R0-R14}^ ; Restore all system mode registers for the task.
  67. NOP ;
  68. LDR LR, [LR, #+60] ; Restore the return address
  69. ; And return - correcting the offset in the LR to obtain ...
  70. SUBS PC, LR, #4 ; ...the correct address.
  71. MEND
  72. ; /**********************************************************************/
  73. MACRO
  74. portSAVE_CONTEXT
  75. STMDB SP!, {R0} ; Store R0 first as we need to use it.
  76. STMDB SP,{SP}^ ; Set R0 to point to the task stack pointer.
  77. NOP ;
  78. SUB SP, SP, #4 ;
  79. LDMIA SP!,{R0} ;
  80. STMDB R0!, {LR} ; Push the return address onto the stack.
  81. MOV LR, R0 ; Now we have saved LR we can use it instead of R0.
  82. LDMIA SP!, {R0} ; Pop R0 so we can save it onto the system mode stack.
  83. STMDB LR,{R0-LR}^ ; Push all the system mode registers onto the task stack.
  84. NOP ;
  85. SUB LR, LR, #60 ;
  86. MRS R0, SPSR ; Push the SPSR onto the task stack.
  87. STMDB LR!, {R0} ;
  88. LDR R0, =ulCriticalNesting ;
  89. LDR R0, [R0] ;
  90. STMDB LR!, {R0} ;
  91. LDR R0, =pxCurrentTCB ; Store the new top of stack for the task.
  92. LDR R1, [R0] ;
  93. STR LR, [R1] ;
  94. MEND
  95. END