|
|
|
#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 );
|
|
|
|
|
|
|
|
extern xSemaphoreHandle 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. */
|
|
|
|
vEMAC_ISR_Handler();
|
|
|
|
|
|
|
|
/* Restore the context of whichever task is going to run next. */
|
|
|
|
portRESTORE_CONTEXT();
|
|
|
|
}
|
|
|
|
|