| #include "FreeRTOS.h" | |
| #include "semphr.h" | |
| #include "task.h" | |
| /* The interrupt entry point. */ | |
| void vEMAC_ISR_Wrapper( void ) __attribute__((naked)); | |
| /* The function that actually performs the interrupt processing. This must be | |
| separate to the wrapper to ensure the correct stack frame is set up. */ | |
| void vEMAC_ISR_Handler( void ) __attribute__((noinline)); | |
| extern SemaphoreHandle_t xEMACSemaphore; | |
| void vEMAC_ISR_Handler( void ) | |
| { | |
| portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; | |
| /* Clear the interrupt. */ | |
| IntClear = 0xffff; | |
| VICVectAddr = 0; | |
| /* Ensure the uIP task is not blocked as data has arrived. */ | |
| xSemaphoreGiveFromISR( xEMACSemaphore, &xHigherPriorityTaskWoken ); | |
| if( xHigherPriorityTaskWoken ) | |
| { | |
| /* If the uIP task was unblocked then calling "Yield from ISR" here | |
| will ensure the interrupt returns directly to the uIP task, if it | |
| is the highest priority read task. */ | |
| portYIELD_FROM_ISR(); | |
| } | |
| } | |
| /*-----------------------------------------------------------*/ | |
| void vEMAC_ISR_Wrapper( void ) | |
| { | |
| /* Save the context of the interrupted task. */ | |
| portSAVE_CONTEXT(); | |
| /* Call the handler function. This must be separate from the wrapper | |
| function to ensure the correct stack frame is set up. */ | |
| __asm volatile( "bl vEMAC_ISR_Handler" ); | |
| /* Restore the context of whichever task is going to run next. */ | |
| portRESTORE_CONTEXT(); | |
| } | |