mirror of
https://github.com/FreeRTOS/FreeRTOS-Kernel.git
synced 2025-09-12 17:17:44 -04:00
Merge commit.
This commit is contained in:
commit
a730a56a14
4 changed files with 6 additions and 42 deletions
|
@ -38,6 +38,8 @@ Changes between FreeRTOS V10.4.0 and FreeRTOS V10.3.1 released September 1 2020
|
||||||
the same way the Windows port layer enables FreeRTOS to run on Windows
|
the same way the Windows port layer enables FreeRTOS to run on Windows
|
||||||
hosts.
|
hosts.
|
||||||
+ Many other minor optimisations and enhancements.
|
+ Many other minor optimisations and enhancements.
|
||||||
|
+ Many other minor optimisations and enhancements. For full details
|
||||||
|
see https://github.com/FreeRTOS/FreeRTOS-Kernel/commits/master
|
||||||
|
|
||||||
|
|
||||||
Changes between FreeRTOS V10.3.0 and FreeRTOS V10.3.1 released February 18 2020
|
Changes between FreeRTOS V10.3.0 and FreeRTOS V10.3.1 released February 18 2020
|
||||||
|
|
|
@ -90,12 +90,7 @@
|
||||||
|
|
||||||
#define portNVIC_INT_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed04 ) )
|
#define portNVIC_INT_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed04 ) )
|
||||||
#define portNVIC_PENDSVSET_BIT ( 1UL << 28UL )
|
#define portNVIC_PENDSVSET_BIT ( 1UL << 28UL )
|
||||||
|
#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired != pdFALSE ) portYIELD()
|
||||||
#define portEND_SWITCHING_ISR( xSwitchRequired ) \
|
|
||||||
do { \
|
|
||||||
if( (xSwitchRequired) != pdFALSE ) portYIELD(); \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x )
|
#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x )
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
|
@ -146,20 +146,6 @@
|
||||||
#define portTASK_RETURN_ADDRESS prvTaskExitError
|
#define portTASK_RETURN_ADDRESS prvTaskExitError
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* Adding the necessary stuff in order to be able to determine from C code wheter or not the IRQs are enabled at the processor level (not interrupt controller level) */
|
|
||||||
#define GET_CPSR() \
|
|
||||||
( { u32 rval = 0U; \
|
|
||||||
__asm__ __volatile__ ( \
|
|
||||||
"mrs %0, cpsr\n"\
|
|
||||||
: "=r" ( rval ) \
|
|
||||||
); \
|
|
||||||
rval; \
|
|
||||||
} )
|
|
||||||
|
|
||||||
#define CPSR_IRQ_ENABLE_MASK 0x80U
|
|
||||||
|
|
||||||
#define IS_IRQ_DISABLED() ( { unsigned int val = 0; val = ( GET_CPSR() & CPSR_IRQ_ENABLE_MASK ) ? 1 : 0; val; } )
|
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -481,12 +467,6 @@ void vPortClearInterruptMask( uint32_t ulNewMaskValue )
|
||||||
uint32_t ulPortSetInterruptMask( void )
|
uint32_t ulPortSetInterruptMask( void )
|
||||||
{
|
{
|
||||||
uint32_t ulReturn;
|
uint32_t ulReturn;
|
||||||
uint32_t wasIRQDisabled;
|
|
||||||
|
|
||||||
/* We keep track of if the IRQ are enabled in the CPU (as opposed to interrupts masked in the interrupt controller, like the intend of this function).
|
|
||||||
* This is very important because when the CPU is interrupted, among other things, the hardware clears the IRQ Enable bit in the CPSR of the IRQ CPU Mode in which
|
|
||||||
* we enter. */
|
|
||||||
wasIRQDisabled = IS_IRQ_DISABLED();
|
|
||||||
|
|
||||||
/* Interrupt in the CPU must be turned off while the ICCPMR is being
|
/* Interrupt in the CPU must be turned off while the ICCPMR is being
|
||||||
* updated. */
|
* updated. */
|
||||||
|
@ -505,20 +485,7 @@ uint32_t ulPortSetInterruptMask( void )
|
||||||
"isb \n"::: "memory" );
|
"isb \n"::: "memory" );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Just like this function returns a value of wether or not the interrupts where masked in the interrupt controller in order to avoid race condition when
|
|
||||||
* calling its matching vPortClearInterruptMask function, we needed a 'wasIRQDisabled' variable holding the state of the IRQ Enable bit in the CPSR in order
|
|
||||||
* to leave that bit in it's original state. Like mentioned above, hardware automatically clear the IRQEnable bit upon trapping into IRQ Mode, so the programmer
|
|
||||||
* cannot make assumption about it's state. Very rare, but very important race condition is avoided with this when this function is called in an ISR. The race
|
|
||||||
* condition in question was discovered when integrating tracealyzer code. Inside the function 'void vTaskSwitchContext( void )' in tasks.c, there is a macro 'traceTASK_SWITCHED_IN();'
|
|
||||||
* which gets replaced by something when using the tracing capabilities. That macro protects some critical section with matching calls to 'ulPortSetInterruptMask'
|
|
||||||
* and 'vPortClearInterruptMask'. At the time of calling those functions, the interrupt mask is not set in the interrupt controller, thus the only protecting barrier
|
|
||||||
* against the CPU traping into recursive interrupt was the IRQ Enable bit in the CPSR. By not taking it into acount, the very code that protects the CPU against
|
|
||||||
* critical section violation just enabled it to happen : A SysTick was waiting to happen, and calling 'portCPU_IRQ_ENABLE' would enable it to occur... Thus triggering a
|
|
||||||
* switch of context while already performing a switch context. */
|
|
||||||
if( !wasIRQDisabled )
|
|
||||||
{
|
|
||||||
portCPU_IRQ_ENABLE();
|
portCPU_IRQ_ENABLE();
|
||||||
}
|
|
||||||
|
|
||||||
return ulReturn;
|
return ulReturn;
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,8 +28,8 @@
|
||||||
#ifndef PORTMACRO_H
|
#ifndef PORTMACRO_H
|
||||||
#define PORTMACRO_H
|
#define PORTMACRO_H
|
||||||
|
|
||||||
#include <Windows.h>
|
#include <windows.h>
|
||||||
#include <WinBase.h>
|
#include <winbase.h>
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
Defines
|
Defines
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue