mirror of
https://github.com/FreeRTOS/FreeRTOS-Kernel.git
synced 2025-08-11 13:54:16 -04:00
Changed the way the ARM7/9 GCC ports enter interrupts that can cause a context switch.
This commit is contained in:
parent
c54ec1c639
commit
ada7fa862d
24 changed files with 322 additions and 275 deletions
|
@ -2,17 +2,18 @@
|
|||
#include "Semphr.h"
|
||||
#include "Task.h"
|
||||
|
||||
void vEMAC_ISR( void ) __attribute__((naked));
|
||||
/* 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( void )
|
||||
|
||||
void vEMAC_ISR_Handler( void )
|
||||
{
|
||||
portENTER_SWITCHING_ISR();
|
||||
|
||||
static portBASE_TYPE xSwitchRequired;
|
||||
|
||||
xSwitchRequired = pdFALSE;
|
||||
portBASE_TYPE xSwitchRequired = pdFALSE;
|
||||
|
||||
/* Clear the interrupt. */
|
||||
MAC_INTCLEAR = 0xffff;
|
||||
|
@ -21,11 +22,22 @@ void vEMAC_ISR( void )
|
|||
/* Ensure the uIP task is not blocked as data has arrived. */
|
||||
if( xSemaphoreGiveFromISR( xEMACSemaphore, pdFALSE ) )
|
||||
{
|
||||
xSwitchRequired = pdTRUE;
|
||||
/* Giving the semaphore woke a task. */
|
||||
portYIELD_FROM_ISR();
|
||||
}
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
/* Switch to the uIP task. */
|
||||
portEXIT_SWITCHING_ISR( xSwitchRequired );
|
||||
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();
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -62,7 +62,7 @@
|
|||
#define uipIP_ADDR0 172
|
||||
#define uipIP_ADDR1 25
|
||||
#define uipIP_ADDR2 218
|
||||
#define uipIP_ADDR3 10
|
||||
#define uipIP_ADDR3 16
|
||||
|
||||
/* How long to wait before attempting to connect the MAC again. */
|
||||
#define uipINIT_WAIT 100
|
||||
|
@ -115,7 +115,7 @@ void vuIP_Task( void *pvParameters )
|
|||
portBASE_TYPE i;
|
||||
uip_ipaddr_t xIPAddr;
|
||||
struct timer periodic_timer, arp_timer;
|
||||
extern void ( vEMAC_ISR )( void );
|
||||
extern void ( vEMAC_ISR_Wrapper )( void );
|
||||
|
||||
/* Create the semaphore used by the ISR to wake this task. */
|
||||
vSemaphoreCreateBinary( xEMACSemaphore );
|
||||
|
@ -138,7 +138,7 @@ extern void ( vEMAC_ISR )( void );
|
|||
{
|
||||
MAC_INTENABLE = INT_RX_DONE;
|
||||
VICIntEnable |= 0x00200000;
|
||||
VICVectAddr21 = ( portLONG ) vEMAC_ISR;
|
||||
VICVectAddr21 = ( portLONG ) vEMAC_ISR_Wrapper;
|
||||
prvSetMACAddress();
|
||||
}
|
||||
portEXIT_CRITICAL();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue