高中生
最后登录1970-1-1
在线时间 小时
注册时间2016-2-26
|
你好,火哥,我在F429下移植了你的LWIP例程,例程中ethernetif_input如下:
void ethernetif_input( void * pvParameters )
{
struct pbuf *p;
OS_ERR os_err;
err_t err;
/* move received packet into a new pbuf */
while (1)
{
SYS_ARCH_DECL_PROTECT(sr);
SYS_ARCH_PROTECT(sr);
p = low_level_input(s_pxNetIf);
SYS_ARCH_UNPROTECT(sr);
if (p == NULL)
continue;
err = s_pxNetIf->input(p, s_pxNetIf);
if (err != ERR_OK){
LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_input: IP input error\n"));
pbuf_free(p);
p = NULL;
}
/*sleep 5 ms*/
OSTimeDlyHMSM(0, 0, 0, 5, OS_OPT_TIME_DLY, (OS_ERR *)&os_err);
}
}
网口没有有效数据的时候该系统使无法执行调度的,因此想改用网口接收中断的方式触发该任务,但中断中向该任务发布消息之后系统始终不调度ethernetif_input,怀疑是任务TCB没有配置对,你把LWIP所有任务的TCB用一个数组表示,我用串口打印出来Net_if的TCB下标号为3,所以网口中断中是这样写的。
void ETH_IRQHandler(void)
{
OS_ERR err;
OSIntEnter();
while(ETH_GetRxPktSize(DMARxDescToGet)!=0) //检测是否收到数据包
{
DEBUG("\r\n 以太网中断 \r\n");
OSTaskSemPost( &LwIP_task_TCB[3], /* 向Net_if任务发布信号量 */
OS_OPT_POST_NO_SCHED, /* 发布后不立即进行调度 */
&err);
ETH_DMAClearITPendingBit(ETH_DMA_IT_R); //清除DMA中断标志位
ETH_DMAClearITPendingBit(ETH_DMA_IT_NIS); //清除DMA接收中断标志位
}
OSIntExit();
}
实测串口可以打印出“以太网中断”,说明确实是进中断了,但为什么就是不调度ethernetif_input呢,&LwIP_task_TCB[3],这么写TCB有问题吗?
|
|