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 pxCurrentTCB
 | 
				
			||||||
    .extern vTaskSwitchContext
 | 
					    .extern vTaskSwitchContext
 | 
				
			||||||
    .extern vApplicationIRQHandler
 | 
					    .extern vApplicationIRQHandler
 | 
				
			||||||
 | 
					    .extern vApplicationFPUSafeIRQHandler
 | 
				
			||||||
    .extern ulPortInterruptNesting
 | 
					    .extern ulPortInterruptNesting
 | 
				
			||||||
    .extern ulPortTaskHasFPUContext
 | 
					    .extern ulPortTaskHasFPUContext
 | 
				
			||||||
    .extern ulICCEOIR
 | 
					    .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 );
 | 
					 * UBaseType_t ulPortCountLeadingZeros( UBaseType_t ulBitmap );
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user