搜索
bottom↓
回复: 10

记录一个STM32的奇怪重启问题:更改数据类型后解决,但是复现不了!

[复制链接]

出590入992汤圆

发表于 2020-7-4 14:47:07 | 显示全部楼层 |阅读模式
本帖最后由 SUPER_CRJ 于 2020-7-4 14:51 编辑

RT。
今天解决了三个小时:把一个局部变量从:unsigned char改为int后,问题消失。然后:我再把int改回unsigned char,问题又复现不了!(怀疑MDK的编译器出了临时出了问题)

具体情况如下:
正在写一个USB和程序。
正常写的代码和指令,然后突然间发现:之前正常的指令,下发后:USB会重启,但是单片机应该没有重启,进入调试模式后:断点也停不下来,好像不认断点一样,但是MDK中调试模式复位操作和查看寄存器内容还是OK的。
经过两个小时的定位,发现只要把下面语句给屏蔽就可以了:
  1.         u8 receCount = 0; // 主接收计数
  2.         int returnNum = 0;
  3.                 ...// 还有其它代码。这里就不写了。
  4.                                 if( receCount < 8 ) { // 此时一定进入数据
  5.                                         returnNum++;
  6.                                 }
  7.                                 else if( receCount == 8 ){
  8.                                         // 其它处理代码,屏蔽掉也会出现问题。所以这里不写出。
  9.                                 }
  10.                                 if( receCount >= 9 ) {  // 此时数据肯定结束,表示接收了数据+校验和。
  11.                                         break;
  12.                                 }
复制代码


但是思前想后,都是局部变量,非常简单,怎么可以产生类似复位呢。
然后:猜测可能堆栈问题,把堆栈调大,还是不行。
然后:换一个设备进行调试,也是同样的问题。
然后:调整,优化等级,最低,还是不行。
最后:重启电脑,还是不行。
偶然间:我把:u8 receCount = 0; 改为:int receCount = 0; 问题居然解决了。然后再改回来:u8 receCount = 0;居然又不复现了。我也晕了。暂时只能怀疑是编译器的问题了(编程这么长时间,好像第一次遇到这种情况)。

最后:再请教一个问题:如何把MDK的编译信息都删除,就像一个新的工程编译那样。

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入4汤圆

发表于 2020-7-4 15:53:56 | 显示全部楼层
随便猜一下,会不会是8位数据类型导致溢出了,然后看门狗得不到喂,所以复位了。
要清掉编译信息可以在KEIL的project菜单里点Clean Targets
另外,LZ是用五笔打字的

出0入0汤圆

发表于 2020-7-5 01:11:51 | 显示全部楼层
LL00 发表于 2020-7-4 15:53
随便猜一下,会不会是8位数据类型导致溢出了,然后看门狗得不到喂,所以复位了。
要清掉编译信息可以在KEIL ...

只有可能这样,肯定是类型溢出

出0入4汤圆

发表于 2020-7-5 01:35:55 | 显示全部楼层
我猜是Build和Rebuild的问题,我用keil的时候出现莫名其妙的问题的时候,就执行一次Rebuild,确保代码没问题。一般情况下修改了数组长度和变量的类型时,就要使用Rebuild才行,否则容易出现奇怪的问题。

出0入4汤圆

发表于 2020-7-5 08:16:15 | 显示全部楼层
数组越界了,硬件错误中断里使用asm("bx lr");可以定位跑飞的位置

出0入362汤圆

发表于 2020-7-5 10:26:25 | 显示全部楼层
多大工程啊? 我现在默认都是make -Bsj了,  也就多几秒钟编译时间而已.

出0入0汤圆

发表于 2020-7-5 11:23:37 | 显示全部楼层
有可能是无符号,与有符号的差别

出0入0汤圆

发表于 2020-7-5 12:24:07 | 显示全部楼层
看了一下楼主的代码:
1. 首先确认一下ReceiveCount这个在什么时候被增加的。
2. returnNum++,不受最大值控制,这个returnNum可以无限制增加。
3. int receCount = 0,改成这个,收到负值所有的条件都确认不处理么?
4. If {} else if() {} else ...希望能有个闭环。
这里顺带说一句,发现大部分的嵌入式工程师背景一般是电子和自动化的背景,软件方面还是需要多考虑和规范。否则做出来的东西就是个玩具。

出590入992汤圆

 楼主| 发表于 2020-7-5 21:01:35 | 显示全部楼层
LL00 发表于 2020-7-4 15:53
随便猜一下,会不会是8位数据类型导致溢出了,然后看门狗得不到喂,所以复位了。
要清掉编译信息可以在KEIL ...

不会,我的代码溢出了也没有事。
里面没有看门狗的。

你怎么看出来我用的五笔?我没有找到错别字啊

出0入4汤圆

发表于 2020-7-5 21:55:21 | 显示全部楼层
SUPER_CRJ 发表于 2020-7-5 21:01
不会,我的代码溢出了也没有事。
里面没有看门狗的。

那就是我瞎猜的不准
“正在写一个USB和程序” 应该是 “的程序” 吧,误按到T字母上去了

出0入0汤圆

发表于 2020-7-5 22:16:10 来自手机 | 显示全部楼层
对齐问题?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 14:41

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表