2022-01-29 03:49:56 -05:00
/*
* SPDX - FileCopyrightText : 2020 Amazon . com , Inc . or its affiliates
*
* SPDX - License - Identifier : MIT
*
* SPDX - FileContributor : 2016 - 2022 Espressif Systems ( Shanghai ) CO LTD
*/
2016-08-17 11:08:22 -04:00
/*
2021-08-24 00:06:21 -04:00
* FreeRTOS Kernel V10 .4 .3
2021-08-17 04:10:45 -04:00
* Copyright ( C ) 2020 Amazon . com , Inc . or its affiliates . All Rights Reserved .
2019-11-28 13:27:47 -05:00
*
* Permission is hereby granted , free of charge , to any person obtaining a copy of
* this software and associated documentation files ( the " Software " ) , to deal in
* the Software without restriction , including without limitation the rights to
* use , copy , modify , merge , publish , distribute , sublicense , and / or sell copies of
* the Software , and to permit persons to whom the Software is furnished to do so ,
* subject to the following conditions :
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software .
*
* THE SOFTWARE IS PROVIDED " AS IS " , WITHOUT WARRANTY OF ANY KIND , EXPRESS OR
* IMPLIED , INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY , FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT . IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM , DAMAGES OR OTHER LIABILITY , WHETHER
* IN AN ACTION OF CONTRACT , TORT OR OTHERWISE , ARISING FROM , OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE .
*
2021-08-17 04:10:45 -04:00
* https : //www.FreeRTOS.org
* https : //github.com/FreeRTOS
2019-11-28 13:27:47 -05:00
*
*/
2016-08-17 11:08:22 -04:00
/*-----------------------------------------------------------
* Portable layer API . Each function must be defined for each port .
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
# ifndef PORTABLE_H
# define PORTABLE_H
/* Each FreeRTOS port has a unique portmacro.h header file. Originally a
2021-08-17 04:10:45 -04:00
* pre - processor definition was used to ensure the pre - processor found the correct
* portmacro . h file for the port being used . That scheme was deprecated in favour
* of setting the compiler ' s include path such that it found the correct
* portmacro . h file - removing the need for the constant and allowing the
* portmacro . h file to be located anywhere in relation to the port being used .
* Purely for reasons of backward compatibility the old method is still valid , but
* to make it clear that new projects should not use it , support for the port
* specific constants has been moved into the deprecated_definitions . h header
* file . */
2016-08-17 11:08:22 -04:00
# include "deprecated_definitions.h"
/* If portENTER_CRITICAL is not defined then including deprecated_definitions.h
2021-08-17 04:10:45 -04:00
* did not result in a portmacro . h header file being included - and it should be
* included here . In this case the path to the correct portmacro . h header file
* must be set in the compiler ' s include path . */
2016-08-17 11:08:22 -04:00
# ifndef portENTER_CRITICAL
2021-08-17 04:10:45 -04:00
# include "freertos/portmacro.h"
2016-08-17 11:08:22 -04:00
# endif
2019-11-28 13:27:47 -05:00
# if portBYTE_ALIGNMENT == 32
2021-08-17 04:10:45 -04:00
# define portBYTE_ALIGNMENT_MASK ( 0x001f )
2019-11-28 13:27:47 -05:00
# endif
# if portBYTE_ALIGNMENT == 16
2021-08-17 04:10:45 -04:00
# define portBYTE_ALIGNMENT_MASK ( 0x000f )
2019-11-28 13:27:47 -05:00
# endif
2016-08-17 11:08:22 -04:00
# if portBYTE_ALIGNMENT == 8
2021-08-17 04:10:45 -04:00
# define portBYTE_ALIGNMENT_MASK ( 0x0007 )
2016-08-17 11:08:22 -04:00
# endif
# if portBYTE_ALIGNMENT == 4
2021-08-17 04:10:45 -04:00
# define portBYTE_ALIGNMENT_MASK ( 0x0003 )
2016-08-17 11:08:22 -04:00
# endif
# if portBYTE_ALIGNMENT == 2
2021-08-17 04:10:45 -04:00
# define portBYTE_ALIGNMENT_MASK ( 0x0001 )
2016-08-17 11:08:22 -04:00
# endif
# if portBYTE_ALIGNMENT == 1
2021-08-17 04:10:45 -04:00
# define portBYTE_ALIGNMENT_MASK ( 0x0000 )
2016-08-17 11:08:22 -04:00
# endif
# ifndef portBYTE_ALIGNMENT_MASK
2021-08-17 04:10:45 -04:00
# error "Invalid portBYTE_ALIGNMENT definition"
2016-08-17 11:08:22 -04:00
# endif
# ifndef portNUM_CONFIGURABLE_REGIONS
2021-08-17 04:10:45 -04:00
# define portNUM_CONFIGURABLE_REGIONS 1
2016-08-17 11:08:22 -04:00
# endif
2019-11-28 13:27:47 -05:00
# ifndef portHAS_STACK_OVERFLOW_CHECKING
2021-08-17 04:10:45 -04:00
# define portHAS_STACK_OVERFLOW_CHECKING 0
2019-11-28 13:27:47 -05:00
# endif
# ifndef portARCH_NAME
2021-08-17 04:10:45 -04:00
# define portARCH_NAME NULL
2019-11-28 13:27:47 -05:00
# endif
2021-08-17 04:10:45 -04:00
/* *INDENT-OFF* */
2016-08-17 11:08:22 -04:00
# ifdef __cplusplus
2021-08-17 04:10:45 -04:00
extern " C " {
2016-08-17 11:08:22 -04:00
# endif
2021-08-17 04:10:45 -04:00
/* *INDENT-ON* */
2016-08-17 11:08:22 -04:00
# include "mpu_wrappers.h"
/*
* Setup the stack of a new task so it is ready to be placed under the
* scheduler control . The registers have to be placed on the stack in
* the order that the port expects to find them .
*
*/
2021-08-17 04:10:45 -04:00
# if ( portUSING_MPU_WRAPPERS == 1 )
# if ( portHAS_STACK_OVERFLOW_CHECKING == 1 )
StackType_t * pxPortInitialiseStack ( StackType_t * pxTopOfStack ,
StackType_t * pxEndOfStack ,
TaskFunction_t pxCode ,
void * pvParameters ,
BaseType_t xRunPrivileged ) PRIVILEGED_FUNCTION ;
# else
StackType_t * pxPortInitialiseStack ( StackType_t * pxTopOfStack ,
TaskFunction_t pxCode ,
void * pvParameters ,
BaseType_t xRunPrivileged ) PRIVILEGED_FUNCTION ;
# endif
# else /* if ( portUSING_MPU_WRAPPERS == 1 ) */
# if ( portHAS_STACK_OVERFLOW_CHECKING == 1 )
StackType_t * pxPortInitialiseStack ( StackType_t * pxTopOfStack ,
StackType_t * pxEndOfStack ,
TaskFunction_t pxCode ,
void * pvParameters ) PRIVILEGED_FUNCTION ;
# else
StackType_t * pxPortInitialiseStack ( StackType_t * pxTopOfStack ,
TaskFunction_t pxCode ,
void * pvParameters ) PRIVILEGED_FUNCTION ;
# endif
2022-02-08 03:38:09 -05:00
# endif /* if ( portUSING_MPU_WRAPPERS == 1 ) */
2016-08-17 11:08:22 -04:00
2019-11-28 13:27:47 -05:00
# ifdef configUSE_FREERTOS_PROVIDED_HEAP
/* Used by heap_5.c to define the start address and size of each memory region
2021-08-17 04:10:45 -04:00
* that together comprise the total FreeRTOS heap space . */
2019-11-28 13:27:47 -05:00
typedef struct HeapRegion
{
2021-08-17 04:10:45 -04:00
uint8_t * pucStartAddress ;
size_t xSizeInBytes ;
2019-11-28 13:27:47 -05:00
} HeapRegion_t ;
/* Used to pass information about the heap out of vPortGetHeapStats(). */
typedef struct xHeapStats
{
2021-08-17 04:10:45 -04:00
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. */
size_t xSizeOfLargestFreeBlockInBytes ; /* The maximum size, in bytes, of all the free blocks within the heap at the time vPortGetHeapStats() is called. */
size_t xSizeOfSmallestFreeBlockInBytes ; /* The minimum size, in bytes, of all the free blocks within the heap at the time vPortGetHeapStats() is called. */
size_t xNumberOfFreeBlocks ; /* The number of free memory blocks within the heap at the time vPortGetHeapStats() is called. */
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. */
size_t xNumberOfSuccessfulAllocations ; /* The number of calls to pvPortMalloc() that have returned a valid memory block. */
size_t xNumberOfSuccessfulFrees ; /* The number of calls to vPortFree() that has successfully freed a block of memory. */
2019-11-28 13:27:47 -05:00
} HeapStats_t ;
/*
* Used to define multiple heap regions for use by heap_5 . c . This function
* must be called before any calls to pvPortMalloc ( ) - not creating a task ,
* queue , semaphore , mutex , software timer , event group , etc . will result in
* pvPortMalloc being called .
*
* pxHeapRegions passes in an array of HeapRegion_t structures - each of which
* defines a region of memory that can be used as the heap . The array is
* terminated by a HeapRegions_t structure that has a size of 0. The region
* with the lowest start address must appear first in the array .
*/
void vPortDefineHeapRegions ( const HeapRegion_t * const pxHeapRegions ) PRIVILEGED_FUNCTION ;
/*
* Returns a HeapStats_t structure filled with information about the current
* heap state .
*/
2021-08-17 04:10:45 -04:00
void vPortGetHeapStats ( HeapStats_t * pxHeapStats ) ;
2019-11-28 13:27:47 -05:00
/*
* Map to the memory management routines required for the port .
*/
2021-08-17 04:10:45 -04:00
void * pvPortMalloc ( size_t xSize ) PRIVILEGED_FUNCTION ;
void vPortFree ( void * pv ) PRIVILEGED_FUNCTION ;
2019-11-28 13:27:47 -05:00
void vPortInitialiseBlocks ( void ) PRIVILEGED_FUNCTION ;
size_t xPortGetFreeHeapSize ( void ) PRIVILEGED_FUNCTION ;
size_t xPortGetMinimumEverFreeHeapSize ( void ) PRIVILEGED_FUNCTION ;
2021-09-08 23:54:47 -04:00
# if( configSTACK_ALLOCATION_FROM_SEPARATE_HEAP == 1 )
void * pvPortMallocStack ( size_t xSize ) PRIVILEGED_FUNCTION ;
void vPortFreeStack ( void * pv ) PRIVILEGED_FUNCTION ;
# else
# define pvPortMallocStack pvPortMalloc
# define vPortFreeStack vPortFree
# endif
2020-09-24 16:25:52 -04:00
# else // configUSE_FREERTOS_PROVIDED_HEAP
2019-11-28 13:27:47 -05:00
2016-08-17 11:08:22 -04:00
/*
* Map to the memory management routines required for the port .
2017-05-03 04:03:28 -04:00
*
* Note that libc standard malloc / free are also available for
* non - FreeRTOS - specific code , and behave the same as
* pvPortMalloc ( ) / vPortFree ( ) .
2016-08-17 11:08:22 -04:00
*/
2017-05-11 03:56:17 -04:00
# define pvPortMalloc malloc
# define vPortFree free
# define xPortGetFreeHeapSize esp_get_free_heap_size
# define xPortGetMinimumEverFreeHeapSize esp_get_minimum_free_heap_size
2016-08-17 11:08:22 -04:00
2019-11-28 13:27:47 -05:00
# endif
2016-08-17 11:08:22 -04:00
/*
* Setup the hardware ready for the scheduler to take control . This generally
* sets up a tick interrupt and sets timers for the correct tick frequency .
*/
BaseType_t xPortStartScheduler ( void ) PRIVILEGED_FUNCTION ;
/*
* Undo any hardware / ISR setup that was performed by xPortStartScheduler ( ) so
* the hardware is left in its original condition after the scheduler stops
* executing .
*/
void vPortEndScheduler ( void ) PRIVILEGED_FUNCTION ;
2021-09-02 03:19:49 -04:00
/*
* The structures and methods of manipulating the MPU are contained within the
* port layer .
*
* Fills the xMPUSettings structure with the memory region information
* contained in xRegions .
*/
# if ( portUSING_MPU_WRAPPERS == 1 )
struct xMEMORY_REGION ;
void vPortStoreTaskMPUSettings ( xMPU_SETTINGS * xMPUSettings ,
const struct xMEMORY_REGION * const xRegions ,
StackType_t * pxBottomOfStack ,
uint32_t ulStackDepth ) PRIVILEGED_FUNCTION ;
# endif
2021-08-17 04:10:45 -04:00
/* *INDENT-OFF* */
2016-08-17 11:08:22 -04:00
# ifdef __cplusplus
2021-08-17 04:10:45 -04:00
}
2016-08-17 11:08:22 -04:00
# endif
2021-08-17 04:10:45 -04:00
/* *INDENT-ON* */
2016-08-17 11:08:22 -04:00
# endif /* PORTABLE_H */