Update FreeRTOS port-specific files to V10.3.1
This updates Cortex-M3 port files to version found in
V10.3.1-kernel-only tag of FreeRTOS-Kernel.
The new upstream release includes memory barriers which are essential
for use with modern optimising compilers. Without those firmware
certainly breaks with -O3 -flto and might be also broken with other
optimisation configurations.
Fixes: d59ec10c4e ("Update FreeRTOS to v10.3.1")
This commit is contained in:
@@ -1,71 +1,29 @@
|
|||||||
/*
|
/*
|
||||||
FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd.
|
* FreeRTOS Kernel V10.3.1
|
||||||
All rights reserved
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
|
*
|
||||||
VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
|
* 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
|
||||||
This file is part of the FreeRTOS distribution.
|
* the Software without restriction, including without limitation the rights to
|
||||||
|
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||||
FreeRTOS is free software; you can redistribute it and/or modify it under
|
* the Software, and to permit persons to whom the Software is furnished to do so,
|
||||||
the terms of the GNU General Public License (version 2) as published by the
|
* subject to the following conditions:
|
||||||
Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception.
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in all
|
||||||
***************************************************************************
|
* copies or substantial portions of the Software.
|
||||||
>>! NOTE: The modification to the GPL is included to allow you to !<<
|
*
|
||||||
>>! distribute a combined work that includes FreeRTOS without being !<<
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
>>! obliged to provide the source code for proprietary components !<<
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||||
>>! outside of the FreeRTOS kernel. !<<
|
* 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
|
||||||
FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
*
|
||||||
FOR A PARTICULAR PURPOSE. Full license text is available on the following
|
* http://www.FreeRTOS.org
|
||||||
link: http://www.freertos.org/a00114.html
|
* http://aws.amazon.com/freertos
|
||||||
|
*
|
||||||
***************************************************************************
|
* 1 tab == 4 spaces!
|
||||||
* *
|
*/
|
||||||
* 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!
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------
|
/*-----------------------------------------------------------
|
||||||
* Implementation of functions defined in portable.h for the ARM CM3 port.
|
* Implementation of functions defined in portable.h for the ARM CM3 port.
|
||||||
@@ -144,10 +102,6 @@ debugger. */
|
|||||||
#define portTASK_RETURN_ADDRESS prvTaskExitError
|
#define portTASK_RETURN_ADDRESS prvTaskExitError
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Each task maintains its own interrupt status in the critical nesting
|
|
||||||
variable. */
|
|
||||||
static UBaseType_t uxCriticalNesting = 0xaaaaaaaa;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Setup the timer to generate the tick interrupts. The implementation in this
|
* Setup the timer to generate the tick interrupts. The implementation in this
|
||||||
* file is weak to allow application writers to change the timer used to
|
* file is weak to allow application writers to change the timer used to
|
||||||
@@ -174,10 +128,14 @@ static void prvTaskExitError( void );
|
|||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* Each task maintains its own interrupt status in the critical nesting
|
||||||
|
variable. */
|
||||||
|
static UBaseType_t uxCriticalNesting = 0xaaaaaaaa;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The number of SysTick increments that make up one tick period.
|
* The number of SysTick increments that make up one tick period.
|
||||||
*/
|
*/
|
||||||
#if configUSE_TICKLESS_IDLE == 1
|
#if( configUSE_TICKLESS_IDLE == 1 )
|
||||||
static uint32_t ulTimerCountsForOneTick = 0;
|
static uint32_t ulTimerCountsForOneTick = 0;
|
||||||
#endif /* configUSE_TICKLESS_IDLE */
|
#endif /* configUSE_TICKLESS_IDLE */
|
||||||
|
|
||||||
@@ -185,7 +143,7 @@ static void prvTaskExitError( void );
|
|||||||
* The maximum number of tick periods that can be suppressed is limited by the
|
* The maximum number of tick periods that can be suppressed is limited by the
|
||||||
* 24 bit resolution of the SysTick timer.
|
* 24 bit resolution of the SysTick timer.
|
||||||
*/
|
*/
|
||||||
#if configUSE_TICKLESS_IDLE == 1
|
#if( configUSE_TICKLESS_IDLE == 1 )
|
||||||
static uint32_t xMaximumPossibleSuppressedTicks = 0;
|
static uint32_t xMaximumPossibleSuppressedTicks = 0;
|
||||||
#endif /* configUSE_TICKLESS_IDLE */
|
#endif /* configUSE_TICKLESS_IDLE */
|
||||||
|
|
||||||
@@ -193,7 +151,7 @@ static void prvTaskExitError( void );
|
|||||||
* Compensate for the CPU cycles that pass while the SysTick is stopped (low
|
* Compensate for the CPU cycles that pass while the SysTick is stopped (low
|
||||||
* power functionality only.
|
* power functionality only.
|
||||||
*/
|
*/
|
||||||
#if configUSE_TICKLESS_IDLE == 1
|
#if( configUSE_TICKLESS_IDLE == 1 )
|
||||||
static uint32_t ulStoppedTimerCompensation = 0;
|
static uint32_t ulStoppedTimerCompensation = 0;
|
||||||
#endif /* configUSE_TICKLESS_IDLE */
|
#endif /* configUSE_TICKLESS_IDLE */
|
||||||
|
|
||||||
@@ -202,7 +160,7 @@ static void prvTaskExitError( void );
|
|||||||
* FreeRTOS API functions are not called from interrupts that have been assigned
|
* FreeRTOS API functions are not called from interrupts that have been assigned
|
||||||
* a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY.
|
* a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY.
|
||||||
*/
|
*/
|
||||||
#if ( configASSERT_DEFINED == 1 )
|
#if( configASSERT_DEFINED == 1 )
|
||||||
static uint8_t ucMaxSysCallPriority = 0;
|
static uint8_t ucMaxSysCallPriority = 0;
|
||||||
static uint32_t ulMaxPRIGROUPValue = 0;
|
static uint32_t ulMaxPRIGROUPValue = 0;
|
||||||
static const volatile uint8_t * const pcInterruptPriorityRegisters = ( const volatile uint8_t * const ) portNVIC_IP_REGISTERS_OFFSET_16;
|
static const volatile uint8_t * const pcInterruptPriorityRegisters = ( const volatile uint8_t * const ) portNVIC_IP_REGISTERS_OFFSET_16;
|
||||||
@@ -233,6 +191,8 @@ StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t px
|
|||||||
|
|
||||||
static void prvTaskExitError( void )
|
static void prvTaskExitError( void )
|
||||||
{
|
{
|
||||||
|
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
|
||||||
should instead call vTaskDelete( NULL ).
|
should instead call vTaskDelete( NULL ).
|
||||||
@@ -241,7 +201,16 @@ static void prvTaskExitError( void )
|
|||||||
defined, then stop here so application writers can catch the error. */
|
defined, then stop here so application writers can catch the error. */
|
||||||
configASSERT( uxCriticalNesting == ~0UL );
|
configASSERT( uxCriticalNesting == ~0UL );
|
||||||
portDISABLE_INTERRUPTS();
|
portDISABLE_INTERRUPTS();
|
||||||
for( ;; );
|
while( ulDummy == 0 )
|
||||||
|
{
|
||||||
|
/* This file calls prvTaskExitError() after the scheduler has been
|
||||||
|
started to remove a compiler warning about the function being defined
|
||||||
|
but never called. ulDummy is used purely to quieten other warnings
|
||||||
|
about code appearing after this function is called - making ulDummy
|
||||||
|
volatile makes the compiler think the function could return and
|
||||||
|
therefore not output an 'unreachable code' warning for code that appears
|
||||||
|
after it. */
|
||||||
|
}
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
@@ -324,6 +293,24 @@ BaseType_t xPortStartScheduler( void )
|
|||||||
ucMaxPriorityValue <<= ( uint8_t ) 0x01;
|
ucMaxPriorityValue <<= ( uint8_t ) 0x01;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef __NVIC_PRIO_BITS
|
||||||
|
{
|
||||||
|
/* Check the CMSIS configuration that defines the number of
|
||||||
|
priority bits matches the number of priority bits actually queried
|
||||||
|
from the hardware. */
|
||||||
|
configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == __NVIC_PRIO_BITS );
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef configPRIO_BITS
|
||||||
|
{
|
||||||
|
/* Check the FreeRTOS configuration that defines the number of
|
||||||
|
priority bits matches the number of priority bits actually queried
|
||||||
|
from the hardware. */
|
||||||
|
configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == configPRIO_BITS );
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Shift the priority group value back to its position within the AIRCR
|
/* Shift the priority group value back to its position within the AIRCR
|
||||||
register. */
|
register. */
|
||||||
ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT;
|
ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT;
|
||||||
@@ -352,7 +339,10 @@ BaseType_t xPortStartScheduler( void )
|
|||||||
/* Should never get here as the tasks will now be executing! Call the task
|
/* Should never get here as the tasks will now be executing! Call the task
|
||||||
exit error function to prevent compiler warnings about a static function
|
exit error function to prevent compiler warnings about a static function
|
||||||
not being called in the case that the application writer overrides this
|
not being called in the case that the application writer overrides this
|
||||||
functionality by defining configTASK_RETURN_ADDRESS. */
|
functionality by defining configTASK_RETURN_ADDRESS. Call
|
||||||
|
vTaskSwitchContext() so link time optimisation does not remove the
|
||||||
|
symbol. */
|
||||||
|
vTaskSwitchContext();
|
||||||
prvTaskExitError();
|
prvTaskExitError();
|
||||||
|
|
||||||
/* Should not get here! */
|
/* Should not get here! */
|
||||||
@@ -418,7 +408,7 @@ void xPortPendSVHandler( void )
|
|||||||
" mov r0, #0 \n"
|
" mov r0, #0 \n"
|
||||||
" msr basepri, r0 \n"
|
" msr basepri, r0 \n"
|
||||||
" ldmia sp!, {r3, r14} \n"
|
" ldmia sp!, {r3, r14} \n"
|
||||||
" \n" /* Restore the context, including the critical nesting count. */
|
" \n" /* Restore the context, including the critical nesting count. */
|
||||||
" ldr r1, [r3] \n"
|
" ldr r1, [r3] \n"
|
||||||
" ldr r0, [r1] \n" /* The first item in pxCurrentTCB is the task top of stack. */
|
" ldr r0, [r1] \n" /* The first item in pxCurrentTCB is the task top of stack. */
|
||||||
" ldmia r0!, {r4-r11} \n" /* Pop the registers. */
|
" ldmia r0!, {r4-r11} \n" /* Pop the registers. */
|
||||||
@@ -453,11 +443,11 @@ void xPortSysTickHandler( void )
|
|||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#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, ulSysTickCTRL;
|
uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements;
|
||||||
TickType_t xModifiableIdleTime;
|
TickType_t xModifiableIdleTime;
|
||||||
|
|
||||||
/* Make sure the SysTick reload value does not overflow the counter. */
|
/* Make sure the SysTick reload value does not overflow the counter. */
|
||||||
@@ -483,7 +473,7 @@ void xPortSysTickHandler( void )
|
|||||||
|
|
||||||
/* 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" );
|
__asm volatile( "cpsid i" ::: "memory" );
|
||||||
__asm volatile( "dsb" );
|
__asm volatile( "dsb" );
|
||||||
__asm volatile( "isb" );
|
__asm volatile( "isb" );
|
||||||
|
|
||||||
@@ -504,7 +494,7 @@ void xPortSysTickHandler( void )
|
|||||||
|
|
||||||
/* Re-enable interrupts - see comments above the cpsid instruction()
|
/* Re-enable interrupts - see comments above the cpsid instruction()
|
||||||
above. */
|
above. */
|
||||||
__asm volatile( "cpsie i" );
|
__asm volatile( "cpsie i" ::: "memory" );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -524,32 +514,50 @@ void xPortSysTickHandler( void )
|
|||||||
should not be executed again. However, the original expected idle
|
should not be executed again. However, the original expected idle
|
||||||
time variable must remain unmodified, so a copy is taken. */
|
time variable must remain unmodified, 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" );
|
__asm volatile( "dsb" ::: "memory" );
|
||||||
__asm volatile( "wfi" );
|
__asm volatile( "wfi" );
|
||||||
__asm volatile( "isb" );
|
__asm volatile( "isb" );
|
||||||
}
|
}
|
||||||
configPOST_SLEEP_PROCESSING( &xExpectedIdleTime );
|
configPOST_SLEEP_PROCESSING( xExpectedIdleTime );
|
||||||
|
|
||||||
/* Stop SysTick. Again, the time the SysTick is stopped for is
|
/* Re-enable interrupts to allow the interrupt that brought the MCU
|
||||||
accounted for as best it can be, but using the tickless mode will
|
out of sleep mode to execute immediately. see comments above
|
||||||
inevitably result in some tiny drift of the time maintained by the
|
__disable_interrupt() call above. */
|
||||||
kernel with respect to calendar time. */
|
__asm volatile( "cpsie i" ::: "memory" );
|
||||||
ulSysTickCTRL = portNVIC_SYSTICK_CTRL_REG;
|
__asm volatile( "dsb" );
|
||||||
portNVIC_SYSTICK_CTRL_REG = ( ulSysTickCTRL & ~portNVIC_SYSTICK_ENABLE_BIT );
|
__asm volatile( "isb" );
|
||||||
|
|
||||||
/* Re-enable interrupts - see comments above the cpsid instruction()
|
/* Disable interrupts again because the clock is about to be stopped
|
||||||
above. */
|
and interrupts that execute while the clock is stopped will increase
|
||||||
__asm volatile( "cpsie i" );
|
any slippage between the time maintained by the RTOS and calendar
|
||||||
|
time. */
|
||||||
|
__asm volatile( "cpsid i" ::: "memory" );
|
||||||
|
__asm volatile( "dsb" );
|
||||||
|
__asm volatile( "isb" );
|
||||||
|
|
||||||
if( ( ulSysTickCTRL & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 )
|
/* Disable the SysTick clock without reading the
|
||||||
|
portNVIC_SYSTICK_CTRL_REG register to ensure the
|
||||||
|
portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set. Again,
|
||||||
|
the time the SysTick is stopped for is accounted for as best it can
|
||||||
|
be, but using the tickless mode will inevitably result in some tiny
|
||||||
|
drift of the time maintained by the kernel with respect to calendar
|
||||||
|
time*/
|
||||||
|
portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT );
|
||||||
|
|
||||||
|
/* Determine if the SysTick clock has already counted to zero and
|
||||||
|
been set back to the current reload value (the reload back being
|
||||||
|
correct for the entire expected idle time) or if the SysTick is yet
|
||||||
|
to count to zero (in which case an interrupt other than the SysTick
|
||||||
|
must have brought the system out of sleep mode). */
|
||||||
|
if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 )
|
||||||
{
|
{
|
||||||
uint32_t ulCalculatedLoadValue;
|
uint32_t ulCalculatedLoadValue;
|
||||||
|
|
||||||
/* The tick interrupt has already executed, and the SysTick
|
/* The tick interrupt is already pending, and the SysTick count
|
||||||
count reloaded with ulReloadValue. Reset the
|
reloaded with ulReloadValue. Reset the
|
||||||
portNVIC_SYSTICK_LOAD_REG with whatever remains of this tick
|
portNVIC_SYSTICK_LOAD_REG with whatever remains of this tick
|
||||||
period. */
|
period. */
|
||||||
ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG );
|
ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG );
|
||||||
@@ -564,11 +572,9 @@ void xPortSysTickHandler( void )
|
|||||||
|
|
||||||
portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue;
|
portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue;
|
||||||
|
|
||||||
/* The tick interrupt handler will already have pended the tick
|
/* As the pending tick will be processed as soon as this
|
||||||
processing in the kernel. As the pending tick will be
|
function exits, the tick value maintained by the tick is stepped
|
||||||
processed as soon as this function exits, the tick value
|
forward by one less than the time spent waiting. */
|
||||||
maintained by the tick is stepped forward by one less than the
|
|
||||||
time spent waiting. */
|
|
||||||
ulCompleteTickPeriods = xExpectedIdleTime - 1UL;
|
ulCompleteTickPeriods = xExpectedIdleTime - 1UL;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -590,21 +596,18 @@ void xPortSysTickHandler( void )
|
|||||||
|
|
||||||
/* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG
|
/* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG
|
||||||
again, then set portNVIC_SYSTICK_LOAD_REG back to its standard
|
again, then set portNVIC_SYSTICK_LOAD_REG back to its standard
|
||||||
value. The critical section is used to ensure the tick interrupt
|
value. */
|
||||||
can only execute once in the case that the reload register is near
|
|
||||||
zero. */
|
|
||||||
portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;
|
portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;
|
||||||
portENTER_CRITICAL();
|
portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT;
|
||||||
{
|
vTaskStepTick( ulCompleteTickPeriods );
|
||||||
portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT;
|
portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL;
|
||||||
vTaskStepTick( ulCompleteTickPeriods );
|
|
||||||
portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL;
|
/* Exit with interrupts enabled. */
|
||||||
}
|
__asm volatile( "cpsie i" ::: "memory" );
|
||||||
portEXIT_CRITICAL();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* #if configUSE_TICKLESS_IDLE */
|
#endif /* configUSE_TICKLESS_IDLE */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -614,7 +617,7 @@ void xPortSysTickHandler( void )
|
|||||||
__attribute__(( weak )) void vPortSetupTimerInterrupt( void )
|
__attribute__(( weak )) void vPortSetupTimerInterrupt( void )
|
||||||
{
|
{
|
||||||
/* 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;
|
||||||
@@ -622,6 +625,10 @@ __attribute__(( weak )) void vPortSetupTimerInterrupt( void )
|
|||||||
}
|
}
|
||||||
#endif /* configUSE_TICKLESS_IDLE */
|
#endif /* configUSE_TICKLESS_IDLE */
|
||||||
|
|
||||||
|
/* Stop and clear the SysTick. */
|
||||||
|
portNVIC_SYSTICK_CTRL_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 = ( configSYSTICK_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 );
|
||||||
@@ -636,7 +643,7 @@ __attribute__(( weak )) void vPortSetupTimerInterrupt( void )
|
|||||||
uint8_t ucCurrentPriority;
|
uint8_t ucCurrentPriority;
|
||||||
|
|
||||||
/* Obtain the number of the currently executing interrupt. */
|
/* Obtain the number of the currently executing interrupt. */
|
||||||
__asm volatile( "mrs %0, ipsr" : "=r"( ulCurrentInterrupt ) );
|
__asm volatile( "mrs %0, ipsr" : "=r"( ulCurrentInterrupt ) :: "memory" );
|
||||||
|
|
||||||
/* Is the interrupt number a user defined interrupt? */
|
/* Is the interrupt number a user defined interrupt? */
|
||||||
if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER )
|
if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER )
|
||||||
@@ -682,7 +689,7 @@ __attribute__(( weak )) void vPortSetupTimerInterrupt( void )
|
|||||||
devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the
|
devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the
|
||||||
scheduler. Note however that some vendor specific peripheral libraries
|
scheduler. Note however that some vendor specific peripheral libraries
|
||||||
assume a non-zero priority group setting, in which cases using a value
|
assume a non-zero priority group setting, in which cases using a value
|
||||||
of zero will result in unpredicable behaviour. */
|
of zero will result in unpredictable behaviour. */
|
||||||
configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue );
|
configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,71 +1,29 @@
|
|||||||
/*
|
/*
|
||||||
FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd.
|
* FreeRTOS Kernel V10.3.1
|
||||||
All rights reserved
|
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
|
*
|
||||||
VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
|
* 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
|
||||||
This file is part of the FreeRTOS distribution.
|
* the Software without restriction, including without limitation the rights to
|
||||||
|
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||||
FreeRTOS is free software; you can redistribute it and/or modify it under
|
* the Software, and to permit persons to whom the Software is furnished to do so,
|
||||||
the terms of the GNU General Public License (version 2) as published by the
|
* subject to the following conditions:
|
||||||
Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception.
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in all
|
||||||
***************************************************************************
|
* copies or substantial portions of the Software.
|
||||||
>>! NOTE: The modification to the GPL is included to allow you to !<<
|
*
|
||||||
>>! distribute a combined work that includes FreeRTOS without being !<<
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
>>! obliged to provide the source code for proprietary components !<<
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||||
>>! outside of the FreeRTOS kernel. !<<
|
* 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
|
||||||
FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
*
|
||||||
FOR A PARTICULAR PURPOSE. Full license text is available on the following
|
* http://www.FreeRTOS.org
|
||||||
link: http://www.freertos.org/a00114.html
|
* http://aws.amazon.com/freertos
|
||||||
|
*
|
||||||
***************************************************************************
|
* 1 tab == 4 spaces!
|
||||||
* *
|
*/
|
||||||
* 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!
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef PORTMACRO_H
|
#ifndef PORTMACRO_H
|
||||||
@@ -125,7 +83,7 @@ typedef unsigned long UBaseType_t;
|
|||||||
\
|
\
|
||||||
/* Barriers are normally not required but do ensure the code is completely \
|
/* Barriers are normally not required but do ensure the code is completely \
|
||||||
within the specified behaviour for the architecture. */ \
|
within the specified behaviour for the architecture. */ \
|
||||||
__asm volatile( "dsb" ); \
|
__asm volatile( "dsb" ::: "memory" ); \
|
||||||
__asm volatile( "isb" ); \
|
__asm volatile( "isb" ); \
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -173,7 +131,7 @@ not necessary for to use this port. They are defined so the common demo files
|
|||||||
{
|
{
|
||||||
uint8_t ucReturn;
|
uint8_t ucReturn;
|
||||||
|
|
||||||
__asm volatile ( "clz %0, %1" : "=r" ( ucReturn ) : "r" ( ulBitmap ) );
|
__asm volatile ( "clz %0, %1" : "=r" ( ucReturn ) : "r" ( ulBitmap ) : "memory" );
|
||||||
return ucReturn;
|
return ucReturn;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -208,13 +166,15 @@ not necessary for to use this port. They are defined so the common demo files
|
|||||||
#define portFORCE_INLINE inline __attribute__(( always_inline))
|
#define portFORCE_INLINE inline __attribute__(( always_inline))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
portFORCE_INLINE static BaseType_t xPortIsInsideInterrupt( void )
|
portFORCE_INLINE static BaseType_t xPortIsInsideInterrupt( void )
|
||||||
{
|
{
|
||||||
uint32_t ulCurrentInterrupt;
|
uint32_t ulCurrentInterrupt;
|
||||||
BaseType_t xReturn;
|
BaseType_t xReturn;
|
||||||
|
|
||||||
/* Obtain the number of the currently executing interrupt. */
|
/* Obtain the number of the currently executing interrupt. */
|
||||||
__asm volatile( "mrs %0, ipsr" : "=r"( ulCurrentInterrupt ) );
|
__asm volatile( "mrs %0, ipsr" : "=r"( ulCurrentInterrupt ) :: "memory" );
|
||||||
|
|
||||||
if( ulCurrentInterrupt == 0 )
|
if( ulCurrentInterrupt == 0 )
|
||||||
{
|
{
|
||||||
@@ -236,11 +196,11 @@ uint32_t ulNewBASEPRI;
|
|||||||
|
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
" mov %0, %1 \n" \
|
" mov %0, %1 \n" \
|
||||||
" msr basepri, %0 \n" \
|
" msr basepri, %0 \n" \
|
||||||
" isb \n" \
|
" isb \n" \
|
||||||
" dsb \n" \
|
" dsb \n" \
|
||||||
:"=r" (ulNewBASEPRI) : "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY )
|
:"=r" (ulNewBASEPRI) : "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) : "memory"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -253,11 +213,11 @@ uint32_t ulOriginalBASEPRI, ulNewBASEPRI;
|
|||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
" mrs %0, basepri \n" \
|
" mrs %0, basepri \n" \
|
||||||
" mov %1, %2 \n" \
|
" mov %1, %2 \n" \
|
||||||
" msr basepri, %1 \n" \
|
" msr basepri, %1 \n" \
|
||||||
" isb \n" \
|
" isb \n" \
|
||||||
" dsb \n" \
|
" dsb \n" \
|
||||||
:"=r" (ulOriginalBASEPRI), "=r" (ulNewBASEPRI) : "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY )
|
:"=r" (ulOriginalBASEPRI), "=r" (ulNewBASEPRI) : "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) : "memory"
|
||||||
);
|
);
|
||||||
|
|
||||||
/* This return will not be reached but is necessary to prevent compiler
|
/* This return will not be reached but is necessary to prevent compiler
|
||||||
@@ -270,11 +230,12 @@ portFORCE_INLINE static void vPortSetBASEPRI( uint32_t ulNewMaskValue )
|
|||||||
{
|
{
|
||||||
__asm volatile
|
__asm volatile
|
||||||
(
|
(
|
||||||
" msr basepri, %0 " :: "r" ( ulNewMaskValue )
|
" msr basepri, %0 " :: "r" ( ulNewMaskValue ) : "memory"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
#define portMEMORY_BARRIER() __asm volatile( "" ::: "memory" )
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user