mirror of
				https://github.com/FreeRTOS/FreeRTOS-Kernel.git
				synced 2025-11-04 02:59:01 +01:00 
			
		
		
		
	Add support for vApplicationFPUSafeIRQHandler (#1113)
This PR adds support for vApplicationFPUSafeIRQHandler. The application writer needs to name their IRQ handler as: 1. vApplicationIRQHandler if the IRQ handler does not use FPU registers. 2. vApplicationFPUSafeIRQHandler is the IRQ handler uses FPU registers. When the application uses vApplicationFPUSafeIRQHandler, a default implementation of vApplicationIRQHandler is used which stores FPU registers and then calls vApplicationFPUSafeIRQHandler.
This commit is contained in:
		
							parent
							
								
									53c7e7c46f
								
							
						
					
					
						commit
						c963d24001
					
				@ -39,6 +39,7 @@
 | 
			
		||||
    .extern pxCurrentTCB
 | 
			
		||||
    .extern vTaskSwitchContext
 | 
			
		||||
    .extern vApplicationIRQHandler
 | 
			
		||||
    .extern vApplicationFPUSafeIRQHandler
 | 
			
		||||
    .extern ulPortInterruptNesting
 | 
			
		||||
    .extern ulPortTaskHasFPUContext
 | 
			
		||||
    .extern ulICCEOIR
 | 
			
		||||
@ -237,6 +238,50 @@ vApplicationSVCHandler:
 | 
			
		||||
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/* If the application provides an implementation of vApplicationIRQHandler(),
 | 
			
		||||
 * then it will get called directly without saving the FPU registers on
 | 
			
		||||
 * interrupt entry, and this weak implementation of vApplicationIRQHandler()
 | 
			
		||||
 * will not get called.
 | 
			
		||||
 *
 | 
			
		||||
 * If the application provides its own implementation of
 | 
			
		||||
 * vApplicationFPUSafeIRQHandler() then this implementation of
 | 
			
		||||
 * vApplicationIRQHandler() will be called, save the FPU registers, and then
 | 
			
		||||
 * call vApplicationFPUSafeIRQHandler().
 | 
			
		||||
 *
 | 
			
		||||
 * Therefore, if the application writer wants FPU registers to be saved on
 | 
			
		||||
 * interrupt entry, their IRQ handler must be called
 | 
			
		||||
 * vApplicationFPUSafeIRQHandler(), and if the application writer does not want
 | 
			
		||||
 * FPU registers to be saved on interrupt entry their IRQ handler must be
 | 
			
		||||
 * called vApplicationIRQHandler().
 | 
			
		||||
 */
 | 
			
		||||
.align 4
 | 
			
		||||
.weak vApplicationIRQHandler
 | 
			
		||||
.type vApplicationIRQHandler, %function
 | 
			
		||||
vApplicationIRQHandler:
 | 
			
		||||
    PUSH    {LR}
 | 
			
		||||
 | 
			
		||||
    VMRS    R1, FPSCR
 | 
			
		||||
    VPUSH   {D0-D7}
 | 
			
		||||
    PUSH    {R1}
 | 
			
		||||
 | 
			
		||||
    BLX     vApplicationFPUSafeIRQHandler
 | 
			
		||||
 | 
			
		||||
    POP     {R0}
 | 
			
		||||
    VPOP    {D0-D7}
 | 
			
		||||
    VMSR    FPSCR, R0
 | 
			
		||||
 | 
			
		||||
    POP     {PC}
 | 
			
		||||
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
.align 4
 | 
			
		||||
.weak vApplicationFPUSafeIRQHandler
 | 
			
		||||
.type vApplicationFPUSafeIRQHandler, %function
 | 
			
		||||
vApplicationFPUSafeIRQHandler:
 | 
			
		||||
    B       vApplicationFPUSafeIRQHandler
 | 
			
		||||
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * UBaseType_t ulPortCountLeadingZeros( UBaseType_t ulBitmap );
 | 
			
		||||
 *
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user