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.
pull/1116/head
Rahul Kar 6 months ago committed by GitHub
parent 53c7e7c46f
commit c963d24001
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -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…
Cancel
Save