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

usb中断函数栈溢出

[复制链接]
clm705 提问时间:2017-11-18 09:09 /
移植stm32f4Discovery的usb 虚拟串口程序到rtthread, 运行时出现 USBD_OTG_ISR_Handler()中断函数溢出。

中断函数不是任务,不知道在哪里设置中断函数的堆栈大小。修改startup_stm32f4xx.s中的堆栈参数,不能解决问题。

望高人能指点一下,谢谢
收藏 1 评论5 发布时间:2017-11-18 09:09

举报

5个回答
随风飘扬 回答时间:2017-11-18 10:23:01
是不是在数组操作越界了?

评分

参与人数 1蝴蝶豆 +1 收起 理由
zero99 + 1

查看全部评分

clm705 回答时间:2017-11-18 12:33:18
   不是数组越界,是中断处理函数的栈溢出。由于是中断处理函数,不是具体的thread,rtthread打印不出thread名(中断处理函数本就不在任务里),finsh里显示的任务栈都是正常的。
   rtthread支持的文档很少,当初选用这个系统主要是因为它对lwip的支持。而技术文档太少也是现在遇到最大的问题。
无薪税绵 回答时间:2018-3-12 11:24:34
本帖最后由 无薪税绵 于 2018-3-12 11:27 编辑

在对USB的寄存器初始化之后,就是对USB的枚举过程,枚举过程都是通过USB中断完成的,
下面可以看USB的中断函数,在stm32fxxx_it.c中,找到USB中断的入口,
其中断的原函数是在usb_dcd_int.c中。

  1. uint32_t USBD_OTG_ISR_Handler (USB_OTG_CORE_HANDLE *pdev)
  2. {
  3.   USB_OTG_GINTSTS_TypeDef  gintr_status;
  4.   uint32_t retval = 0;

  5.   if (USB_OTG_IsDeviceMode(pdev)) /* ensure that we are in device mode */
  6.   {
  7.     gintr_status.d32 = USB_OTG_ReadCoreItr(pdev);
  8.     if (!gintr_status.d32) /* avoid spurious interrupt */
  9.     {
  10.       return 0;
  11.     }

  12.     if (gintr_status.b.outepintr)
  13.     {
  14.       retval |= DCD_HandleOutEP_ISR(pdev);
  15.     }   

  16.     if (gintr_status.b.inepint)
  17.     {
  18.       retval |= DCD_HandleInEP_ISR(pdev);
  19.     }

  20.     if (gintr_status.b.modemismatch)
  21.     {
  22.       USB_OTG_GINTSTS_TypeDef  gintsts;

  23.       /* Clear interrupt */
  24.       gintsts.d32 = 0;
  25.       gintsts.b.modemismatch = 1;
  26.       USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GINTSTS, gintsts.d32);
  27.     }

  28.     if (gintr_status.b.wkupintr)
  29.     {
  30.       retval |= DCD_HandleResume_ISR(pdev);
  31.     }

  32.     if (gintr_status.b.usbsuspend)
  33.     {
  34.       retval |= DCD_HandleUSBSuspend_ISR(pdev);
  35.     }
  36.     if (gintr_status.b.sofintr)
  37.     {
  38.       retval |= DCD_HandleSof_ISR(pdev);

  39.     }

  40.     if (gintr_status.b.rxstsqlvl)
  41.     {
  42.       retval |= DCD_HandleRxStatusQueueLevel_ISR(pdev);

  43.     }

  44.     if (gintr_status.b.usbreset)
  45.     {
  46.       retval |= DCD_HandleUsbReset_ISR(pdev);

  47.     }
  48.     if (gintr_status.b.enumdone)
  49.     {
  50.       retval |= DCD_HandleEnumDone_ISR(pdev);
  51.     }

  52.     if (gintr_status.b.incomplisoin)
  53.     {
  54.       retval |= DCD_IsoINIncomplete_ISR(pdev);
  55.     }

  56.     if (gintr_status.b.incomplisoout)
  57.     {
  58.       retval |= DCD_IsoOUTIncomplete_ISR(pdev);
  59.     }   
  60. #ifdef VBUS_SENSING_ENABLED
  61.     if (gintr_status.b.sessreqintr)
  62.     {
  63.       retval |= DCD_SessionRequest_ISR(pdev);
  64.     }

  65.     if (gintr_status.b.otgintr)
  66.     {
  67.       retval |= DCD_OTG_ISR(pdev);
  68.     }   
  69. #endif   
  70.   }
  71.   return retval;
  72. }
复制代码



通过 gintr_status.d32 = USB_OTG_ReadCoreItr(pdev);
这句话读取的是USB的中断标志位,来判断是什么引起的中断,
这个我们可以查看USB的中断状态寄存器来了解这些中断源。
建议楼主在这里,查看一下,是什么中断源引起的。

同时注意gintr_status这是一个共用体,
其中两个参数是b和d32,
并且其中b的还是一个结构体,
里面的变量分别对应了USB中断状态寄存器的对应位。
这里面主要的是注意上面两个中断,
一个是USB的输出数据的函数DCD_HandleOutEP_ISR,
一个是写入数据的函数DCD_HandleInEP_ISR。

资料来源于:http://bbs.elecfans.com/jishu_1106608_1_1.html

这里有源代码,可以参考:http://www.cnblogs.com/hiker-blogs/p/stm32_usb.html

评分

参与人数 1蝴蝶豆 +5 收起 理由
zero99 + 5 给力

查看全部评分

maxtch 回答时间:2018-3-12 15:36:16
中断处理函数是跳到核心态的,看看内核堆栈够不够用。

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

feixiang20 回答时间:2018-3-12 22:01:50
移植中出现的问题大多数是由堆栈设置不合理造成的,检查启动代码。论坛里有很多设置疑问,可以去做参考。

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版