mirror of
https://github.com/FreeRTOS/FreeRTOS-Kernel.git
synced 2025-04-19 21:11:57 -04:00
* Add XMOS XCore ports Some minor modifications are also made to the kernel to support the XCore compiler's automatic stack size calculation. * Update kernel to support SMP The XMOS XCore ports are also updated to support SMP. * Fix compiler warnings in xcore ports The port set and clear interrupt mask from ISR macros were removed from the ports so that the default macros found in FreeRTOS.h are used instead. The default macros do not result in warnings when they are used. * Remove inline function from timers.h Inline function converted to macro. This should now build when optimizations are off and inlining is disabled. * Fix compiler warnings in xcore ports and tasks.c * fixed documentation for ulTaskNotifyTake() and ulTaskNotifyTakeIndexed() * spelling fixes for tasks.c Co-authored-by: Michael Bruno <mikeb@xmos.com>
237 lines
8.8 KiB
C
237 lines
8.8 KiB
C
|
|
/*
|
|
* FreeRTOS Kernel V10.4.3
|
|
* Copyright (C) 2017 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. If you wish to use our Amazon
|
|
* FreeRTOS name, please do so in a fair use way that does not cause confusion.
|
|
*
|
|
* 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
|
|
*
|
|
* 1 tab == 4 spaces!
|
|
*/
|
|
|
|
/*
|
|
* Copyright (c) 2015-2019 Cadence Design Systems, Inc.
|
|
*
|
|
* 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.
|
|
*/
|
|
|
|
#ifndef PORTMACRO_H
|
|
#define PORTMACRO_H
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#ifndef __ASSEMBLER__
|
|
|
|
#include <stdint.h>
|
|
|
|
#include <xtensa/tie/xt_core.h>
|
|
#include <xtensa/hal.h>
|
|
#include <xtensa/config/core.h>
|
|
#include <xtensa/config/system.h> /* required for XSHAL_CLIB */
|
|
#include <xtensa/xtruntime.h>
|
|
|
|
//#include "xtensa_context.h"
|
|
|
|
/*-----------------------------------------------------------
|
|
* Port specific definitions.
|
|
*
|
|
* The settings in this file configure FreeRTOS correctly for the
|
|
* given hardware and compiler.
|
|
*
|
|
* These settings should not be altered.
|
|
*-----------------------------------------------------------
|
|
*/
|
|
|
|
/* Type definitions. */
|
|
|
|
#define portCHAR int8_t
|
|
#define portFLOAT float
|
|
#define portDOUBLE double
|
|
#define portLONG int32_t
|
|
#define portSHORT int16_t
|
|
#define portSTACK_TYPE uint32_t
|
|
#define portBASE_TYPE int
|
|
|
|
typedef portSTACK_TYPE StackType_t;
|
|
typedef portBASE_TYPE BaseType_t;
|
|
typedef unsigned portBASE_TYPE UBaseType_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
|
|
#endif
|
|
/*-----------------------------------------------------------*/
|
|
|
|
// portbenchmark
|
|
#include "portbenchmark.h"
|
|
|
|
/* Critical section management. NW-TODO: replace XTOS_SET_INTLEVEL with more efficient version, if any? */
|
|
// These cannot be nested. They should be used with a lot of care and cannot be called from interrupt level.
|
|
#define portDISABLE_INTERRUPTS() do { XTOS_SET_INTLEVEL(XCHAL_EXCM_LEVEL); portbenchmarkINTERRUPT_DISABLE(); } while (0)
|
|
#define portENABLE_INTERRUPTS() do { portbenchmarkINTERRUPT_RESTORE(0); XTOS_SET_INTLEVEL(0); } while (0)
|
|
|
|
// These can be nested
|
|
#define portCRITICAL_NESTING_IN_TCB 1 // For now, let FreeRTOS' (tasks.c) manage critical nesting
|
|
void vTaskEnterCritical(void);
|
|
void vTaskExitCritical(void);
|
|
#define portENTER_CRITICAL() vTaskEnterCritical()
|
|
#define portEXIT_CRITICAL() vTaskExitCritical()
|
|
|
|
// Cleaner and preferred solution allows nested interrupts disabling and restoring via local registers or stack.
|
|
// They can be called from interrupts too.
|
|
static inline unsigned portENTER_CRITICAL_NESTED() { unsigned state = XTOS_SET_INTLEVEL(XCHAL_EXCM_LEVEL); portbenchmarkINTERRUPT_DISABLE(); return state; }
|
|
#define portEXIT_CRITICAL_NESTED(state) do { portbenchmarkINTERRUPT_RESTORE(state); XTOS_RESTORE_JUST_INTLEVEL(state); } while (0)
|
|
|
|
// These FreeRTOS versions are similar to the nested versions above
|
|
#define portSET_INTERRUPT_MASK_FROM_ISR() portENTER_CRITICAL_NESTED()
|
|
#define portCLEAR_INTERRUPT_MASK_FROM_ISR(state) portEXIT_CRITICAL_NESTED(state)
|
|
|
|
/*-----------------------------------------------------------*/
|
|
|
|
/* Architecture specifics. */
|
|
#define portSTACK_GROWTH ( -1 )
|
|
#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ )
|
|
#define portBYTE_ALIGNMENT 4
|
|
#define portNOP() XT_NOP()
|
|
/*-----------------------------------------------------------*/
|
|
|
|
/* Fine resolution time */
|
|
#define portGET_RUN_TIME_COUNTER_VALUE() xthal_get_ccount()
|
|
|
|
/* Kernel utilities. */
|
|
void vPortYield( void );
|
|
void _frxt_setup_switch( void );
|
|
#define portYIELD() vPortYield()
|
|
#define portYIELD_FROM_ISR( xHigherPriorityTaskWoken ) \
|
|
if ( ( xHigherPriorityTaskWoken ) != 0 ) { \
|
|
_frxt_setup_switch(); \
|
|
}
|
|
|
|
/*-----------------------------------------------------------*/
|
|
|
|
/* Task function macros as described on the FreeRTOS.org WEB site. */
|
|
#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters )
|
|
#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters )
|
|
|
|
// When coprocessors are defined, we to maintain a pointer to coprocessors area.
|
|
// We currently use a hack: redefine field xMPU_SETTINGS in TCB block as a structure that can hold:
|
|
// MPU wrappers, coprocessor area pointer, trace code structure, and more if needed.
|
|
// The field is normally used for memory protection. FreeRTOS should create another general purpose field.
|
|
typedef struct {
|
|
#if XCHAL_CP_NUM > 0
|
|
volatile StackType_t* coproc_area; // Pointer to coprocessor save area; MUST BE FIRST
|
|
#endif
|
|
|
|
#if portUSING_MPU_WRAPPERS
|
|
// Define here mpu_settings, which is port dependent
|
|
int mpu_setting; // Just a dummy example here; MPU not ported to Xtensa yet
|
|
#endif
|
|
|
|
#if configUSE_TRACE_FACILITY_2
|
|
struct {
|
|
// Cf. porttraceStamp()
|
|
int taskstamp; /* Stamp from inside task to see where we are */
|
|
int taskstampcount; /* A counter usually incremented when we restart the task's loop */
|
|
} porttrace;
|
|
#endif
|
|
} xMPU_SETTINGS;
|
|
|
|
// Main hack to use MPU_wrappers even when no MPU is defined (warning: mpu_setting should not be accessed; otherwise move this above xMPU_SETTINGS)
|
|
#if (XCHAL_CP_NUM > 0 || configUSE_TRACE_FACILITY_2) && !portUSING_MPU_WRAPPERS // If MPU wrappers not used, we still need to allocate coproc area
|
|
#undef portUSING_MPU_WRAPPERS
|
|
#define portUSING_MPU_WRAPPERS 1 // Enable it to allocate coproc area
|
|
#define MPU_WRAPPERS_H // Override mpu_wrapper.h to disable unwanted code
|
|
#define PRIVILEGED_FUNCTION
|
|
#define PRIVILEGED_DATA
|
|
#endif
|
|
|
|
// porttrace
|
|
#if configUSE_TRACE_FACILITY_2
|
|
#include "porttrace.h"
|
|
#endif
|
|
|
|
// configASSERT_2 if requested
|
|
#if configASSERT_2
|
|
#include <stdio.h>
|
|
void exit(int);
|
|
#define configASSERT( x ) if (!(x)) { porttracePrint(-1); printf("\nAssertion failed in %s:%d\n", __FILE__, __LINE__); exit(-1); }
|
|
#endif
|
|
|
|
|
|
/* C library support -- only XCLIB and NEWLIB are supported. */
|
|
|
|
/* To enable thread-safe C library support, XT_USE_THREAD_SAFE_CLIB must be
|
|
defined to be > 0 somewhere above or on the command line. */
|
|
|
|
#if (XT_USE_THREAD_SAFE_CLIB > 0u) && (XSHAL_CLIB == XTHAL_CLIB_XCLIB)
|
|
extern void vPortClibInit(void);
|
|
|
|
// No cleanup necessary at this time.
|
|
#define portCLEAN_UP_TCB(pxTCB)
|
|
#endif // XCLIB support
|
|
|
|
#if (XT_USE_THREAD_SAFE_CLIB > 0u) && (XSHAL_CLIB == XTHAL_CLIB_NEWLIB)
|
|
extern void vPortClibInit(void);
|
|
|
|
// This C library cleanup is not currently done by FreeRTOS when deleting a task
|
|
#include <stdio.h>
|
|
#define portCLEAN_UP_TCB(pxTCB) vPortCleanUpTcbClib(&((pxTCB)->xNewLib_reent))
|
|
static inline void vPortCleanUpTcbClib(struct _reent *ptr)
|
|
{
|
|
FILE * fp = &(ptr->__sf[0]);
|
|
int i;
|
|
for (i = 0; i < 3; ++i, ++fp) {
|
|
fp->_close = NULL;
|
|
}
|
|
}
|
|
#endif // NEWLIB support
|
|
|
|
#endif // __ASSEMBLER__
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* PORTMACRO_H */
|
|
|