mirror of
				https://github.com/0xFEEDC0DE64/arduino-esp32.git
				synced 2025-11-04 08:01:38 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			226 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			226 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
    FreeRTOS V8.2.0 - Copyright (C) 2015 Real Time Engineers Ltd.
 | 
						|
    All rights reserved
 | 
						|
 | 
						|
    VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
 | 
						|
 | 
						|
    This file is part of the FreeRTOS distribution.
 | 
						|
 | 
						|
    FreeRTOS is free software; you can redistribute it and/or modify it under
 | 
						|
    the terms of the GNU General Public License (version 2) as published by the
 | 
						|
    Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.
 | 
						|
 | 
						|
	***************************************************************************
 | 
						|
    >>!   NOTE: The modification to the GPL is included to allow you to     !<<
 | 
						|
    >>!   distribute a combined work that includes FreeRTOS without being   !<<
 | 
						|
    >>!   obliged to provide the source code for proprietary components     !<<
 | 
						|
    >>!   outside of the FreeRTOS kernel.                                   !<<
 | 
						|
	***************************************************************************
 | 
						|
 | 
						|
    FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY
 | 
						|
    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 | 
						|
    FOR A PARTICULAR PURPOSE.  Full license text is available on the following
 | 
						|
    link: http://www.freertos.org/a00114.html
 | 
						|
 | 
						|
    ***************************************************************************
 | 
						|
     *                                                                       *
 | 
						|
     *    FreeRTOS provides completely free yet professionally developed,    *
 | 
						|
     *    robust, strictly quality controlled, supported, and cross          *
 | 
						|
     *    platform software that is more than just the market leader, it     *
 | 
						|
     *    is the industry's de facto standard.                               *
 | 
						|
     *                                                                       *
 | 
						|
     *    Help yourself get started quickly while simultaneously helping     *
 | 
						|
     *    to support the FreeRTOS project by purchasing a FreeRTOS           *
 | 
						|
     *    tutorial book, reference manual, or both:                          *
 | 
						|
     *    http://www.FreeRTOS.org/Documentation                              *
 | 
						|
     *                                                                       *
 | 
						|
    ***************************************************************************
 | 
						|
 | 
						|
    http://www.FreeRTOS.org/FAQHelp.html - Having a problem?  Start by reading
 | 
						|
	the FAQ page "My application does not run, what could be wrong?".  Have you
 | 
						|
	defined configASSERT()?
 | 
						|
 | 
						|
	http://www.FreeRTOS.org/support - In return for receiving this top quality
 | 
						|
	embedded software for free we request you assist our global community by
 | 
						|
	participating in the support forum.
 | 
						|
 | 
						|
	http://www.FreeRTOS.org/training - Investing in training allows your team to
 | 
						|
	be as productive as possible as early as possible.  Now you can receive
 | 
						|
	FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers
 | 
						|
	Ltd, and the world's leading authority on the world's leading RTOS.
 | 
						|
 | 
						|
    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
 | 
						|
    including FreeRTOS+Trace - an indispensable productivity tool, a DOS
 | 
						|
    compatible FAT file system, and our tiny thread aware UDP/IP stack.
 | 
						|
 | 
						|
    http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate.
 | 
						|
    Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS.
 | 
						|
 | 
						|
    http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High
 | 
						|
    Integrity Systems ltd. to sell under the OpenRTOS brand.  Low cost OpenRTOS
 | 
						|
    licenses offer ticketed support, indemnification and commercial middleware.
 | 
						|
 | 
						|
    http://www.SafeRTOS.com - High Integrity Systems also provide a safety
 | 
						|
    engineered and independently SIL3 certified version for use in safety and
 | 
						|
    mission critical applications that require provable dependability.
 | 
						|
 | 
						|
    1 tab == 4 spaces!
 | 
						|
*/
 | 
						|
 | 
						|
/*-----------------------------------------------------------
 | 
						|
 * 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 == 8
 | 
						|
	#define portBYTE_ALIGNMENT_MASK ( 0x0007U )
 | 
						|
#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
 | 
						|
 | 
						|
#ifdef __cplusplus
 | 
						|
extern "C" {
 | 
						|
#endif
 | 
						|
 | 
						|
#include "mpu_wrappers.h"
 | 
						|
#include "esp_system.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 )
 | 
						|
	StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters, BaseType_t xRunPrivileged ) PRIVILEGED_FUNCTION;
 | 
						|
#else
 | 
						|
	StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) PRIVILEGED_FUNCTION;
 | 
						|
#endif
 | 
						|
 | 
						|
/*
 | 
						|
 * Map to the memory management routines required for the port.
 | 
						|
 *
 | 
						|
 * Note that libc standard malloc/free are also available for
 | 
						|
 * non-FreeRTOS-specific code, and behave the same as
 | 
						|
 * pvPortMalloc()/vPortFree().
 | 
						|
 */
 | 
						|
#define pvPortMalloc malloc
 | 
						|
#define vPortFree free
 | 
						|
#define xPortGetFreeHeapSize esp_get_free_heap_size
 | 
						|
#define xPortGetMinimumEverFreeHeapSize esp_get_minimum_free_heap_size
 | 
						|
 | 
						|
/*
 | 
						|
 * 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;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
 * Send an interrupt to another core in order to make the task running
 | 
						|
 * on it yield for a higher-priority task.
 | 
						|
 */
 | 
						|
 | 
						|
void vPortYieldOtherCore( BaseType_t coreid) PRIVILEGED_FUNCTION;
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
 Callback to set a watchpoint on the end of the stack. Called every context switch to change the stack
 | 
						|
 watchpoint around.
 | 
						|
 */
 | 
						|
void vPortSetStackWatchpoint( void* pxStackStart );
 | 
						|
 | 
						|
/*
 | 
						|
 * Returns true if the current core is in ISR context; low prio ISR, med prio ISR or timer tick ISR. High prio ISRs
 | 
						|
 * aren't detected here, but they normally cannot call C code, so that should not be an issue anyway.
 | 
						|
 */
 | 
						|
BaseType_t xPortInIsrContext();
 | 
						|
 | 
						|
/*
 | 
						|
 * This function will be called in High prio ISRs. Returns true if the current core was in ISR context
 | 
						|
 * before calling into high prio ISR context.
 | 
						|
 */
 | 
						|
BaseType_t xPortInterruptedFromISRContext();
 | 
						|
 | 
						|
/*
 | 
						|
 * 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 usStackDepth ) PRIVILEGED_FUNCTION;
 | 
						|
	void vPortReleaseTaskMPUSettings( xMPU_SETTINGS *xMPUSettings );
 | 
						|
#endif
 | 
						|
 | 
						|
/* Multi-core: get current core ID */
 | 
						|
static inline uint32_t IRAM_ATTR xPortGetCoreID() {
 | 
						|
    int id;
 | 
						|
    __asm__ __volatile__ (
 | 
						|
        "rsr.prid %0\n"
 | 
						|
        " extui %0,%0,13,1"
 | 
						|
        :"=r"(id));
 | 
						|
    return id;
 | 
						|
}
 | 
						|
 | 
						|
/* Get tick rate per second */
 | 
						|
uint32_t xPortGetTickRateHz(void);
 | 
						|
 | 
						|
#ifdef __cplusplus
 | 
						|
}
 | 
						|
#endif
 | 
						|
 | 
						|
void uxPortCompareSetExtram(volatile uint32_t *addr, uint32_t compare, uint32_t *set);
 | 
						|
 | 
						|
#endif /* PORTABLE_H */
 | 
						|
 |