mirror of
https://github.com/FreeRTOS/FreeRTOS-Kernel.git
synced 2025-04-19 13:01:57 -04:00
213 lines
8.9 KiB
C
213 lines
8.9 KiB
C
/* Copyright (c) 2020, XMOS Ltd, All rights reserved */
|
|
|
|
#ifndef PORTMACRO_H
|
|
#define PORTMACRO_H
|
|
|
|
#ifndef __ASSEMBLER__
|
|
|
|
/* Inclusion of xc1.h will result in clock being defined as a type.
|
|
* By default, FreeRTOS will require standard time.h, where clock is a function.
|
|
*/
|
|
#ifndef USE_XCORE_CLOCK_TYPE
|
|
#define _clock_defined
|
|
#endif
|
|
|
|
#include <xs1.h>
|
|
#include "rtos_support.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* Type definitions. */
|
|
#define portSTACK_TYPE uint32_t
|
|
typedef portSTACK_TYPE StackType_t;
|
|
typedef double portDOUBLE;
|
|
typedef int32_t BaseType_t;
|
|
typedef uint32_t UBaseType_t;
|
|
|
|
#define portBASE_TYPE BaseType_t
|
|
|
|
#if ( configUSE_16_BIT_TICKS == 1 )
|
|
typedef uint16_t TickType_t;
|
|
#define portMAX_DELAY ( TickType_t ) 0xffff
|
|
#else
|
|
typedef uint32_t TickType_t;
|
|
#define portMAX_DELAY ( TickType_t ) 0xffffffffUL
|
|
|
|
/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do
|
|
* not need to be guarded with a critical section. */
|
|
#define portTICK_TYPE_IS_ATOMIC 1
|
|
#endif
|
|
/*-----------------------------------------------------------*/
|
|
|
|
#endif /* __ASSEMBLER__ */
|
|
|
|
/* Architecture specifics. These can be used by assembly files as well. */
|
|
#define portSTACK_GROWTH ( -1 )
|
|
#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ )
|
|
#define portBYTE_ALIGNMENT 8
|
|
#define portCRITICAL_NESTING_IN_TCB 1
|
|
#define portMAX_CORE_COUNT 8
|
|
#ifndef configNUMBER_OF_CORES
|
|
#define configNUMBER_OF_CORES 1
|
|
#endif
|
|
|
|
/* This may be set to zero in the config file if the rtos_time
|
|
* functions are not needed or if it is incremented elsewhere. */
|
|
#ifndef configUPDATE_RTOS_TIME_FROM_TICK_ISR
|
|
#define configUPDATE_RTOS_TIME_FROM_TICK_ISR 1
|
|
#endif
|
|
|
|
/*
|
|
* When entering an ISR we need to grow the stack by one more word than
|
|
* we actually need to save the thread context. This is because there are
|
|
* some functions, written in assembly *cough* memcpy() *cough*, that think
|
|
* it is OK to store words at SP[0]. Therefore the ISR must leave SP[0] alone
|
|
* even though it is normally not necessary to do so.
|
|
*/
|
|
#define portTHREAD_CONTEXT_STACK_GROWTH RTOS_SUPPORT_INTERRUPT_STACK_GROWTH
|
|
|
|
#ifndef __ASSEMBLER__
|
|
|
|
/* Check validity of number of cores specified in config */
|
|
#if ( configNUMBER_OF_CORES < 1 || portMAX_CORE_COUNT < configNUMBER_OF_CORES )
|
|
#error "Invalid number of cores specified in config!"
|
|
#endif
|
|
|
|
#define portMEMORY_BARRIER() RTOS_MEMORY_BARRIER()
|
|
#define portTASK_STACK_DEPTH( pxTaskCode ) RTOS_THREAD_STACK_SIZE( pxTaskCode )
|
|
/*-----------------------------------------------------------*/
|
|
|
|
/* Scheduler utilities. */
|
|
#define portYIELD() asm volatile ( "KCALLI_lu6 0" ::: "memory" )
|
|
|
|
#define portEND_SWITCHING_ISR( xSwitchRequired ) \
|
|
do \
|
|
{ \
|
|
if( xSwitchRequired != pdFALSE ) \
|
|
{ \
|
|
extern uint32_t ulPortYieldRequired[ portMAX_CORE_COUNT ]; \
|
|
ulPortYieldRequired[ portGET_CORE_ID() ] = pdTRUE; \
|
|
} \
|
|
} while( 0 )
|
|
|
|
#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x )
|
|
/*-----------------------------------------------------------*/
|
|
|
|
/* SMP utilities. */
|
|
#define portGET_CORE_ID() rtos_core_id_get()
|
|
|
|
void vPortYieldOtherCore( int xOtherCoreID );
|
|
#define portYIELD_CORE( x ) vPortYieldOtherCore( x )
|
|
/*-----------------------------------------------------------*/
|
|
|
|
/* Architecture specific optimisations. */
|
|
#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION
|
|
#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0
|
|
#endif
|
|
|
|
#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1
|
|
|
|
/* Store/clear the ready priorities in a bit map. */
|
|
#define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) )
|
|
#define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) )
|
|
|
|
/*-----------------------------------------------------------*/
|
|
|
|
#define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( uint32_t ) __builtin_clz( uxReadyPriorities ) )
|
|
|
|
#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */
|
|
/*-----------------------------------------------------------*/
|
|
|
|
/* Critical section management. */
|
|
|
|
#define portGET_INTERRUPT_STATE() rtos_interrupt_mask_get()
|
|
|
|
/*
|
|
* This differs from the standard portDISABLE_INTERRUPTS()
|
|
* in that it also returns what the interrupt state was
|
|
* before it disabling interrupts.
|
|
*/
|
|
#define portDISABLE_INTERRUPTS() rtos_interrupt_mask_all()
|
|
|
|
#define portENABLE_INTERRUPTS() rtos_interrupt_unmask_all()
|
|
|
|
/*
|
|
* Port set interrupt mask and clear interrupt mask.
|
|
*/
|
|
#define portSET_INTERRUPT_MASK() rtos_interrupt_mask_all()
|
|
#define portCLEAR_INTERRUPT_MASK( ulState ) rtos_interrupt_mask_set( ulState )
|
|
|
|
/*
|
|
* Will enable interrupts if ulState is non-zero.
|
|
*/
|
|
#define portRESTORE_INTERRUPTS( ulState ) rtos_interrupt_mask_set( ulState )
|
|
|
|
/*
|
|
* Returns non-zero if currently running in an
|
|
* ISR or otherwise in kernel mode.
|
|
*/
|
|
#define portCHECK_IF_IN_ISR() rtos_isr_running()
|
|
|
|
#define portASSERT_IF_IN_ISR() configASSERT( portCHECK_IF_IN_ISR() == 0 )
|
|
|
|
#define portGET_ISR_LOCK( xCoreID ) do{ ( void )( xCoreID ); rtos_lock_acquire( 0 ); } while( 0 )
|
|
#define portRELEASE_ISR_LOCK( xCoreID ) do{ ( void )( xCoreID ); rtos_lock_release( 0 ); } while( 0 )
|
|
#define portGET_TASK_LOCK( xCoreID ) do{ ( void )( xCoreID ); rtos_lock_acquire( 1 ); } while( 0 )
|
|
#define portRELEASE_TASK_LOCK( xCoreID ) do{ ( void )( xCoreID ); rtos_lock_release( 1 ); } while( 0 )
|
|
|
|
|
|
void vTaskEnterCritical( void );
|
|
void vTaskExitCritical( void );
|
|
#define portENTER_CRITICAL() vTaskEnterCritical()
|
|
#define portEXIT_CRITICAL() vTaskExitCritical()
|
|
|
|
extern UBaseType_t vTaskEnterCriticalFromISR( void );
|
|
extern void vTaskExitCriticalFromISR( UBaseType_t uxSavedInterruptStatus );
|
|
#define portENTER_CRITICAL_FROM_ISR vTaskEnterCriticalFromISR
|
|
#define portEXIT_CRITICAL_FROM_ISR vTaskExitCriticalFromISR
|
|
|
|
/*-----------------------------------------------------------*/
|
|
|
|
/* Runtime stats support */
|
|
#if ( configGENERATE_RUN_TIME_STATS == 1 )
|
|
int xscope_gettime( void );
|
|
#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() /* nothing needed here */
|
|
#define portGET_RUN_TIME_COUNTER_VALUE() xscope_gettime()
|
|
#endif
|
|
/*-----------------------------------------------------------*/
|
|
|
|
/* Maps sprintf and snprintf to the lite version in lib_rtos_support */
|
|
#if ( configUSE_DEBUG_SPRINTF == 1 )
|
|
#define sprintf( ... ) rtos_sprintf( __VA_ARGS__ )
|
|
#define snprintf( ... ) rtos_snprintf( __VA_ARGS__ )
|
|
#endif
|
|
|
|
/* Attribute for the pxCallbackFunction member of the Timer_t struct.
|
|
* Required by xcc to calculate stack usage. */
|
|
#define portTIMER_CALLBACK_ATTRIBUTE __attribute__( ( fptrgroup( "timerCallbackGroup" ) ) )
|
|
|
|
/* Timer callback function macros. For xcc this ensures they get added to the timer callback
|
|
* group so that stack usage for certain functions in timers.c can be calculated. */
|
|
#define portTIMER_CALLBACK_FUNCTION_PROTO( vFunction, xTimer ) void vFunction( TimerHandle_t xTimer )
|
|
#define portTIMER_CALLBACK_FUNCTION( vFunction, xTimer ) portTIMER_CALLBACK_ATTRIBUTE void vFunction( TimerHandle_t xTimer )
|
|
|
|
/*-----------------------------------------------------------*/
|
|
|
|
/* Task function macros as described on the FreeRTOS.org WEB site. These are
|
|
* not necessary for to use this port. They are defined so the common demo files
|
|
* (which build with all the ports) will build. */
|
|
#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters )
|
|
#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters )
|
|
/*-----------------------------------------------------------*/
|
|
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* __ASSEMBLER__ */
|
|
|
|
#endif /* PORTMACRO_H */
|