μcos多任务中关于USB初始化的调度问题...
请教各位一个问题:我在DE2-70中使用了多任务来处理多个事件。之前的都OK,但是在引入USB之后却出现了问题,将USB初始化作为一个新的优先级最高的任务引入之后,并不能完成初始化的功能。具体代码如下:
void USB_Task(void *p_arg)//完成数初始化工作
{
p_arg = p_arg;
disable();
disconnect_USB();
usleep(1000000);
Hal4D13_ResetDevice();
bUSBCheck_Device_State.State_bits.DEVICE_DEFAULT_STATE = 1;
bUSBCheck_Device_State.State_bits.DEVICE_ADDRESS_STATE = 0;
bUSBCheck_Device_State.State_bits.DEVICE_CONFIGURATION_STATE = 0;
bUSBCheck_Device_State.State_bits.RESET_BITS = 0;
usleep(1000000);
reconnect_USB();
CHECK_CHIP_ID();
Hal4D13_AcquireD13(ISP1362_DC_IRQ,(void*)usb_isr);
enable();
bD13flags.bits.verbose=1;
while (1)
{
if (bUSBCheck_Device_State.State_bits.RESET_BITS == 1)
{
disable();
break;
}
if (bD13flags.bits.suspend)
{
disable();
bD13flags.bits.suspend= 0;
enable();
suspend_change();
} // Suspend Change Handler
if (bD13flags.bits.DCP_state == USBFSM4DCP_SETUPPROC)
{
disable();
SetupToken_Handler();
enable();
} // Setup Token Handler
if ((bD13flags.bits.DCP_state == USBFSM4DCP_REQUESTPROC) && !ControlData.Abort)
{
disable();
bD13flags.bits.DCP_state = 0x00;
DeviceRequest_Handler();
enable();
} // Device Request Handler
usleep(1000000);
if (usb_Ep01Done)
{
unsigned char * bbuf = usb_buf;
usb_Ep01Done = 0;
//scpi(bbuf);
}
OSTimeDlyHMSM(0, 0, 0, 3);
}
}
其中使用了中断,代码如下:
void usb_isr(void) //注册的中断服务程序
{
ULONG i_st;
//IOWR(PIO_SEG7_B_BASE,0, 0xAAAAAAAA);
disable();
Hal4D13_LockDevice(0);
bD13flags.bits.At_IRQL1 = 1;
i_st = Hal4D13_ReadInterruptRegister(); //读中断寄存器
if(i_st != 0) //根据中断寄存器的值执行不同的服务程序
{
//IOWR_ALTERA_AVALON_PIO_DATA(PIO_SEG7_A_BASE, i_st);
//USB_ISR_DEBUG(("[ISR]i_st=%lX\r\n", i_st));
if(i_st & D13REG_INTSRC_BUSRESET){ // 0x01
USB_ISR_DEBUG(("[USB ISR1] Bus Reset\r\n"));
Isr_BusReset();
}else if(i_st & D13REG_INTSRC_SUSPEND){ // 0x04
USB_ISR_DEBUG(("[USB ISR2] Suspend\r\n"));
Isr_SuspendChange();
}else if(i_st & D13REG_INTSRC_EOT){
USB_ISR_DEBUG(("[USB ISR3] EOT (End of Tx)\r\n"));
Isr_DmaEot();
}else if(i_st & (D13REG_INTSRC_SOF|D13REG_INTSRC_PSEUDO_SOF)){
USB_ISR_DEBUG(("[USB ISR4] SOF (start of frame)\r\n"));
Isr_SOF();
}else if(i_st & D13REG_INTSRC_SHORT_PACKET){
USB_ISR_DEBUG(("[USB ISR5] short packet\r\n"));
Isr_SHORT_PACKET();
}else if(i_st & D13REG_INTSRC_RESUME){
USB_ISR_DEBUG(("[USB ISR6] resume\n"));
Hal4D13_LockDevice(0);
}
else
{
USB_ISR_DEBUG(("[USB ISR7] other, i_st = %lXh....resume\n", i_st));
if(i_st & D13REG_INTSRC_EP0OUT)
Isr_Ep00RxDone();
if(i_st & D13REG_INTSRC_EP0IN)
Isr_Ep00TxDone();
if(i_st & D13REG_INTSRC_EP01) //400
Isr_Ep01Done(); //USB中断处理?
//D13REG_INTSRC_EP01在HAL4D13.H中定义,但定义依据是什么?
if(i_st & D13REG_INTSRC_EP02) //800
Isr_Ep02Done();
if(i_st & D13REG_INTSRC_EP03)
Isr_Ep03Done();
if(i_st & D13REG_INTSRC_EP04)
Isr_Ep04Done();
if(i_st & D13REG_INTSRC_EP05)
Isr_Ep05Done();
if(i_st & D13REG_INTSRC_EP06)
Isr_Ep06Done();
}
}
enable();
bD13flags.bits.At_IRQL1 = 0;
}
主函数如下:
int main(void)
{
GUI_Init();
init_touch();
init_mouse();
init_keyboard();
OSTaskCreate(Start_Task,NULL,(OS_STK *)&task1_stk[TASK_STACKSIZE -1],TASK1_PRIORITY );
OSTaskCreate(Main_Task,NULL,(OS_STK *)&task2_stk[TASK_STACKSIZE -1],TASK2_PRIORITY );
OSTaskCreate(GUI_Task,NULL,(OS_STK *)&task3_stk[TASK_STACKSIZE -1],TASK3_PRIORITY );
OSTaskCreate(USB_Task,NULL,(OS_STK *)&usbtask_stk[TASK_STACKSIZE -1],USBTASK_PRIORITY );
OSStart();
AWG_Generator();
return 0;
}
主函数在没有引入USB任务之前功能是都可以实现的...
求帮助...
[解决办法]
OSTaskCreate(USB_Task,NULL,(OS_STK *)&usbtask_stk[TASK_STACKSIZE -1],USBTASK_PRIORITY ); 前加段延迟 让其他任务先跑起来!