你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。
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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号
手机版
快速回复
返回顶部
返回列表
评分
查看全部评分
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
评分
查看全部评分
评分
查看全部评分