#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(); | |
} | |