Common source code:
- Remove configASSERT() if a queue cannot be created, malloc failed hook will be called anyway. Demo apps: - RZ/T blinky demo working, but still lots to do to improve the port.
This commit is contained in:
159
FreeRTOS/Source/portable/GCC/ARM_CRx_No_GIC/ISR_Support.h
Normal file
159
FreeRTOS/Source/portable/GCC/ARM_CRx_No_GIC/ISR_Support.h
Normal file
@ -0,0 +1,159 @@
|
||||
/*
|
||||
FreeRTOS V8.2.2 - Copyright (C) 2015 Real Time Engineers Ltd.
|
||||
All rights reserved
|
||||
|
||||
|
||||
***************************************************************************
|
||||
* *
|
||||
* FreeRTOS tutorial books are available in pdf and paperback. *
|
||||
* Complete, revised, and edited pdf reference manuals are also *
|
||||
* available. *
|
||||
* *
|
||||
* Purchasing FreeRTOS documentation will not only help you, by *
|
||||
* ensuring you get running as quickly as possible and with an *
|
||||
* in-depth knowledge of how to use FreeRTOS, it will also help *
|
||||
* the FreeRTOS project to continue with its mission of providing *
|
||||
* professional grade, cross platform, de facto standard solutions *
|
||||
* for microcontrollers - completely free of charge! *
|
||||
* *
|
||||
* >>> See http://www.FreeRTOS.org/Documentation for details. <<< *
|
||||
* *
|
||||
* Thank you for using FreeRTOS, and thank you for your support! *
|
||||
* *
|
||||
***************************************************************************
|
||||
|
||||
|
||||
This file is part of the FreeRTOS distribution.
|
||||
|
||||
FreeRTOS is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License (version 2) as published by the
|
||||
Free Software Foundation AND MODIFIED BY the FreeRTOS exception.
|
||||
>>>NOTE<<< The modification to the GPL is included to allow you to
|
||||
distribute a combined work that includes FreeRTOS without being obliged to
|
||||
provide the source code for proprietary components outside of the FreeRTOS
|
||||
kernel. FreeRTOS is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
more details. You should have received a copy of the GNU General Public
|
||||
License and the FreeRTOS license exception along with FreeRTOS; if not it
|
||||
can be viewed here: http://www.freertos.org/a00114.html and also obtained
|
||||
by writing to Richard Barry, contact details for whom are available on the
|
||||
FreeRTOS WEB site.
|
||||
|
||||
1 tab == 4 spaces!
|
||||
|
||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
||||
contact details.
|
||||
|
||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
||||
critical systems.
|
||||
|
||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
||||
licensing and training services.
|
||||
*/
|
||||
|
||||
#define portNESTING_INTERRUPT_ENTRY() \
|
||||
__asm volatile ( \
|
||||
".extern ulPortYieldRequired \t\n" \
|
||||
".extern ulPortInterruptNesting \t\n" \
|
||||
".extern FreeRTOS_SVC_Handler \t\n" \
|
||||
/* Return to the interrupted instruction. */ \
|
||||
"SUB LR, LR, #4 \t\n" \
|
||||
\
|
||||
/* Push the return address and SPSR. */ \
|
||||
"PUSH {LR} \t\n" \
|
||||
"MRS LR, SPSR \t\n" \
|
||||
"PUSH {LR} \t\n" \
|
||||
\
|
||||
/* Change to supervisor mode to allow reentry. */ \
|
||||
"CPS #0x13 \t\n" \
|
||||
\
|
||||
/* Push used registers. */ \
|
||||
"PUSH {r0-r4, r12} \t\n" \
|
||||
\
|
||||
/* Increment nesting count. r3 holds the address */ \
|
||||
/* of ulPortInterruptNesting future use. */ \
|
||||
"LDR r2, =ulPortInterruptNestingConst \t\n" \
|
||||
"LDR r3, [r2] \t\n" \
|
||||
\
|
||||
"LDR r1, [r3] \t\n" \
|
||||
"ADD r4, r1, #1 \t\n" \
|
||||
"STR r4, [r3] \t\n" \
|
||||
\
|
||||
/* Ensure bit 2 of the stack pointer is clear. */ \
|
||||
/* r2 holds the bit 2 value for future use. */ \
|
||||
"MOV r2, sp \t\n" \
|
||||
"AND r2, r2, #4 \t\n" \
|
||||
"SUB sp, sp, r2 \t\n" \
|
||||
\
|
||||
/* Call the interrupt handler. */ \
|
||||
"PUSH {r0-r3, LR} " \
|
||||
);
|
||||
|
||||
#warning Why is ulPortYieldRequired accessed differently to the other variables?
|
||||
#warning R0 seems to being pushed even though it is not used.
|
||||
#warning Writing to the EOI register uses R4 on consecutive lines.
|
||||
|
||||
|
||||
#define portNESTING_INTERRUPT_EXIT() \
|
||||
__asm volatile ( \
|
||||
"POP {r0-r3, LR} \t\n" \
|
||||
"ADD sp, sp, r2 \t\n" \
|
||||
" \t\n" \
|
||||
"CPSID i \t\n" \
|
||||
"DSB \t\n" \
|
||||
"ISB \t\n" \
|
||||
" \t\n" \
|
||||
/* Write to the EOI register. */ \
|
||||
"LDR r4, ulICCEOIRConst \t\n" \
|
||||
"LDR r4, [r4] \t\n" \
|
||||
"STR r0, [r4] \t\n" \
|
||||
\
|
||||
/* Restore the old nesting count. */ \
|
||||
"STR r1, [r3] \t\n" \
|
||||
\
|
||||
/* A context switch is never performed if the */ \
|
||||
/* nesting count is not 0. */ \
|
||||
"CMP r1, #0 \t\n" \
|
||||
"BNE 1f \t\n" \
|
||||
\
|
||||
/* Did the interrupt request a context switch? */ \
|
||||
/* r1 holds the address of ulPortYieldRequired */ \
|
||||
/* and r0 the value of ulPortYieldRequired for */ \
|
||||
/* future use. */ \
|
||||
"LDR r1, =ulPortYieldRequired \t\n" \
|
||||
"LDR r0, [r1] \t\n" \
|
||||
"CMP r0, #0 \t\n" \
|
||||
"BNE 2f \t\n" \
|
||||
\
|
||||
"1: \t\n" \
|
||||
/* No context switch. Restore used registers, */ \
|
||||
/* LR_irq and SPSR before returning. 0x12 is IRQ */ \
|
||||
/* mode. */ \
|
||||
"POP {r0-r4, r12} \t\n" \
|
||||
"CPS #0x12 \t\n" \
|
||||
"POP {LR} \t\n" \
|
||||
"MSR SPSR_cxsf, LR \t\n" \
|
||||
"POP {LR} \t\n" \
|
||||
"MOVS PC, LR \t\n" \
|
||||
\
|
||||
"2: \t\n" \
|
||||
/* A context switch is to be performed. */ \
|
||||
/* Clear the context switch pending flag. */ \
|
||||
"MOV r0, #0 \t\n" \
|
||||
"STR r0, [r1] \t\n" \
|
||||
\
|
||||
/* Restore used registers, LR-irq and */ \
|
||||
/* SPSR before saving the context to the */ \
|
||||
/* task stack. 0x12 is IRQ mode. */ \
|
||||
"POP {r0-r4, r12} \t\n" \
|
||||
"CPS #0x12 \t\n" \
|
||||
"POP {LR} \t\n" \
|
||||
"MSR SPSR_cxsf, LR \t\n" \
|
||||
"POP {LR} \t\n" \
|
||||
"b FreeRTOS_SVC_Handler \t\n" \
|
||||
"ISB \t\n" \
|
||||
"ulICCEOIRConst: .word ulICCEOIR \t\n" \
|
||||
" ulPortInterruptNestingConst: .word ulPortInterruptNesting " \
|
||||
);
|
||||
|
@ -329,7 +329,9 @@ void vPortExitCritical( void )
|
||||
|
||||
void FreeRTOS_Tick_Handler( void )
|
||||
{
|
||||
portDISABLE_INTERRUPTS();
|
||||
uint32_t ulInterruptStatus;
|
||||
|
||||
ulInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR();
|
||||
|
||||
/* Increment the RTOS tick. */
|
||||
if( xTaskIncrementTick() != pdFALSE )
|
||||
@ -337,7 +339,8 @@ void FreeRTOS_Tick_Handler( void )
|
||||
ulPortYieldRequired = pdTRUE;
|
||||
}
|
||||
|
||||
portENABLE_INTERRUPTS();
|
||||
portCLEAR_INTERRUPT_MASK_FROM_ISR( ulInterruptStatus );
|
||||
|
||||
configCLEAR_TICK_INTERRUPT();
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
@ -68,6 +68,7 @@
|
||||
.extern ulPortInterruptNesting
|
||||
.extern ulPortTaskHasFPUContext
|
||||
.extern ulICCEOIR
|
||||
.extern ulPortYieldRequired
|
||||
|
||||
.global FreeRTOS_IRQ_Handler
|
||||
.global FreeRTOS_SVC_Handler
|
||||
@ -155,7 +156,7 @@
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
* SVC handler is used to start the scheduler.
|
||||
* SVC handler is used to yield.
|
||||
*****************************************************************************/
|
||||
.align 4
|
||||
.type FreeRTOS_SVC_Handler, %function
|
||||
@ -189,7 +190,6 @@ FreeRTOS_IRQ_Handler:
|
||||
PUSH {lr}
|
||||
|
||||
/* Change to supervisor mode to allow reentry. */
|
||||
CPS #SVC_MODE
|
||||
|
||||
/* Push used registers. */
|
||||
PUSH {r0-r4, r12}
|
||||
|
@ -153,7 +153,7 @@ globally enable and disable interrupts. */
|
||||
"DSB \n" \
|
||||
"ISB " );
|
||||
|
||||
__attribute__( ( always_inline ) ) static __inline uint32_t portSET_INTERRUPT_MASK_FROM_ISR( void )
|
||||
__attribute__( ( always_inline ) ) static __inline uint32_t portINLINE_SET_INTERRUPT_MASK_FROM_ISR( void )
|
||||
{
|
||||
volatile uint32_t ulCPSR;
|
||||
|
||||
@ -163,7 +163,8 @@ volatile uint32_t ulCPSR;
|
||||
return ulCPSR;
|
||||
}
|
||||
|
||||
#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) if( x != 0 ) portENABLE_INTERRUPTS()
|
||||
#define portSET_INTERRUPT_MASK_FROM_ISR() portINLINE_SET_INTERRUPT_MASK_FROM_ISR()
|
||||
#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) if( x == 0 ) portENABLE_INTERRUPTS()
|
||||
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
@ -198,7 +199,7 @@ void vPortTaskUsesFPU( void );
|
||||
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
#define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - __builtin_clz( uxReadyPriorities ) )
|
||||
#define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( uint32_t ) __builtin_clz( uxReadyPriorities ) )
|
||||
|
||||
#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */
|
||||
|
||||
|
@ -444,7 +444,6 @@ QueueHandle_t xReturn = NULL;
|
||||
traceCREATE_MUTEX_FAILED();
|
||||
}
|
||||
|
||||
configASSERT( pxNewQueue );
|
||||
return pxNewQueue;
|
||||
}
|
||||
|
||||
@ -1219,8 +1218,8 @@ Queue_t * const pxQueue = ( Queue_t * ) xQueue;
|
||||
if the item size is not 0. */
|
||||
configASSERT( pxQueue->uxItemSize == 0 );
|
||||
|
||||
/* Normally a mutex would not be given from an interrupt, especially if
|
||||
there is a mutex holder, as priority inheritance makes no sense for an
|
||||
/* Normally a mutex would not be given from an interrupt, especially if
|
||||
there is a mutex holder, as priority inheritance makes no sense for an
|
||||
interrupts, only tasks. */
|
||||
configASSERT( !( ( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) && ( pxQueue->pxMutexHolder != NULL ) ) );
|
||||
|
||||
|
Reference in New Issue
Block a user