你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。
chrome
firefox
safari
ie8及以上
ST
官网
STM32
中文官网
ST
全球论坛
登录/注册
首页
技术问答
话题
资源
创客秀
视频
标签
积分商城
每日签到
usb中断函数栈溢出
[复制链接]
clm705
提问时间:2017-11-18 09:09 /
问答
是否解决:
移植stm32f4Discovery的usb 虚拟串口程序到rtthread, 运行时出现 USBD_OTG_ISR_Handler()中断函数溢出。
中断函数不是任务,不知道在哪里设置中断函数的堆栈大小。修改startup_stm32f4xx.s中的堆栈参数,不能解决问题。
望高人能指点一下,谢谢
赞
0
收藏
1
评论
5
分享
发布时间:2017-11-18 09:09
举报
请先
登录
后回复
5个回答
随风飘扬
回答时间:2017-11-18 10:23:01
a0a.1 32b0c
是不是在数组操作越界了?
评分
参与人数
1
蝴蝶豆
+1
收起
理由
zero99
+ 1
查看全部评分
赞
0
评论
回复
支持
反对
clm705
回答时间:2017-11-18 12:33:18
a0a.1 32b0c
不是数组越界,是中断处理函数的栈溢出。由于是中断处理函数,不是具体的thread,rtthread打印不出thread名(中断处理函数本就不在任务里),finsh里显示的任务栈都是正常的。
rtthread支持的文档很少,当初选用这个系统主要是因为它对lwip的支持。而技术文档太少也是现在遇到最大的问题。
赞
0
评论
回复
支持
反对
无薪税绵
回答时间:2018-3-12 11:24:34
a0a.1 32b0c
本帖最后由 无薪税绵 于 2018-3-12 11:27 编辑
在对USB的寄存器初始化之后,就是对USB的枚举过程,枚举过程都是通过USB中断完成的,
下面可以看USB的中断函数,在stm32fxxx_it.c中,找到USB中断的入口,
其中断的原函数是在usb_dcd_int.c中。
uint32_t USBD_OTG_ISR_Handler (USB_OTG_CORE_HANDLE *pdev)
{
USB_OTG_GINTSTS_TypeDef gintr_status;
uint32_t retval = 0;
if (USB_OTG_IsDeviceMode(pdev)) /* ensure that we are in device mode */
{
gintr_status.d32 = USB_OTG_ReadCoreItr(pdev);
if (!gintr_status.d32) /* avoid spurious interrupt */
{
return 0;
}
if (gintr_status.b.outepintr)
{
retval |= DCD_HandleOutEP_ISR(pdev);
}
if (gintr_status.b.inepint)
{
retval |= DCD_HandleInEP_ISR(pdev);
}
if (gintr_status.b.modemismatch)
{
USB_OTG_GINTSTS_TypeDef gintsts;
/* Clear interrupt */
gintsts.d32 = 0;
gintsts.b.modemismatch = 1;
USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GINTSTS, gintsts.d32);
}
if (gintr_status.b.wkupintr)
{
retval |= DCD_HandleResume_ISR(pdev);
}
if (gintr_status.b.usbsuspend)
{
retval |= DCD_HandleUSBSuspend_ISR(pdev);
}
if (gintr_status.b.sofintr)
{
retval |= DCD_HandleSof_ISR(pdev);
}
if (gintr_status.b.rxstsqlvl)
{
retval |= DCD_HandleRxStatusQueueLevel_ISR(pdev);
}
if (gintr_status.b.usbreset)
{
retval |= DCD_HandleUsbReset_ISR(pdev);
}
if (gintr_status.b.enumdone)
{
retval |= DCD_HandleEnumDone_ISR(pdev);
}
if (gintr_status.b.incomplisoin)
{
retval |= DCD_IsoINIncomplete_ISR(pdev);
}
if (gintr_status.b.incomplisoout)
{
retval |= DCD_IsoOUTIncomplete_ISR(pdev);
}
#ifdef VBUS_SENSING_ENABLED
if (gintr_status.b.sessreqintr)
{
retval |= DCD_SessionRequest_ISR(pdev);
}
if (gintr_status.b.otgintr)
{
retval |= DCD_OTG_ISR(pdev);
}
#endif
}
return retval;
}
复制代码
通过 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
给力
查看全部评分
赞
0
评论
回复
支持
反对
maxtch
回答时间:2018-3-12 15:36:16
a0a.1 32b0c
中断处理函数是跳到核心态的,看看内核堆栈够不够用。
评分
参与人数
1
蝴蝶豆
+2
收起
理由
zero99
+ 2
查看全部评分
赞
0
评论
回复
支持
反对
feixiang20
回答时间:2018-3-12 22:01:50
a0a.1 32b0c
移植中出现的问题大多数是由堆栈设置不合理造成的,检查启动代码。论坛里有很多设置疑问,可以去做参考。
赞
0
评论
回复
支持
反对
所属标签
相似问题
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
微信公众号
手机版
快速回复
返回顶部
返回列表
评分
查看全部评分
rtthread支持的文档很少,当初选用这个系统主要是因为它对lwip的支持。而技术文档太少也是现在遇到最大的问题。
在对USB的寄存器初始化之后,就是对USB的枚举过程,枚举过程都是通过USB中断完成的,
下面可以看USB的中断函数,在stm32fxxx_it.c中,找到USB中断的入口,
其中断的原函数是在usb_dcd_int.c中。
通过 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
评分
查看全部评分
评分
查看全部评分