mirror of
https://github.com/FreeRTOS/FreeRTOS-Kernel.git
synced 2025-09-12 09:07:46 -04:00
Style: remove tabs = spaces
This commit is contained in:
parent
be3a40d780
commit
050a87fe15
1 changed files with 817 additions and 777 deletions
|
@ -22,7 +22,6 @@
|
||||||
* http://www.FreeRTOS.org
|
* http://www.FreeRTOS.org
|
||||||
* http://aws.amazon.com/freertos
|
* http://aws.amazon.com/freertos
|
||||||
*
|
*
|
||||||
* 1 tab == 4 spaces!
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining
|
/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining
|
||||||
|
@ -40,7 +39,7 @@
|
||||||
/* Portasm includes. */
|
/* Portasm includes. */
|
||||||
#include "portasm.h"
|
#include "portasm.h"
|
||||||
|
|
||||||
#if( configENABLE_TRUSTZONE == 1 )
|
#if ( configENABLE_TRUSTZONE == 1 )
|
||||||
/* Secure components includes. */
|
/* Secure components includes. */
|
||||||
#include "secure_context.h"
|
#include "secure_context.h"
|
||||||
#include "secure_init.h"
|
#include "secure_init.h"
|
||||||
|
@ -63,7 +62,7 @@
|
||||||
* 3. Run FreeRTOS on the Non-Secure Side only i.e. no Secure Side function call support:
|
* 3. Run FreeRTOS on the Non-Secure Side only i.e. no Secure Side function call support:
|
||||||
* configRUN_FREERTOS_SECURE_ONLY = 0 and configENABLE_TRUSTZONE = 0
|
* configRUN_FREERTOS_SECURE_ONLY = 0 and configENABLE_TRUSTZONE = 0
|
||||||
*/
|
*/
|
||||||
#if( ( configRUN_FREERTOS_SECURE_ONLY == 1 ) && ( configENABLE_TRUSTZONE == 1 ) )
|
#if ( ( configRUN_FREERTOS_SECURE_ONLY == 1 ) && ( configENABLE_TRUSTZONE == 1 ) )
|
||||||
#error TrustZone needs to be disabled in order to run FreeRTOS on the Secure Side.
|
#error TrustZone needs to be disabled in order to run FreeRTOS on the Secure Side.
|
||||||
#endif
|
#endif
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
@ -71,10 +70,10 @@
|
||||||
/**
|
/**
|
||||||
* @brief Constants required to manipulate the NVIC.
|
* @brief Constants required to manipulate the NVIC.
|
||||||
*/
|
*/
|
||||||
#define portNVIC_SYSTICK_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000e010 ) )
|
#define portNVIC_SYSTICK_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000e010 ) )
|
||||||
#define portNVIC_SYSTICK_LOAD_REG ( * ( ( volatile uint32_t * ) 0xe000e014 ) )
|
#define portNVIC_SYSTICK_LOAD_REG ( *( ( volatile uint32_t * ) 0xe000e014 ) )
|
||||||
#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( * ( ( volatile uint32_t * ) 0xe000e018 ) )
|
#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( *( ( volatile uint32_t * ) 0xe000e018 ) )
|
||||||
#define portNVIC_SYSPRI2_REG ( * ( ( volatile uint32_t * ) 0xe000ed20 ) )
|
#define portNVIC_SHPR3_REG ( *( ( volatile uint32_t * ) 0xe000ed20 ) )
|
||||||
#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL )
|
#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL )
|
||||||
#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL )
|
#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL )
|
||||||
#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL )
|
#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL )
|
||||||
|
@ -86,7 +85,8 @@
|
||||||
/* Ensure the SysTick is clocked at the same frequency as the core. */
|
/* Ensure the SysTick is clocked at the same frequency as the core. */
|
||||||
#define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL )
|
#define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL )
|
||||||
#else
|
#else
|
||||||
/* The way the SysTick is clocked is not modified in case it is not the
|
|
||||||
|
/* The way the SysTick is clocked is not modified in case it is not the
|
||||||
* same a the core. */
|
* same a the core. */
|
||||||
#define portNVIC_SYSTICK_CLK_BIT ( 0 )
|
#define portNVIC_SYSTICK_CLK_BIT ( 0 )
|
||||||
#endif
|
#endif
|
||||||
|
@ -95,7 +95,7 @@
|
||||||
/**
|
/**
|
||||||
* @brief Constants required to manipulate the SCB.
|
* @brief Constants required to manipulate the SCB.
|
||||||
*/
|
*/
|
||||||
#define portSCB_SYS_HANDLER_CTRL_STATE_REG ( * ( volatile uint32_t * ) 0xe000ed24 )
|
#define portSCB_SYS_HANDLER_CTRL_STATE_REG ( *( volatile uint32_t * ) 0xe000ed24 )
|
||||||
#define portSCB_MEM_FAULT_ENABLE_BIT ( 1UL << 16UL )
|
#define portSCB_MEM_FAULT_ENABLE_BIT ( 1UL << 16UL )
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
@ -118,24 +118,24 @@
|
||||||
/**
|
/**
|
||||||
* @brief Constants required to manipulate the MPU.
|
* @brief Constants required to manipulate the MPU.
|
||||||
*/
|
*/
|
||||||
#define portMPU_TYPE_REG ( * ( ( volatile uint32_t * ) 0xe000ed90 ) )
|
#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) )
|
||||||
#define portMPU_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000ed94 ) )
|
#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) )
|
||||||
#define portMPU_RNR_REG ( * ( ( volatile uint32_t * ) 0xe000ed98 ) )
|
#define portMPU_RNR_REG ( *( ( volatile uint32_t * ) 0xe000ed98 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_REG ( * ( ( volatile uint32_t * ) 0xe000ed9c ) )
|
#define portMPU_RBAR_REG ( *( ( volatile uint32_t * ) 0xe000ed9c ) )
|
||||||
#define portMPU_RLAR_REG ( * ( ( volatile uint32_t * ) 0xe000eda0 ) )
|
#define portMPU_RLAR_REG ( *( ( volatile uint32_t * ) 0xe000eda0 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A1_REG ( * ( ( volatile uint32_t * ) 0xe000eda4 ) )
|
#define portMPU_RBAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda4 ) )
|
||||||
#define portMPU_RLAR_A1_REG ( * ( ( volatile uint32_t * ) 0xe000eda8 ) )
|
#define portMPU_RLAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda8 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A2_REG ( * ( ( volatile uint32_t * ) 0xe000edac ) )
|
#define portMPU_RBAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edac ) )
|
||||||
#define portMPU_RLAR_A2_REG ( * ( ( volatile uint32_t * ) 0xe000edb0 ) )
|
#define portMPU_RLAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edb0 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_A3_REG ( * ( ( volatile uint32_t * ) 0xe000edb4 ) )
|
#define portMPU_RBAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb4 ) )
|
||||||
#define portMPU_RLAR_A3_REG ( * ( ( volatile uint32_t * ) 0xe000edb8 ) )
|
#define portMPU_RLAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb8 ) )
|
||||||
|
|
||||||
#define portMPU_MAIR0_REG ( * ( ( volatile uint32_t * ) 0xe000edc0 ) )
|
#define portMPU_MAIR0_REG ( *( ( volatile uint32_t * ) 0xe000edc0 ) )
|
||||||
#define portMPU_MAIR1_REG ( * ( ( volatile uint32_t * ) 0xe000edc4 ) )
|
#define portMPU_MAIR1_REG ( *( ( volatile uint32_t * ) 0xe000edc4 ) )
|
||||||
|
|
||||||
#define portMPU_RBAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
#define portMPU_RBAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
||||||
#define portMPU_RLAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
#define portMPU_RLAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */
|
||||||
|
@ -205,8 +205,9 @@
|
||||||
*/
|
*/
|
||||||
#define portINITIAL_XPSR ( 0x01000000 )
|
#define portINITIAL_XPSR ( 0x01000000 )
|
||||||
|
|
||||||
#if( configRUN_FREERTOS_SECURE_ONLY == 1 )
|
#if ( configRUN_FREERTOS_SECURE_ONLY == 1 )
|
||||||
/**
|
|
||||||
|
/**
|
||||||
* @brief Initial EXC_RETURN value.
|
* @brief Initial EXC_RETURN value.
|
||||||
*
|
*
|
||||||
* FF FF FF FD
|
* FF FF FF FD
|
||||||
|
@ -222,7 +223,8 @@
|
||||||
*/
|
*/
|
||||||
#define portINITIAL_EXC_RETURN ( 0xfffffffd )
|
#define portINITIAL_EXC_RETURN ( 0xfffffffd )
|
||||||
#else
|
#else
|
||||||
/**
|
|
||||||
|
/**
|
||||||
* @brief Initial EXC_RETURN value.
|
* @brief Initial EXC_RETURN value.
|
||||||
*
|
*
|
||||||
* FF FF FF BC
|
* FF FF FF BC
|
||||||
|
@ -285,15 +287,17 @@
|
||||||
*/
|
*/
|
||||||
static void prvTaskExitError( void );
|
static void prvTaskExitError( void );
|
||||||
|
|
||||||
#if( configENABLE_MPU == 1 )
|
#if ( configENABLE_MPU == 1 )
|
||||||
/**
|
|
||||||
|
/**
|
||||||
* @brief Setup the Memory Protection Unit (MPU).
|
* @brief Setup the Memory Protection Unit (MPU).
|
||||||
*/
|
*/
|
||||||
static void prvSetupMPU( void ) PRIVILEGED_FUNCTION;
|
static void prvSetupMPU( void ) PRIVILEGED_FUNCTION;
|
||||||
#endif /* configENABLE_MPU */
|
#endif /* configENABLE_MPU */
|
||||||
|
|
||||||
#if( configENABLE_FPU == 1 )
|
#if ( configENABLE_FPU == 1 )
|
||||||
/**
|
|
||||||
|
/**
|
||||||
* @brief Setup the Floating Point Unit (FPU).
|
* @brief Setup the Floating Point Unit (FPU).
|
||||||
*/
|
*/
|
||||||
static void prvSetupFPU( void ) PRIVILEGED_FUNCTION;
|
static void prvSetupFPU( void ) PRIVILEGED_FUNCTION;
|
||||||
|
@ -338,45 +342,47 @@ void SysTick_Handler( void ) PRIVILEGED_FUNCTION;
|
||||||
/**
|
/**
|
||||||
* @brief C part of SVC handler.
|
* @brief C part of SVC handler.
|
||||||
*/
|
*/
|
||||||
portDONT_DISCARD void vPortSVCHandler_C( uint32_t *pulCallerStackAddress ) PRIVILEGED_FUNCTION;
|
portDONT_DISCARD void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) PRIVILEGED_FUNCTION;
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Each task maintains its own interrupt status in the critical nesting
|
* @brief Each task maintains its own interrupt status in the critical nesting
|
||||||
* variable.
|
* variable.
|
||||||
*/
|
*/
|
||||||
static volatile uint32_t ulCriticalNesting = 0xaaaaaaaaUL;
|
PRIVILEGED_DATA static volatile uint32_t ulCriticalNesting = 0xaaaaaaaaUL;
|
||||||
|
|
||||||
#if( configENABLE_TRUSTZONE == 1 )
|
#if ( configENABLE_TRUSTZONE == 1 )
|
||||||
/**
|
|
||||||
|
/**
|
||||||
* @brief Saved as part of the task context to indicate which context the
|
* @brief Saved as part of the task context to indicate which context the
|
||||||
* task is using on the secure side.
|
* task is using on the secure side.
|
||||||
*/
|
*/
|
||||||
portDONT_DISCARD volatile SecureContextHandle_t xSecureContext = portNO_SECURE_CONTEXT;
|
PRIVILEGED_DATA portDONT_DISCARD volatile SecureContextHandle_t xSecureContext = portNO_SECURE_CONTEXT;
|
||||||
#endif /* configENABLE_TRUSTZONE */
|
#endif /* configENABLE_TRUSTZONE */
|
||||||
|
|
||||||
#if( configUSE_TICKLESS_IDLE == 1 )
|
#if ( configUSE_TICKLESS_IDLE == 1 )
|
||||||
/**
|
|
||||||
|
/**
|
||||||
* @brief The number of SysTick increments that make up one tick period.
|
* @brief The number of SysTick increments that make up one tick period.
|
||||||
*/
|
*/
|
||||||
static uint32_t ulTimerCountsForOneTick = 0;
|
PRIVILEGED_DATA static uint32_t ulTimerCountsForOneTick = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief The maximum number of tick periods that can be suppressed is
|
* @brief The maximum number of tick periods that can be suppressed is
|
||||||
* limited by the 24 bit resolution of the SysTick timer.
|
* limited by the 24 bit resolution of the SysTick timer.
|
||||||
*/
|
*/
|
||||||
static uint32_t xMaximumPossibleSuppressedTicks = 0;
|
PRIVILEGED_DATA static uint32_t xMaximumPossibleSuppressedTicks = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Compensate for the CPU cycles that pass while the SysTick is
|
* @brief Compensate for the CPU cycles that pass while the SysTick is
|
||||||
* stopped (low power functionality only).
|
* stopped (low power functionality only).
|
||||||
*/
|
*/
|
||||||
static uint32_t ulStoppedTimerCompensation = 0;
|
PRIVILEGED_DATA static uint32_t ulStoppedTimerCompensation = 0;
|
||||||
#endif /* configUSE_TICKLESS_IDLE */
|
#endif /* configUSE_TICKLESS_IDLE */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if( configUSE_TICKLESS_IDLE == 1 )
|
#if ( configUSE_TICKLESS_IDLE == 1 )
|
||||||
__attribute__(( weak )) void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime )
|
__attribute__( ( weak ) ) void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime )
|
||||||
{
|
{
|
||||||
uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements;
|
uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements;
|
||||||
TickType_t xModifiableIdleTime;
|
TickType_t xModifiableIdleTime;
|
||||||
|
@ -397,6 +403,7 @@ static volatile uint32_t ulCriticalNesting = 0xaaaaaaaaUL;
|
||||||
* tick periods. -1 is used because this code will execute part way
|
* tick periods. -1 is used because this code will execute part way
|
||||||
* through one of the tick periods. */
|
* through one of the tick periods. */
|
||||||
ulReloadValue = portNVIC_SYSTICK_CURRENT_VALUE_REG + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) );
|
ulReloadValue = portNVIC_SYSTICK_CURRENT_VALUE_REG + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) );
|
||||||
|
|
||||||
if( ulReloadValue > ulStoppedTimerCompensation )
|
if( ulReloadValue > ulStoppedTimerCompensation )
|
||||||
{
|
{
|
||||||
ulReloadValue -= ulStoppedTimerCompensation;
|
ulReloadValue -= ulStoppedTimerCompensation;
|
||||||
|
@ -404,9 +411,9 @@ static volatile uint32_t ulCriticalNesting = 0xaaaaaaaaUL;
|
||||||
|
|
||||||
/* Enter a critical section but don't use the taskENTER_CRITICAL()
|
/* Enter a critical section but don't use the taskENTER_CRITICAL()
|
||||||
* method as that will mask interrupts that should exit sleep mode. */
|
* method as that will mask interrupts that should exit sleep mode. */
|
||||||
__asm volatile( "cpsid i" ::: "memory" );
|
__asm volatile ( "cpsid i" ::: "memory" );
|
||||||
__asm volatile( "dsb" );
|
__asm volatile ( "dsb" );
|
||||||
__asm volatile( "isb" );
|
__asm volatile ( "isb" );
|
||||||
|
|
||||||
/* If a context switch is pending or a task is waiting for the scheduler
|
/* If a context switch is pending or a task is waiting for the scheduler
|
||||||
* to be un-suspended then abandon the low power entry. */
|
* to be un-suspended then abandon the low power entry. */
|
||||||
|
@ -425,7 +432,7 @@ static volatile uint32_t ulCriticalNesting = 0xaaaaaaaaUL;
|
||||||
|
|
||||||
/* Re-enable interrupts - see comments above the cpsid instruction()
|
/* Re-enable interrupts - see comments above the cpsid instruction()
|
||||||
* above. */
|
* above. */
|
||||||
__asm volatile( "cpsie i" ::: "memory" );
|
__asm volatile ( "cpsie i" ::: "memory" );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -447,28 +454,30 @@ static volatile uint32_t ulCriticalNesting = 0xaaaaaaaaUL;
|
||||||
* so a copy is taken. */
|
* so a copy is taken. */
|
||||||
xModifiableIdleTime = xExpectedIdleTime;
|
xModifiableIdleTime = xExpectedIdleTime;
|
||||||
configPRE_SLEEP_PROCESSING( xModifiableIdleTime );
|
configPRE_SLEEP_PROCESSING( xModifiableIdleTime );
|
||||||
|
|
||||||
if( xModifiableIdleTime > 0 )
|
if( xModifiableIdleTime > 0 )
|
||||||
{
|
{
|
||||||
__asm volatile( "dsb" ::: "memory" );
|
__asm volatile ( "dsb" ::: "memory" );
|
||||||
__asm volatile( "wfi" );
|
__asm volatile ( "wfi" );
|
||||||
__asm volatile( "isb" );
|
__asm volatile ( "isb" );
|
||||||
}
|
}
|
||||||
|
|
||||||
configPOST_SLEEP_PROCESSING( xExpectedIdleTime );
|
configPOST_SLEEP_PROCESSING( xExpectedIdleTime );
|
||||||
|
|
||||||
/* Re-enable interrupts to allow the interrupt that brought the MCU
|
/* Re-enable interrupts to allow the interrupt that brought the MCU
|
||||||
* out of sleep mode to execute immediately. See comments above
|
* out of sleep mode to execute immediately. See comments above
|
||||||
* the cpsid instruction above. */
|
* the cpsid instruction above. */
|
||||||
__asm volatile( "cpsie i" ::: "memory" );
|
__asm volatile ( "cpsie i" ::: "memory" );
|
||||||
__asm volatile( "dsb" );
|
__asm volatile ( "dsb" );
|
||||||
__asm volatile( "isb" );
|
__asm volatile ( "isb" );
|
||||||
|
|
||||||
/* Disable interrupts again because the clock is about to be stopped
|
/* Disable interrupts again because the clock is about to be stopped
|
||||||
* and interrupts that execute while the clock is stopped will
|
* and interrupts that execute while the clock is stopped will
|
||||||
* increase any slippage between the time maintained by the RTOS and
|
* increase any slippage between the time maintained by the RTOS and
|
||||||
* calendar time. */
|
* calendar time. */
|
||||||
__asm volatile( "cpsid i" ::: "memory" );
|
__asm volatile ( "cpsid i" ::: "memory" );
|
||||||
__asm volatile( "dsb" );
|
__asm volatile ( "dsb" );
|
||||||
__asm volatile( "isb" );
|
__asm volatile ( "isb" );
|
||||||
|
|
||||||
/* Disable the SysTick clock without reading the
|
/* Disable the SysTick clock without reading the
|
||||||
* portNVIC_SYSTICK_CTRL_REG register to ensure the
|
* portNVIC_SYSTICK_CTRL_REG register to ensure the
|
||||||
|
@ -535,16 +544,16 @@ static volatile uint32_t ulCriticalNesting = 0xaaaaaaaaUL;
|
||||||
portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL;
|
portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL;
|
||||||
|
|
||||||
/* Exit with interrupts enabled. */
|
/* Exit with interrupts enabled. */
|
||||||
__asm volatile( "cpsie i" ::: "memory" );
|
__asm volatile ( "cpsie i" ::: "memory" );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif /* configUSE_TICKLESS_IDLE */
|
#endif /* configUSE_TICKLESS_IDLE */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
__attribute__(( weak )) void vPortSetupTimerInterrupt( void ) /* PRIVILEGED_FUNCTION */
|
__attribute__( ( weak ) ) void vPortSetupTimerInterrupt( void ) /* PRIVILEGED_FUNCTION */
|
||||||
{
|
{
|
||||||
/* Calculate the constants required to configure the tick interrupt. */
|
/* Calculate the constants required to configure the tick interrupt. */
|
||||||
#if( configUSE_TICKLESS_IDLE == 1 )
|
#if ( configUSE_TICKLESS_IDLE == 1 )
|
||||||
{
|
{
|
||||||
ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ );
|
ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ );
|
||||||
xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick;
|
xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick;
|
||||||
|
@ -557,14 +566,14 @@ __attribute__(( weak )) void vPortSetupTimerInterrupt( void ) /* PRIVILEGED_FUNC
|
||||||
portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;
|
portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;
|
||||||
|
|
||||||
/* Configure SysTick to interrupt at the requested rate. */
|
/* Configure SysTick to interrupt at the requested rate. */
|
||||||
portNVIC_SYSTICK_LOAD_REG = ( configCPU_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;
|
portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;
|
||||||
portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT;
|
portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT;
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
static void prvTaskExitError( void )
|
static void prvTaskExitError( void )
|
||||||
{
|
{
|
||||||
volatile uint32_t ulDummy = 0UL;
|
volatile uint32_t ulDummy = 0UL;
|
||||||
|
|
||||||
/* A function that implements a task must not exit or attempt to return to
|
/* A function that implements a task must not exit or attempt to return to
|
||||||
* its caller as there is nothing to return to. If a task wants to exit it
|
* its caller as there is nothing to return to. If a task wants to exit it
|
||||||
|
@ -587,10 +596,11 @@ volatile uint32_t ulDummy = 0UL;
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if( configENABLE_MPU == 1 )
|
#if ( configENABLE_MPU == 1 )
|
||||||
static void prvSetupMPU( void ) /* PRIVILEGED_FUNCTION */
|
static void prvSetupMPU( void ) /* PRIVILEGED_FUNCTION */
|
||||||
{
|
{
|
||||||
#if defined( __ARMCC_VERSION )
|
#if defined( __ARMCC_VERSION )
|
||||||
|
|
||||||
/* Declaration when these variable are defined in code instead of being
|
/* Declaration when these variable are defined in code instead of being
|
||||||
* exported from linker scripts. */
|
* exported from linker scripts. */
|
||||||
extern uint32_t * __privileged_functions_start__;
|
extern uint32_t * __privileged_functions_start__;
|
||||||
|
@ -601,7 +611,7 @@ volatile uint32_t ulDummy = 0UL;
|
||||||
extern uint32_t * __unprivileged_flash_end__;
|
extern uint32_t * __unprivileged_flash_end__;
|
||||||
extern uint32_t * __privileged_sram_start__;
|
extern uint32_t * __privileged_sram_start__;
|
||||||
extern uint32_t * __privileged_sram_end__;
|
extern uint32_t * __privileged_sram_end__;
|
||||||
#else
|
#else /* if defined( __ARMCC_VERSION ) */
|
||||||
/* Declaration when these variable are exported from linker scripts. */
|
/* Declaration when these variable are exported from linker scripts. */
|
||||||
extern uint32_t __privileged_functions_start__[];
|
extern uint32_t __privileged_functions_start__[];
|
||||||
extern uint32_t __privileged_functions_end__[];
|
extern uint32_t __privileged_functions_end__[];
|
||||||
|
@ -672,10 +682,10 @@ volatile uint32_t ulDummy = 0UL;
|
||||||
#endif /* configENABLE_MPU */
|
#endif /* configENABLE_MPU */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if( configENABLE_FPU == 1 )
|
#if ( configENABLE_FPU == 1 )
|
||||||
static void prvSetupFPU( void ) /* PRIVILEGED_FUNCTION */
|
static void prvSetupFPU( void ) /* PRIVILEGED_FUNCTION */
|
||||||
{
|
{
|
||||||
#if( configENABLE_TRUSTZONE == 1 )
|
#if ( configENABLE_TRUSTZONE == 1 )
|
||||||
{
|
{
|
||||||
/* Enable non-secure access to the FPU. */
|
/* Enable non-secure access to the FPU. */
|
||||||
SecureInit_EnableNSFPUAccess();
|
SecureInit_EnableNSFPUAccess();
|
||||||
|
@ -704,8 +714,8 @@ void vPortYield( void ) /* PRIVILEGED_FUNCTION */
|
||||||
|
|
||||||
/* Barriers are normally not required but do ensure the code is
|
/* Barriers are normally not required but do ensure the code is
|
||||||
* completely within the specified behaviour for the architecture. */
|
* completely within the specified behaviour for the architecture. */
|
||||||
__asm volatile( "dsb" ::: "memory" );
|
__asm volatile ( "dsb" ::: "memory" );
|
||||||
__asm volatile( "isb" );
|
__asm volatile ( "isb" );
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
@ -716,8 +726,8 @@ void vPortEnterCritical( void ) /* PRIVILEGED_FUNCTION */
|
||||||
|
|
||||||
/* Barriers are normally not required but do ensure the code is
|
/* Barriers are normally not required but do ensure the code is
|
||||||
* completely within the specified behaviour for the architecture. */
|
* completely within the specified behaviour for the architecture. */
|
||||||
__asm volatile( "dsb" ::: "memory" );
|
__asm volatile ( "dsb" ::: "memory" );
|
||||||
__asm volatile( "isb" );
|
__asm volatile ( "isb" );
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
@ -735,7 +745,7 @@ void vPortExitCritical( void ) /* PRIVILEGED_FUNCTION */
|
||||||
|
|
||||||
void SysTick_Handler( void ) /* PRIVILEGED_FUNCTION */
|
void SysTick_Handler( void ) /* PRIVILEGED_FUNCTION */
|
||||||
{
|
{
|
||||||
uint32_t ulPreviousMask;
|
uint32_t ulPreviousMask;
|
||||||
|
|
||||||
ulPreviousMask = portSET_INTERRUPT_MASK_FROM_ISR();
|
ulPreviousMask = portSET_INTERRUPT_MASK_FROM_ISR();
|
||||||
{
|
{
|
||||||
|
@ -750,10 +760,11 @@ uint32_t ulPreviousMask;
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
void vPortSVCHandler_C( uint32_t *pulCallerStackAddress ) /* PRIVILEGED_FUNCTION portDONT_DISCARD */
|
void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTION portDONT_DISCARD */
|
||||||
{
|
{
|
||||||
#if( configENABLE_MPU == 1 )
|
#if ( configENABLE_MPU == 1 )
|
||||||
#if defined( __ARMCC_VERSION )
|
#if defined( __ARMCC_VERSION )
|
||||||
|
|
||||||
/* Declaration when these variable are defined in code instead of being
|
/* Declaration when these variable are defined in code instead of being
|
||||||
* exported from linker scripts. */
|
* exported from linker scripts. */
|
||||||
extern uint32_t * __syscalls_flash_start__;
|
extern uint32_t * __syscalls_flash_start__;
|
||||||
|
@ -763,33 +774,33 @@ void vPortSVCHandler_C( uint32_t *pulCallerStackAddress ) /* PRIVILEGED_FUNCTION
|
||||||
extern uint32_t __syscalls_flash_start__[];
|
extern uint32_t __syscalls_flash_start__[];
|
||||||
extern uint32_t __syscalls_flash_end__[];
|
extern uint32_t __syscalls_flash_end__[];
|
||||||
#endif /* defined( __ARMCC_VERSION ) */
|
#endif /* defined( __ARMCC_VERSION ) */
|
||||||
#endif /* configENABLE_MPU */
|
#endif /* configENABLE_MPU */
|
||||||
|
|
||||||
uint32_t ulPC;
|
uint32_t ulPC;
|
||||||
|
|
||||||
#if( configENABLE_TRUSTZONE == 1 )
|
#if ( configENABLE_TRUSTZONE == 1 )
|
||||||
uint32_t ulR0;
|
uint32_t ulR0;
|
||||||
#if( configENABLE_MPU == 1 )
|
#if ( configENABLE_MPU == 1 )
|
||||||
uint32_t ulControl, ulIsTaskPrivileged;
|
uint32_t ulControl, ulIsTaskPrivileged;
|
||||||
#endif /* configENABLE_MPU */
|
#endif /* configENABLE_MPU */
|
||||||
#endif /* configENABLE_TRUSTZONE */
|
#endif /* configENABLE_TRUSTZONE */
|
||||||
uint8_t ucSVCNumber;
|
uint8_t ucSVCNumber;
|
||||||
|
|
||||||
/* Register are stored on the stack in the following order - R0, R1, R2, R3,
|
/* Register are stored on the stack in the following order - R0, R1, R2, R3,
|
||||||
* R12, LR, PC, xPSR. */
|
* R12, LR, PC, xPSR. */
|
||||||
ulPC = pulCallerStackAddress[ 6 ];
|
ulPC = pulCallerStackAddress[ 6 ];
|
||||||
ucSVCNumber = ( ( uint8_t *) ulPC )[ -2 ];
|
ucSVCNumber = ( ( uint8_t * ) ulPC )[ -2 ];
|
||||||
|
|
||||||
switch( ucSVCNumber )
|
switch( ucSVCNumber )
|
||||||
{
|
{
|
||||||
#if( configENABLE_TRUSTZONE == 1 )
|
#if ( configENABLE_TRUSTZONE == 1 )
|
||||||
case portSVC_ALLOCATE_SECURE_CONTEXT:
|
case portSVC_ALLOCATE_SECURE_CONTEXT:
|
||||||
{
|
|
||||||
/* R0 contains the stack size passed as parameter to the
|
/* R0 contains the stack size passed as parameter to the
|
||||||
* vPortAllocateSecureContext function. */
|
* vPortAllocateSecureContext function. */
|
||||||
ulR0 = pulCallerStackAddress[ 0 ];
|
ulR0 = pulCallerStackAddress[ 0 ];
|
||||||
|
|
||||||
#if( configENABLE_MPU == 1 )
|
#if ( configENABLE_MPU == 1 )
|
||||||
{
|
{
|
||||||
/* Read the CONTROL register value. */
|
/* Read the CONTROL register value. */
|
||||||
__asm volatile ( "mrs %0, control" : "=r" ( ulControl ) );
|
__asm volatile ( "mrs %0, control" : "=r" ( ulControl ) );
|
||||||
|
@ -801,7 +812,7 @@ uint8_t ucSVCNumber;
|
||||||
/* Allocate and load a context for the secure task. */
|
/* Allocate and load a context for the secure task. */
|
||||||
xSecureContext = SecureContext_AllocateContext( ulR0, ulIsTaskPrivileged );
|
xSecureContext = SecureContext_AllocateContext( ulR0, ulIsTaskPrivileged );
|
||||||
}
|
}
|
||||||
#else
|
#else /* if ( configENABLE_MPU == 1 ) */
|
||||||
{
|
{
|
||||||
/* Allocate and load a context for the secure task. */
|
/* Allocate and load a context for the secure task. */
|
||||||
xSecureContext = SecureContext_AllocateContext( ulR0 );
|
xSecureContext = SecureContext_AllocateContext( ulR0 );
|
||||||
|
@ -810,23 +821,19 @@ uint8_t ucSVCNumber;
|
||||||
|
|
||||||
configASSERT( xSecureContext != NULL );
|
configASSERT( xSecureContext != NULL );
|
||||||
SecureContext_LoadContext( xSecureContext );
|
SecureContext_LoadContext( xSecureContext );
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case portSVC_FREE_SECURE_CONTEXT:
|
case portSVC_FREE_SECURE_CONTEXT:
|
||||||
{
|
|
||||||
/* R0 contains the secure context handle to be freed. */
|
/* R0 contains the secure context handle to be freed. */
|
||||||
ulR0 = pulCallerStackAddress[ 0 ];
|
ulR0 = pulCallerStackAddress[ 0 ];
|
||||||
|
|
||||||
/* Free the secure context. */
|
/* Free the secure context. */
|
||||||
SecureContext_FreeContext( ( SecureContextHandle_t ) ulR0 );
|
SecureContext_FreeContext( ( SecureContextHandle_t ) ulR0 );
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
#endif /* configENABLE_TRUSTZONE */
|
#endif /* configENABLE_TRUSTZONE */
|
||||||
|
|
||||||
case portSVC_START_SCHEDULER:
|
case portSVC_START_SCHEDULER:
|
||||||
{
|
#if ( configENABLE_TRUSTZONE == 1 )
|
||||||
#if( configENABLE_TRUSTZONE == 1 )
|
|
||||||
{
|
{
|
||||||
/* De-prioritize the non-secure exceptions so that the
|
/* De-prioritize the non-secure exceptions so that the
|
||||||
* non-secure pendSV runs at the lowest priority. */
|
* non-secure pendSV runs at the lowest priority. */
|
||||||
|
@ -837,7 +844,7 @@ uint8_t ucSVCNumber;
|
||||||
}
|
}
|
||||||
#endif /* configENABLE_TRUSTZONE */
|
#endif /* configENABLE_TRUSTZONE */
|
||||||
|
|
||||||
#if( configENABLE_FPU == 1 )
|
#if ( configENABLE_FPU == 1 )
|
||||||
{
|
{
|
||||||
/* Setup the Floating Point Unit (FPU). */
|
/* Setup the Floating Point Unit (FPU). */
|
||||||
prvSetupFPU();
|
prvSetupFPU();
|
||||||
|
@ -847,41 +854,44 @@ uint8_t ucSVCNumber;
|
||||||
/* Setup the context of the first task so that the first task starts
|
/* Setup the context of the first task so that the first task starts
|
||||||
* executing. */
|
* executing. */
|
||||||
vRestoreContextOfFirstTask();
|
vRestoreContextOfFirstTask();
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
#if( configENABLE_MPU == 1 )
|
#if ( configENABLE_MPU == 1 )
|
||||||
case portSVC_RAISE_PRIVILEGE:
|
case portSVC_RAISE_PRIVILEGE:
|
||||||
{
|
|
||||||
/* Only raise the privilege, if the svc was raised from any of
|
/* Only raise the privilege, if the svc was raised from any of
|
||||||
* the system calls. */
|
* the system calls. */
|
||||||
if( ulPC >= ( uint32_t ) __syscalls_flash_start__ &&
|
if( ( ulPC >= ( uint32_t ) __syscalls_flash_start__ ) &&
|
||||||
ulPC <= ( uint32_t ) __syscalls_flash_end__ )
|
( ulPC <= ( uint32_t ) __syscalls_flash_end__ ) )
|
||||||
{
|
{
|
||||||
vRaisePrivilege();
|
vRaisePrivilege();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
#endif /* configENABLE_MPU */
|
#endif /* configENABLE_MPU */
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
|
||||||
/* Incorrect SVC call. */
|
/* Incorrect SVC call. */
|
||||||
configASSERT( pdFALSE );
|
configASSERT( pdFALSE );
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if( configENABLE_MPU == 1 )
|
#if ( configENABLE_MPU == 1 )
|
||||||
StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, StackType_t *pxEndOfStack, TaskFunction_t pxCode, void *pvParameters, BaseType_t xRunPrivileged ) /* PRIVILEGED_FUNCTION */
|
StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack,
|
||||||
|
StackType_t * pxEndOfStack,
|
||||||
|
TaskFunction_t pxCode,
|
||||||
|
void * pvParameters,
|
||||||
|
BaseType_t xRunPrivileged ) /* PRIVILEGED_FUNCTION */
|
||||||
#else
|
#else
|
||||||
StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, StackType_t *pxEndOfStack, TaskFunction_t pxCode, void *pvParameters ) /* PRIVILEGED_FUNCTION */
|
StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack,
|
||||||
|
StackType_t * pxEndOfStack,
|
||||||
|
TaskFunction_t pxCode,
|
||||||
|
void * pvParameters ) /* PRIVILEGED_FUNCTION */
|
||||||
#endif /* configENABLE_MPU */
|
#endif /* configENABLE_MPU */
|
||||||
{
|
{
|
||||||
/* Simulate the stack frame as it would be created by a context switch
|
/* Simulate the stack frame as it would be created by a context switch
|
||||||
* interrupt. */
|
* interrupt. */
|
||||||
#if( portPRELOAD_REGISTERS == 0 )
|
#if ( portPRELOAD_REGISTERS == 0 )
|
||||||
{
|
{
|
||||||
pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */
|
pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */
|
||||||
*pxTopOfStack = portINITIAL_XPSR; /* xPSR */
|
*pxTopOfStack = portINITIAL_XPSR; /* xPSR */
|
||||||
|
@ -894,9 +904,10 @@ uint8_t ucSVCNumber;
|
||||||
pxTopOfStack -= 9; /* R11..R4, EXC_RETURN. */
|
pxTopOfStack -= 9; /* R11..R4, EXC_RETURN. */
|
||||||
*pxTopOfStack = portINITIAL_EXC_RETURN;
|
*pxTopOfStack = portINITIAL_EXC_RETURN;
|
||||||
|
|
||||||
#if( configENABLE_MPU == 1 )
|
#if ( configENABLE_MPU == 1 )
|
||||||
{
|
{
|
||||||
pxTopOfStack--;
|
pxTopOfStack--;
|
||||||
|
|
||||||
if( xRunPrivileged == pdTRUE )
|
if( xRunPrivileged == pdTRUE )
|
||||||
{
|
{
|
||||||
*pxTopOfStack = portINITIAL_CONTROL_PRIVILEGED; /* Slot used to hold this task's CONTROL value. */
|
*pxTopOfStack = portINITIAL_CONTROL_PRIVILEGED; /* Slot used to hold this task's CONTROL value. */
|
||||||
|
@ -911,7 +922,7 @@ uint8_t ucSVCNumber;
|
||||||
pxTopOfStack--;
|
pxTopOfStack--;
|
||||||
*pxTopOfStack = ( StackType_t ) pxEndOfStack; /* Slot used to hold this task's PSPLIM value. */
|
*pxTopOfStack = ( StackType_t ) pxEndOfStack; /* Slot used to hold this task's PSPLIM value. */
|
||||||
|
|
||||||
#if( configENABLE_TRUSTZONE == 1 )
|
#if ( configENABLE_TRUSTZONE == 1 )
|
||||||
{
|
{
|
||||||
pxTopOfStack--;
|
pxTopOfStack--;
|
||||||
*pxTopOfStack = portNO_SECURE_CONTEXT; /* Slot used to hold this task's xSecureContext value. */
|
*pxTopOfStack = portNO_SECURE_CONTEXT; /* Slot used to hold this task's xSecureContext value. */
|
||||||
|
@ -955,9 +966,10 @@ uint8_t ucSVCNumber;
|
||||||
pxTopOfStack--;
|
pxTopOfStack--;
|
||||||
*pxTopOfStack = portINITIAL_EXC_RETURN; /* EXC_RETURN */
|
*pxTopOfStack = portINITIAL_EXC_RETURN; /* EXC_RETURN */
|
||||||
|
|
||||||
#if( configENABLE_MPU == 1 )
|
#if ( configENABLE_MPU == 1 )
|
||||||
{
|
{
|
||||||
pxTopOfStack--;
|
pxTopOfStack--;
|
||||||
|
|
||||||
if( xRunPrivileged == pdTRUE )
|
if( xRunPrivileged == pdTRUE )
|
||||||
{
|
{
|
||||||
*pxTopOfStack = portINITIAL_CONTROL_PRIVILEGED; /* Slot used to hold this task's CONTROL value. */
|
*pxTopOfStack = portINITIAL_CONTROL_PRIVILEGED; /* Slot used to hold this task's CONTROL value. */
|
||||||
|
@ -972,7 +984,7 @@ uint8_t ucSVCNumber;
|
||||||
pxTopOfStack--;
|
pxTopOfStack--;
|
||||||
*pxTopOfStack = ( StackType_t ) pxEndOfStack; /* Slot used to hold this task's PSPLIM value. */
|
*pxTopOfStack = ( StackType_t ) pxEndOfStack; /* Slot used to hold this task's PSPLIM value. */
|
||||||
|
|
||||||
#if( configENABLE_TRUSTZONE == 1 )
|
#if ( configENABLE_TRUSTZONE == 1 )
|
||||||
{
|
{
|
||||||
pxTopOfStack--;
|
pxTopOfStack--;
|
||||||
*pxTopOfStack = portNO_SECURE_CONTEXT; /* Slot used to hold this task's xSecureContext value. */
|
*pxTopOfStack = portNO_SECURE_CONTEXT; /* Slot used to hold this task's xSecureContext value. */
|
||||||
|
@ -988,10 +1000,10 @@ uint8_t ucSVCNumber;
|
||||||
BaseType_t xPortStartScheduler( void ) /* PRIVILEGED_FUNCTION */
|
BaseType_t xPortStartScheduler( void ) /* PRIVILEGED_FUNCTION */
|
||||||
{
|
{
|
||||||
/* Make PendSV, CallSV and SysTick the same priority as the kernel. */
|
/* Make PendSV, CallSV and SysTick the same priority as the kernel. */
|
||||||
portNVIC_SYSPRI2_REG |= portNVIC_PENDSV_PRI;
|
portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI;
|
||||||
portNVIC_SYSPRI2_REG |= portNVIC_SYSTICK_PRI;
|
portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI;
|
||||||
|
|
||||||
#if( configENABLE_MPU == 1 )
|
#if ( configENABLE_MPU == 1 )
|
||||||
{
|
{
|
||||||
/* Setup the Memory Protection Unit (MPU). */
|
/* Setup the Memory Protection Unit (MPU). */
|
||||||
prvSetupMPU();
|
prvSetupMPU();
|
||||||
|
@ -1030,11 +1042,24 @@ void vPortEndScheduler( void ) /* PRIVILEGED_FUNCTION */
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if( configENABLE_MPU == 1 )
|
#if ( configENABLE_MPU == 1 )
|
||||||
void vPortStoreTaskMPUSettings( xMPU_SETTINGS *xMPUSettings, const struct xMEMORY_REGION * const xRegions, StackType_t *pxBottomOfStack, uint32_t ulStackDepth )
|
void vPortStoreTaskMPUSettings( xMPU_SETTINGS * xMPUSettings,
|
||||||
|
const struct xMEMORY_REGION * const xRegions,
|
||||||
|
StackType_t * pxBottomOfStack,
|
||||||
|
uint32_t ulStackDepth )
|
||||||
{
|
{
|
||||||
uint32_t ulRegionStartAddress, ulRegionEndAddress, ulRegionNumber;
|
uint32_t ulRegionStartAddress, ulRegionEndAddress, ulRegionNumber;
|
||||||
int32_t lIndex = 0;
|
int32_t lIndex = 0;
|
||||||
|
#if defined( __ARMCC_VERSION )
|
||||||
|
/* Declaration when these variable are defined in code instead of being
|
||||||
|
* exported from linker scripts. */
|
||||||
|
extern uint32_t * __privileged_sram_start__;
|
||||||
|
extern uint32_t * __privileged_sram_end__;
|
||||||
|
#else
|
||||||
|
/* Declaration when these variable are exported from linker scripts. */
|
||||||
|
extern uint32_t __privileged_sram_start__[];
|
||||||
|
extern uint32_t __privileged_sram_end__[];
|
||||||
|
#endif /* defined( __ARMCC_VERSION ) */
|
||||||
|
|
||||||
/* Setup MAIR0. */
|
/* Setup MAIR0. */
|
||||||
xMPUSettings->ulMAIR0 = ( ( portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE << portMPU_MAIR_ATTR0_POS ) & portMPU_MAIR_ATTR0_MASK );
|
xMPUSettings->ulMAIR0 = ( ( portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE << portMPU_MAIR_ATTR0_POS ) & portMPU_MAIR_ATTR0_MASK );
|
||||||
|
@ -1046,9 +1071,23 @@ void vPortEndScheduler( void ) /* PRIVILEGED_FUNCTION */
|
||||||
* the stack region has already been configured. */
|
* the stack region has already been configured. */
|
||||||
if( ulStackDepth > 0 )
|
if( ulStackDepth > 0 )
|
||||||
{
|
{
|
||||||
/* Define the region that allows access to the stack. */
|
ulRegionStartAddress = ( uint32_t ) pxBottomOfStack;
|
||||||
ulRegionStartAddress = ( ( uint32_t ) pxBottomOfStack ) & portMPU_RBAR_ADDRESS_MASK;
|
|
||||||
ulRegionEndAddress = ( uint32_t ) pxBottomOfStack + ( ulStackDepth * ( uint32_t ) sizeof( StackType_t ) ) - 1;
|
ulRegionEndAddress = ( uint32_t ) pxBottomOfStack + ( ulStackDepth * ( uint32_t ) sizeof( StackType_t ) ) - 1;
|
||||||
|
|
||||||
|
/* If the stack is within the privileged SRAM, do not protect it
|
||||||
|
* using a separate MPU region. This is needed because privileged
|
||||||
|
* SRAM is already protected using an MPU region and ARMv8-M does
|
||||||
|
* not allow overlapping MPU regions. */
|
||||||
|
if( ulRegionStartAddress >= ( uint32_t ) __privileged_sram_start__ &&
|
||||||
|
ulRegionEndAddress <= ( uint32_t ) __privileged_sram_end__ )
|
||||||
|
{
|
||||||
|
xMPUSettings->xRegionsSettings[ 0 ].ulRBAR = 0;
|
||||||
|
xMPUSettings->xRegionsSettings[ 0 ].ulRLAR = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Define the region that allows access to the stack. */
|
||||||
|
ulRegionStartAddress &= portMPU_RBAR_ADDRESS_MASK;
|
||||||
ulRegionEndAddress &= portMPU_RLAR_ADDRESS_MASK;
|
ulRegionEndAddress &= portMPU_RLAR_ADDRESS_MASK;
|
||||||
|
|
||||||
xMPUSettings->xRegionsSettings[ 0 ].ulRBAR = ( ulRegionStartAddress ) |
|
xMPUSettings->xRegionsSettings[ 0 ].ulRBAR = ( ulRegionStartAddress ) |
|
||||||
|
@ -1060,6 +1099,7 @@ void vPortEndScheduler( void ) /* PRIVILEGED_FUNCTION */
|
||||||
( portMPU_RLAR_ATTR_INDEX0 ) |
|
( portMPU_RLAR_ATTR_INDEX0 ) |
|
||||||
( portMPU_RLAR_REGION_ENABLE );
|
( portMPU_RLAR_REGION_ENABLE );
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* User supplied configurable regions. */
|
/* User supplied configurable regions. */
|
||||||
for( ulRegionNumber = 1; ulRegionNumber <= portNUM_CONFIGURABLE_REGIONS; ulRegionNumber++ )
|
for( ulRegionNumber = 1; ulRegionNumber <= portNUM_CONFIGURABLE_REGIONS; ulRegionNumber++ )
|
||||||
|
@ -1127,13 +1167,13 @@ void vPortEndScheduler( void ) /* PRIVILEGED_FUNCTION */
|
||||||
|
|
||||||
BaseType_t xPortIsInsideInterrupt( void )
|
BaseType_t xPortIsInsideInterrupt( void )
|
||||||
{
|
{
|
||||||
uint32_t ulCurrentInterrupt;
|
uint32_t ulCurrentInterrupt;
|
||||||
BaseType_t xReturn;
|
BaseType_t xReturn;
|
||||||
|
|
||||||
/* Obtain the number of the currently executing interrupt. Interrupt Program
|
/* Obtain the number of the currently executing interrupt. Interrupt Program
|
||||||
* Status Register (IPSR) holds the exception number of the currently-executing
|
* Status Register (IPSR) holds the exception number of the currently-executing
|
||||||
* exception or zero for Thread mode.*/
|
* exception or zero for Thread mode.*/
|
||||||
__asm volatile( "mrs %0, ipsr" : "=r"( ulCurrentInterrupt ) :: "memory" );
|
__asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" );
|
||||||
|
|
||||||
if( ulCurrentInterrupt == 0 )
|
if( ulCurrentInterrupt == 0 )
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue