|
楼主 |
发表于 2009-12-7 14:27:22
|
显示全部楼层
看了一下网口中断:
void luminaryif_isr(void)
{
unsigned long ulTemp;
//
// Read and Clear the interrupt.
//
ulTemp = EthernetIntStatus(ETH_BASE, false);
EthernetIntClear(ETH_BASE, ulTemp);
//
// Check to see if an RX Interrupt has occured.
//
if(ulTemp & ETH_INT_RX)
{
//
// Indicate that a packet has been received.
//
rt_err_t result;
/* a frame has been received */
result = eth_device_ready((struct eth_device*)&(luminaryif_dev->parent));
RT_ASSERT(result == RT_EOK);
//
// Disable Ethernet RX Interrupt.
//
EthernetIntDisable(ETH_BASE, ETH_INT_RX);
}
if(ulTemp & ETH_INT_TX)
{
/* A frame has been transmitted. */
rt_sem_release(&tx_sem);
}
}
1. ping测试,time = 1ms,正好是1个tick,是在中断退出后,系统tick切换的;这个感觉可以再快一点;
2. 我在FreeRTOS中移植Lwip,网口中断接收到数据,立即强制上下文切换,结果ping测试基本上都是<1ms的
具体(LPC2378上的中断接收例子)
/*-----------------------------------------------------------*/
void ENET_IRQHandler(void) /*注意:中断已接受FreeRTOS保护,不能再加关键词__irq*/
{
U32 ulTemp = 0;
portBASE_TYPE xSwitchRequired = pdFALSE;
/*读取EMAC中断并清EMAC中断*/
ulTemp = MAC_INTSTATUS;
MAC_INTCLEAR = 0xFF;
/* Was it an Rx interrupt? */
if( ulTemp & EMAC_INT_RXDONE )
{
/*使能在中断中切换到另一个任务*/
xSwitchRequired = pdTRUE;
/*Unblock the task by releasing the semaphore.*/
xSemaphoreGiveFromISR(g_xWEBLwipSem, pdFALSE);
/*禁止接收数据包*/
MAC_INTENABLE = 0x0000; /*disable tx interrupt*/
//EMAC_RxDisable();
}
/*interrupt close 通知中断控制器中断结束*/
VICVectAddr = 0;
/* Switch to the transmitation task.(中断没有保护,导致切换失败) */
portEXIT_SWITCHING_ISR(xSwitchRequired);
}
LM3S6950上的网口中断:
/*-----------------------------------------------------------*/
void ENET_IRQHandler(void)
{
portBASE_TYPE xSwitchRequired = pdFALSE;
unsigned portLONG ulTemp;
/* Clear the interrupt. */
ulTemp = EthernetIntStatus( ETH_BASE, pdFALSE );
EthernetIntClear( ETH_BASE, ulTemp );
/* Was it an Rx interrupt? */
if( ulTemp & ETH_INT_RX )
{
xSwitchRequired = pdTRUE;
xSemaphoreGiveFromISR(g_xWEBLwipSem, pdFALSE);
EthernetIntDisable( ETH_BASE, ETH_INT_RX );
}
/* Switch to the transmitation task. */
portEND_SWITCHING_ISR( xSwitchRequired );
}
以上两个都是达到ping测试<1ms;
不知道RTThread能做类似处理吗? |
|