| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216 | /* * FreeRTOS Kernel V10.4.3 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates.  All Rights Reserved. * * 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. * * https://www.FreeRTOS.org * https://github.com/FreeRTOS * *//*-----------------------------------------------------------* 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 * 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. */#include "deprecated_definitions.h"/* If portENTER_CRITICAL is not defined then including deprecated_definitions.h * 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. */#ifndef portENTER_CRITICAL    #include "portmacro.h"#endif#if portBYTE_ALIGNMENT == 32    #define portBYTE_ALIGNMENT_MASK    ( 0x001f )#endif#if portBYTE_ALIGNMENT == 16    #define portBYTE_ALIGNMENT_MASK    ( 0x000f )#endif#if portBYTE_ALIGNMENT == 8    #define portBYTE_ALIGNMENT_MASK    ( 0x0007 )#endif#if portBYTE_ALIGNMENT == 4    #define portBYTE_ALIGNMENT_MASK    ( 0x0003 )#endif#if portBYTE_ALIGNMENT == 2    #define portBYTE_ALIGNMENT_MASK    ( 0x0001 )#endif#if portBYTE_ALIGNMENT == 1    #define portBYTE_ALIGNMENT_MASK    ( 0x0000 )#endif#ifndef portBYTE_ALIGNMENT_MASK    #error "Invalid portBYTE_ALIGNMENT definition"#endif#ifndef portNUM_CONFIGURABLE_REGIONS    #define portNUM_CONFIGURABLE_REGIONS    1#endif#ifndef portHAS_STACK_OVERFLOW_CHECKING    #define portHAS_STACK_OVERFLOW_CHECKING    0#endif#ifndef portARCH_NAME    #define portARCH_NAME    NULL#endif/* *INDENT-OFF* */#ifdef __cplusplus    extern "C" {#endif/* *INDENT-ON* */#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. * */#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#endif /* if ( portUSING_MPU_WRAPPERS == 1 ) *//* Used by heap_5.c to define the start address and size of each memory region * that together comprise the total FreeRTOS heap space. */typedef struct HeapRegion{    uint8_t * pucStartAddress;    size_t xSizeInBytes;} HeapRegion_t;/* Used to pass information about the heap out of vPortGetHeapStats(). */typedef struct xHeapStats{    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. */} 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. */void vPortGetHeapStats( HeapStats_t * pxHeapStats );/* * Map to the memory management routines required for the port. */void * pvPortMalloc( size_t xSize ) PRIVILEGED_FUNCTION;void vPortFree( void * pv ) PRIVILEGED_FUNCTION;void vPortInitialiseBlocks( void ) PRIVILEGED_FUNCTION;size_t xPortGetFreeHeapSize( void ) PRIVILEGED_FUNCTION;size_t xPortGetMinimumEverFreeHeapSize( void ) PRIVILEGED_FUNCTION;/* * 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;/* * 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/* *INDENT-OFF* */#ifdef __cplusplus    }#endif/* *INDENT-ON* */#endif /* PORTABLE_H */
 |