portable.h 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. /*
  2. * FreeRTOS Kernel V10.3.1
  3. * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
  4. *
  5. * Permission is hereby granted, free of charge, to any person obtaining a copy of
  6. * this software and associated documentation files (the "Software"), to deal in
  7. * the Software without restriction, including without limitation the rights to
  8. * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
  9. * the Software, and to permit persons to whom the Software is furnished to do so,
  10. * subject to the following conditions:
  11. *
  12. * The above copyright notice and this permission notice shall be included in all
  13. * copies or substantial portions of the Software.
  14. *
  15. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
  17. * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
  18. * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
  19. * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  20. * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  21. *
  22. * http://www.FreeRTOS.org
  23. * http://aws.amazon.com/freertos
  24. *
  25. * 1 tab == 4 spaces!
  26. */
  27. /*-----------------------------------------------------------
  28. * Portable layer API. Each function must be defined for each port.
  29. *----------------------------------------------------------*/
  30. #ifndef PORTABLE_H
  31. #define PORTABLE_H
  32. /* Each FreeRTOS port has a unique portmacro.h header file. Originally a
  33. pre-processor definition was used to ensure the pre-processor found the correct
  34. portmacro.h file for the port being used. That scheme was deprecated in favour
  35. of setting the compiler's include path such that it found the correct
  36. portmacro.h file - removing the need for the constant and allowing the
  37. portmacro.h file to be located anywhere in relation to the port being used.
  38. Purely for reasons of backward compatibility the old method is still valid, but
  39. to make it clear that new projects should not use it, support for the port
  40. specific constants has been moved into the deprecated_definitions.h header
  41. file. */
  42. #include "deprecated_definitions.h"
  43. /* If portENTER_CRITICAL is not defined then including deprecated_definitions.h
  44. did not result in a portmacro.h header file being included - and it should be
  45. included here. In this case the path to the correct portmacro.h header file
  46. must be set in the compiler's include path. */
  47. #ifndef portENTER_CRITICAL
  48. #include "portmacro.h"
  49. #endif
  50. #if portBYTE_ALIGNMENT == 32
  51. #define portBYTE_ALIGNMENT_MASK ( 0x001f )
  52. #endif
  53. #if portBYTE_ALIGNMENT == 16
  54. #define portBYTE_ALIGNMENT_MASK ( 0x000f )
  55. #endif
  56. #if portBYTE_ALIGNMENT == 8
  57. #define portBYTE_ALIGNMENT_MASK ( 0x0007 )
  58. #endif
  59. #if portBYTE_ALIGNMENT == 4
  60. #define portBYTE_ALIGNMENT_MASK ( 0x0003 )
  61. #endif
  62. #if portBYTE_ALIGNMENT == 2
  63. #define portBYTE_ALIGNMENT_MASK ( 0x0001 )
  64. #endif
  65. #if portBYTE_ALIGNMENT == 1
  66. #define portBYTE_ALIGNMENT_MASK ( 0x0000 )
  67. #endif
  68. #ifndef portBYTE_ALIGNMENT_MASK
  69. #error "Invalid portBYTE_ALIGNMENT definition"
  70. #endif
  71. #ifndef portNUM_CONFIGURABLE_REGIONS
  72. #define portNUM_CONFIGURABLE_REGIONS 1
  73. #endif
  74. #ifndef portHAS_STACK_OVERFLOW_CHECKING
  75. #define portHAS_STACK_OVERFLOW_CHECKING 0
  76. #endif
  77. #ifndef portARCH_NAME
  78. #define portARCH_NAME NULL
  79. #endif
  80. #ifdef __cplusplus
  81. extern "C" {
  82. #endif
  83. #include "mpu_wrappers.h"
  84. /*
  85. * Setup the stack of a new task so it is ready to be placed under the
  86. * scheduler control. The registers have to be placed on the stack in
  87. * the order that the port expects to find them.
  88. *
  89. */
  90. #if( portUSING_MPU_WRAPPERS == 1 )
  91. #if( portHAS_STACK_OVERFLOW_CHECKING == 1 )
  92. StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, StackType_t *pxEndOfStack, TaskFunction_t pxCode, void *pvParameters, BaseType_t xRunPrivileged ) PRIVILEGED_FUNCTION;
  93. #else
  94. StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters, BaseType_t xRunPrivileged ) PRIVILEGED_FUNCTION;
  95. #endif
  96. #else
  97. #if( portHAS_STACK_OVERFLOW_CHECKING == 1 )
  98. StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, StackType_t *pxEndOfStack, TaskFunction_t pxCode, void *pvParameters ) PRIVILEGED_FUNCTION;
  99. #else
  100. StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) PRIVILEGED_FUNCTION;
  101. #endif
  102. #endif
  103. /* Used by heap_5.c to define the start address and size of each memory region
  104. that together comprise the total FreeRTOS heap space. */
  105. typedef struct HeapRegion
  106. {
  107. uint8_t *pucStartAddress;
  108. size_t xSizeInBytes;
  109. } HeapRegion_t;
  110. /* Used to pass information about the heap out of vPortGetHeapStats(). */
  111. typedef struct xHeapStats
  112. {
  113. size_t xAvailableHeapSpaceInBytes; /* The total heap size currently available - this is the sum of all the free blocks, not the largest block that can be allocated. */
  114. size_t xSizeOfLargestFreeBlockInBytes; /* The maximum size, in bytes, of all the free blocks within the heap at the time vPortGetHeapStats() is called. */
  115. size_t xSizeOfSmallestFreeBlockInBytes; /* The minimum size, in bytes, of all the free blocks within the heap at the time vPortGetHeapStats() is called. */
  116. size_t xNumberOfFreeBlocks; /* The number of free memory blocks within the heap at the time vPortGetHeapStats() is called. */
  117. size_t xMinimumEverFreeBytesRemaining; /* The minimum amount of total free memory (sum of all free blocks) there has been in the heap since the system booted. */
  118. size_t xNumberOfSuccessfulAllocations; /* The number of calls to pvPortMalloc() that have returned a valid memory block. */
  119. size_t xNumberOfSuccessfulFrees; /* The number of calls to vPortFree() that has successfully freed a block of memory. */
  120. } HeapStats_t;
  121. /*
  122. * Used to define multiple heap regions for use by heap_5.c. This function
  123. * must be called before any calls to pvPortMalloc() - not creating a task,
  124. * queue, semaphore, mutex, software timer, event group, etc. will result in
  125. * pvPortMalloc being called.
  126. *
  127. * pxHeapRegions passes in an array of HeapRegion_t structures - each of which
  128. * defines a region of memory that can be used as the heap. The array is
  129. * terminated by a HeapRegions_t structure that has a size of 0. The region
  130. * with the lowest start address must appear first in the array.
  131. */
  132. void vPortDefineHeapRegions( const HeapRegion_t * const pxHeapRegions ) PRIVILEGED_FUNCTION;
  133. /*
  134. * Returns a HeapStats_t structure filled with information about the current
  135. * heap state.
  136. */
  137. void vPortGetHeapStats( HeapStats_t *pxHeapStats );
  138. /*
  139. * Map to the memory management routines required for the port.
  140. */
  141. void *pvPortMalloc( size_t xSize ) PRIVILEGED_FUNCTION;
  142. void vPortFree( void *pv ) PRIVILEGED_FUNCTION;
  143. void vPortInitialiseBlocks( void ) PRIVILEGED_FUNCTION;
  144. size_t xPortGetFreeHeapSize( void ) PRIVILEGED_FUNCTION;
  145. size_t xPortGetMinimumEverFreeHeapSize( void ) PRIVILEGED_FUNCTION;
  146. /*
  147. * Setup the hardware ready for the scheduler to take control. This generally
  148. * sets up a tick interrupt and sets timers for the correct tick frequency.
  149. */
  150. BaseType_t xPortStartScheduler( void ) PRIVILEGED_FUNCTION;
  151. /*
  152. * Undo any hardware/ISR setup that was performed by xPortStartScheduler() so
  153. * the hardware is left in its original condition after the scheduler stops
  154. * executing.
  155. */
  156. void vPortEndScheduler( void ) PRIVILEGED_FUNCTION;
  157. /*
  158. * The structures and methods of manipulating the MPU are contained within the
  159. * port layer.
  160. *
  161. * Fills the xMPUSettings structure with the memory region information
  162. * contained in xRegions.
  163. */
  164. #if( portUSING_MPU_WRAPPERS == 1 )
  165. struct xMEMORY_REGION;
  166. void vPortStoreTaskMPUSettings( xMPU_SETTINGS *xMPUSettings, const struct xMEMORY_REGION * const xRegions, StackType_t *pxBottomOfStack, uint32_t ulStackDepth ) PRIVILEGED_FUNCTION;
  167. #endif
  168. #ifdef __cplusplus
  169. }
  170. #endif
  171. #endif /* PORTABLE_H */