| #include "FreeRTOS.h" | |
| #include "semphr.h" | |
| #include "task.h" | |
| /* The interrupt entry point. */ | |
| void vEMAC_ISR_Wrapper( void ) __attribute__((naked)); | |
| /* The handler that does the actual work. */ | |
| void vEMAC_ISR_Handler( void ) __attribute__((noinline)); | |
| extern SemaphoreHandle_t xEMACSemaphore; | |
| void vEMAC_ISR_Handler( void ) | |
| { | |
| portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; | |
| /* Clear the interrupt. */ | |
| MAC_INTCLEAR = 0xffff; | |
| VICVectAddr = 0; | |
| /* Ensure the uIP task is not blocked as data has arrived. */ | |
| xSemaphoreGiveFromISR( xEMACSemaphore, &xHigherPriorityTaskWoken ); | |
| if( xHigherPriorityTaskWoken ) | |
| { | |
| /* Giving the semaphore woke a task. */ | |
| portYIELD_FROM_ISR(); | |
| } | |
| } | |
| /*-----------------------------------------------------------*/ | |
| void vEMAC_ISR_Wrapper( void ) | |
| { | |
| /* Save the context of the interrupted task. */ | |
| portSAVE_CONTEXT(); | |
| /* Call the handler. This must be a separate function unless you can | |
| guarantee that no stack will be used. */ | |
| __asm volatile ( "bl vEMAC_ISR_Handler" ); | |
| /* Restore the context of whichever task is going to run next. */ | |
| portRESTORE_CONTEXT(); | |
| } | |