你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
tovax 提问时间:2016-5-10 10:41 /
本帖最后由 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!

收藏 评论12 发布时间:2016-5-10 10:41

举报

12个回答
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后进入了休眠。
  1. /*******************************************************************************
  2. * Function Name  : Suspend
  3. * Description    : sets suspend mode operating conditions
  4. * Input          : None.
  5. * Output         : None.
  6. * Return         : USB_SUCCESS.
  7. *******************************************************************************/
  8. void Suspend(void)
  9. {
  10.         uint32_t i =0;
  11.         uint16_t wCNTR;
  12.         uint32_t tmpreg = 0;
  13.   __IO uint32_t savePWR_CR=0;
  14.         /* suspend preparation */
  15.         /* ... */
  16.        
  17.         /*Store CNTR value */
  18.         wCNTR = _GetCNTR();  

  19.     /* This a sequence to apply a force RESET to handle a robustness case */
  20.    
  21.         /*Store endpoints registers status */
  22.     for (i=0;i<8;i++) EP[i] = _GetENDPOINT(i);
  23.        
  24.         /* unmask RESET flag */
  25.         wCNTR|=CNTR_RESETM;
  26.         _SetCNTR(wCNTR);
  27.        
  28.         /*apply FRES */
  29.         wCNTR|=CNTR_FRES;
  30.         _SetCNTR(wCNTR);
  31.        
  32.         /*clear FRES*/
  33.         wCNTR&=~CNTR_FRES;
  34.         _SetCNTR(wCNTR);
  35.        
  36.         /*poll for RESET flag in ISTR*/
  37.         while((_GetISTR()&ISTR_RESET) == 0);
  38.        
  39.         /* clear RESET flag in ISTR */
  40.         _SetISTR((uint16_t)CLR_RESET);
  41.        
  42.         /*restore Enpoints*/
  43.         for (i=0;i<8;i++)
  44.         _SetENDPOINT(i, EP[i]);
  45.        
  46.         /* Now it is safe to enter macrocell in suspend mode */
  47.         wCNTR |= CNTR_FSUSP;
  48.         _SetCNTR(wCNTR);
  49.        
  50.         /* force low-power mode in the macrocell */
  51.         wCNTR = _GetCNTR();
  52.         wCNTR |= CNTR_LPMODE;
  53.         _SetCNTR(wCNTR);
  54.        
  55.         /*prepare entry in low power mode (STOP mode)*/
  56.         /* Select the regulator state in STOP mode*/
  57.         savePWR_CR = PWR->CR;
  58.         tmpreg = PWR->CR;
  59.         /* Clear PDDS and LPDS bits */
  60.         tmpreg &= ((uint32_t)0xFFFFFFFC);
  61.         /* Set LPDS bit according to PWR_Regulator value */
  62.         tmpreg |= PWR_Regulator_LowPower;
  63.         /* Store the new value */
  64.         PWR->CR = tmpreg;
  65.         /* Set SLEEPDEEP bit of Cortex System Control Register */
  66. #if defined (STM32F30X) || defined (STM32F37X)
  67.         SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
  68. #else
  69.         SCB->SCR |= SCB_SCR_SLEEPDEEP;      
  70. #endif
  71.        
  72.         /* enter system in STOP mode, only when wakeup flag in not set */
  73.         if((_GetISTR()&ISTR_WKUP)==0)
  74.         {
  75.                 __WFI();
  76.                 /* Reset SLEEPDEEP bit of Cortex System Control Register */
  77. #if defined (STM32F30X) || defined (STM32F37X)
  78.                 SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP_Msk);
  79. #else
  80.                 SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP);
  81. #endif
  82.         }
  83.         else
  84.         {
  85.                 /* Clear Wakeup flag */
  86.                 _SetISTR(CLR_WKUP);
  87.                 /* clear FSUSP to abort entry in suspend mode  */
  88.         wCNTR = _GetCNTR();
  89.         wCNTR&=~CNTR_FSUSP;
  90.         _SetCNTR(wCNTR);
  91.                
  92.                 /*restore sleep mode configuration */
  93.                 /* restore Power regulator config in sleep mode*/
  94.                 PWR->CR = savePWR_CR;
  95.                
  96.                 /* Reset SLEEPDEEP bit of Cortex System Control Register */
  97. #if defined (STM32F30X) || defined (STM32F37X)               
  98.                 SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP_Msk);
  99. #else
  100.                 SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP);
  101. #endif
  102.     }
  103. }
复制代码


这是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中断就进入休眠了。
12下一页
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
13245底部标题123相同标题
12底部标题123相同标题
33333底部标题123相同序号
3435底部标题-无链接
关注我们
st-img 微信公众号
st-img 手机版