首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > VxWorks >

μcos多任务中关于USB初始化的调度有关问题.

2013-01-25 
μcos多任务中关于USB初始化的调度问题...请教各位一个问题:我在DE2-70中使用了多任务来处理多个事件。之前

μ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 ); 前加段延迟 让其他任务先跑起来!

热点排行