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

事关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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版