tovax 发表于 2016-5-10 10:41:18

事关USB CustomHID终止了FreeRTOS任务调度...

本帖最后由 tovax 于 2016-5-10 10:42 编辑

PC: win7 32bit
开发板: STM3210E
IDE: keil4.7 mdk

事情的经过是这样的:
这两天把FreeRTOS移植到STM3210E的开发板上,就跑了一个LED任务,1HZ的频率闪烁。
然后找到stm32 usb库,把里边的Custom_HID移植到FreeRTOS系统中,USB任务也运行正常。
在两个任务交替执行的过程中,拔掉USB线,不好的事情发生了,LED停止闪烁了。。。
这么看来,应该是USB的挂起导致了FreeRTOS任务调度的停止,请问是哪个地方出问题了呢?
重新把USB插入后,两个任务都运行正常。。。

请来来往往的大神们指点迷津,Best Regards!

moyanming2013 发表于 2016-5-10 10:57:30

怎么感觉是你把USB供电线拔掉了

tovax 发表于 2016-5-10 11:26:48

本帖最后由 tovax 于 2016-5-10 11:29 编辑

moyanming2013 发表于 2016-5-10 10:57
怎么感觉是你把USB供电线拔掉了
有单独供电的,USB拔掉后不影响STM32的供电。
不过在您的启发下,我拔了jlink,貌似正常了,好像不稳定,同样的操作有时候可以,有时候不行。。。
jlink仿真是不是需要设置频率什么的,一仿真就死机一样了,LED完全没反应。。。
十分感谢!

tovax 发表于 2016-5-10 11:34:10

好像是这样的,我以为是FreeRTOS的任务调度被终止了,多等了一段时间发现是这样的:
本来LED是1秒钟交替闪烁的,拔掉USB线后,变成8秒多交替闪烁,因此,一不小心看上去像是死机了。
插上USB后,立刻变成1秒交替闪烁。拔掉就变成8秒。
这...真费解...

tovax 发表于 2016-5-10 11:55:31

USB线一直处于拔掉状态,LED闪烁频率是不稳定的,一会儿很慢(8秒左右),一会儿正常(1秒)

creep 发表于 2016-5-10 13:39:13

找到USB的suspend中断,看下是不是拔掉USB后进入了休眠。

tovax 发表于 2016-5-10 18:31:14

creep 发表于 2016-5-10 13:39
找到USB的suspend中断,看下是不是拔掉USB后进入了休眠。

/*******************************************************************************
* Function Name: Suspend
* Description    : sets suspend mode operating conditions
* Input          : None.
* Output         : None.
* Return         : USB_SUCCESS.
*******************************************************************************/
void Suspend(void)
{
        uint32_t i =0;
        uint16_t wCNTR;
        uint32_t tmpreg = 0;
__IO uint32_t savePWR_CR=0;
        /* suspend preparation */
        /* ... */
       
        /*Store CNTR value */
        wCNTR = _GetCNTR();

    /* This a sequence to apply a force RESET to handle a robustness case */
   
        /*Store endpoints registers status */
    for (i=0;i<8;i++) EP = _GetENDPOINT(i);
       
        /* unmask RESET flag */
        wCNTR|=CNTR_RESETM;
        _SetCNTR(wCNTR);
       
        /*apply FRES */
        wCNTR|=CNTR_FRES;
        _SetCNTR(wCNTR);
       
        /*clear FRES*/
        wCNTR&=~CNTR_FRES;
        _SetCNTR(wCNTR);
       
        /*poll for RESET flag in ISTR*/
        while((_GetISTR()&ISTR_RESET) == 0);
       
        /* clear RESET flag in ISTR */
        _SetISTR((uint16_t)CLR_RESET);
       
        /*restore Enpoints*/
        for (i=0;i<8;i++)
        _SetENDPOINT(i, EP);
       
        /* Now it is safe to enter macrocell in suspend mode */
        wCNTR |= CNTR_FSUSP;
        _SetCNTR(wCNTR);
       
        /* force low-power mode in the macrocell */
        wCNTR = _GetCNTR();
        wCNTR |= CNTR_LPMODE;
        _SetCNTR(wCNTR);
       
        /*prepare entry in low power mode (STOP mode)*/
        /* Select the regulator state in STOP mode*/
        savePWR_CR = PWR->CR;
        tmpreg = PWR->CR;
        /* Clear PDDS and LPDS bits */
        tmpreg &= ((uint32_t)0xFFFFFFFC);
        /* Set LPDS bit according to PWR_Regulator value */
        tmpreg |= PWR_Regulator_LowPower;
        /* Store the new value */
        PWR->CR = tmpreg;
        /* Set SLEEPDEEP bit of Cortex System Control Register */
#if defined (STM32F30X) || defined (STM32F37X)
      SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
#else
      SCB->SCR |= SCB_SCR_SLEEPDEEP;      
#endif
       
        /* enter system in STOP mode, only when wakeup flag in not set */
        if((_GetISTR()&ISTR_WKUP)==0)
        {
                __WFI();
                /* Reset SLEEPDEEP bit of Cortex System Control Register */
#if defined (STM32F30X) || defined (STM32F37X)
                SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP_Msk);
#else
                SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP);
#endif
        }
        else
        {
                /* Clear Wakeup flag */
                _SetISTR(CLR_WKUP);
                /* clear FSUSP to abort entry in suspend mode*/
      wCNTR = _GetCNTR();
      wCNTR&=~CNTR_FSUSP;
      _SetCNTR(wCNTR);
               
                /*restore sleep mode configuration */
                /* restore Power regulator config in sleep mode*/
                PWR->CR = savePWR_CR;
               
                /* Reset SLEEPDEEP bit of Cortex System Control Register */
#if defined (STM32F30X) || defined (STM32F37X)               
                SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP_Msk);
#else
                SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP);
#endif
    }
}

这是suspend的代码,我是这么想的,即便是suspend死循环了,只要不影响systick中断,freertos总要按套路执行的,咋个就把LED任务弄异常了。。。

tovax 发表于 2016-5-10 18:50:58

本帖最后由 tovax 于 2016-5-10 18:55 编辑

还有个现象,插拔USB之后,再把USB插入,HID控制灯的部分功能正常,电位器采样的部分没反应了

USB控制LED1,LED2,LED3,LED4,以开关形式点击触发
LED任务控制的也是LED1,LED2,LED3,LED4,周期性的亮灭
会不会是控制同一组灯造成的干扰呢

xmshao 发表于 2016-5-10 20:25:10

怀疑没玩没了进了挂起中断了。

creep 发表于 2016-5-10 22:44:03

tovax 发表于 2016-5-10 18:31
这是suspend的代码,我是这么想的,即便是suspend死循环了,只要不影响systick中断,freertos总要按套 ...

进入了suspend中断就进入休眠了。
页: [1] 2
查看完整版本: 事关USB CustomHID终止了FreeRTOS任务调度...