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

stm32 USB CDC中诡异的堆栈设置问题

[复制链接]
潇潇雨歇pku 提问时间:2017-10-27 17:01 /
本帖最后由 潇潇雨歇pku 于 2017-10-31 08:45 编辑

芯片:STM32F401CB,有64kB ram
软件:cubemx生成的IAR工程
功能:mcu控制单片机采集i2c传感器数据,通过usb的virtual com port回传到PC(后期会在mcu本地处理)

问题1:接usb到pc后,可以在设备管理器中看到com口,但是串口助手无法打开。
尝试1:尝试修改iar堆栈大小
结果1:基本解决,可以传数据到PC,串口可以打开

为什么说基本解决呢,因为里边产生了更诡异的问题。
同样硬件3个样品,在A配置下,只有12能打开串口,3不能,在B配置下,3可以打开,12不能。
12.png 3.png
3个样品是同样的PCBA,芯片都是同一批次在mouser购买的,不存在假货的问题。买来放了大概2年。
由于芯片有64kB RAM,这么小的堆栈,绝对不存在撑爆ram的问题。
问题2:为什么3个芯片需要不同的配置?
问题3:为什么堆栈设置大了反而打开不串口了?设置小了打不开倒可以理解,大了打不开完全没道理啊?

之后又有了一个新的问题,别人拿我的程序做了改动,逻辑更复杂了,然后发现串口无法打开。
我这改堆栈已经轻车熟路了,心想可能随随便便就搞定了,结果又出了幺蛾子。
他的程序逻辑也就复杂了一点,结果堆栈都要设置到0x5000才可以打开串口。
5000.png
除此以外,还发现了更奇怪的问题。我查看map文件中的stack usage,stack用的其实很少:
stack usage.png
就是stack比较要设置的跟heap一样大才行,基本stack只用了那么点,也不能设置小了,哪怕是设置成0x4F00都不会,都会导致串口无法打开。
问题4:为什么stack使用很小的情况下,却必须设置很大?要跟heap一样大才可以工作?

与操作系统有关系,在win7下不会出问题。在win10下更新最新的驱动也可以。
收藏 评论10 发布时间:2017-10-27 17:01

举报

10个回答
uwyciw100 回答时间:2017-10-31 09:10:43
潇潇雨歇pku 发表于 2017-10-28 09:47
大神,我试过这个仿真。不知道为什么,在debug模式下,我在这里设置断点,总是运行不过来。不知道跟我的 ...

会不会和你工程的优化等级有关。我在IAR中,不开优化,是可以在这个判断中打断点的。堆分配到0X300,也是可以正常联接的(在电脑中,端口正常显示,还没试通信)。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

uwyciw100 回答时间:2017-10-27 17:34:23
直的是奇,之前一直调试F7的CDC,驱动上总是黄叹号。看了楼主的帖子,把堆的大小改大了(栈本来就比较大),结果居然好使了。什么原因还未知。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

QianFan 回答时间:2017-10-27 17:53:40
小的话这个地方分配内存失败,可以仿真跟一下。
pdev->pClassData = USBD_malloc(sizeof (USBD_CDC_HandleTypeDef));
  
  if(pdev->pClassData == NULL)
  {
    ret = 1;
  }

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

潇潇雨歇pku 回答时间:2017-10-28 09:45:57
uwyciw100 发表于 2017-10-27 17:34
直的是奇,之前一直调试F7的CDC,驱动上总是黄叹号。看了楼主的帖子,把堆的大小改大了(栈本来就比较大) ...

因为usb有一个全局变量,是结构体,结构体成员很多都是指针,都是要malloc空间的,所以对堆的需求比较大。
潇潇雨歇pku 回答时间:2017-10-28 09:47:51
QianFan 发表于 2017-10-27 17:53
小的话这个地方分配内存失败,可以仿真跟一下。
pdev->pClassData = USBD_malloc(sizeof (USBD_CDC_Handle ...

大神,我试过这个仿真。不知道为什么,在debug模式下,我在这里设置断点,总是运行不过来。不知道跟我的山寨下载器有没有关系。后来就放弃debug了……
潇潇雨歇pku 回答时间:2017-10-28 09:49:19
QianFan 发表于 2017-10-27 17:53
小的话这个地方分配内存失败,可以仿真跟一下。
pdev->pClassData = USBD_malloc(sizeof (USBD_CDC_Handle ...

还有问题3可以帮忙看一下吗?堆栈必须要设置到某个值附近才可以,小了不行,太大了也不行。ram是64k的肯定够用的。
以及堆和栈必须设置一样大才可以运行,以前从来没有碰到过这种变态要求的。
QianFan 回答时间:2017-10-28 10:37:17
潇潇雨歇pku 发表于 2017-10-28 09:49
还有问题3可以帮忙看一下吗?堆栈必须要设置到某个值附近才可以,小了不行,太大了也不行。ram是64k的肯 ...

这种情况可能是其他的地方引起的吧。内存越界了?
QianFan 回答时间:2017-10-28 10:37:24
潇潇雨歇pku 发表于 2017-10-28 09:49
还有问题3可以帮忙看一下吗?堆栈必须要设置到某个值附近才可以,小了不行,太大了也不行。ram是64k的肯 ...

这种情况可能是其他的地方引起的吧。内存越界了?
潇潇雨歇pku 回答时间:2017-10-30 08:44:36
QianFan 发表于 2017-10-28 10:37
这种情况可能是其他的地方引起的吧。内存越界了?

初始程序是由cube生成的,就在main中增加了一个字符串,然后在while中发送这个字符串,应该没有内存越界的问题。
12下一页
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
13245底部标题123相同标题
12底部标题123相同标题
33333底部标题123相同序号
3435底部标题-无链接
关注我们
st-img 微信公众号
st-img 手机版