求助关于STC32F死机重启的问题]已解决
本帖最后由 STCAI-32位8051 于 2024-4-18 14:01 编辑如题所示,最近我在做一个低功耗的小项目,频繁进入掉电模式,最多一秒会掉电唤醒60次左右。单片机为STC32F12K54,主频52M,电压2.8V,WTST = 2,随着代码量的增加,目前出现了一个只要增删代码,下载到单片机,单片机就会一直重启的问题
目前data=8.3 edata+hdata=1329 xdata=2185 const=3265 code=33094 应该也没超限
已经排除过数组越界,电压不稳等因素,尝试加压和降频无改善,由于是经常休眠也不好接仿真
同样的代码可以在32G上能跑起来,证明代码应该是没问题的,代码不方便发
目前这个问题非常神奇,可能和也keil的编译有关,目前测试增加新代码或者删除部分代码,编译生成新的hex文件以后下载到单片机,可能会出现单片机一直重启的情况,而且针对这个新的hex文件,重启显现为100%必现
关键的来了,这个时候,我只要在代码任意一个位置,加上nop、i++、delay这种无关紧要的指令,使得新生成的hex文件大小变化1~4,那这hex文件变化的1~4中,必有一个大小的hex文件是可以稳定运行的!!
已经尝试过用不同版本的keil5编译同一份工程文件,编译生成的hex文件由于编译的优化机制不同,大小也有区别,也会导致一个可以执行,一个不能执行
目前的的程序开头保留4个nop指令,只要编译出来的hex有问题,就通过变更注释nop指令的多少改变hex的大小从而使得代码正常运行,但这样也不是长久之计,故来咨询一下万能的网友,是否对此问题有所了解
下图为工程的设置,应该也没什么问题
项目设置里面“L251 Misc”标签里,有没有用到“REMOVEUNUSED”?有的话把它删掉试试。 楼主看看代码不开优化有没有问题? 乘风飞扬 发表于 2024-1-5 13:57
项目设置里面“L251 Misc”标签里,有没有用到“REMOVEUNUSED”?有的话把它删掉试试。 ...
你好,我这边实测,结果重启现象还会出现,但现在我发现一个更有意思的事情,就是我生成文件 大小满足 (code大小) % 4 = 1的时候,代码必定正常运行, (code大小) % 4 = 2的时候必重启,满足 (code大小) % 4 = 0的时候运行必卡顿,太玄学了{:4_167:} 社区闲人 发表于 2024-1-5 14:43
楼主看看代码不开优化有没有问题?
你好,我这边实测,重启现象和开不开优化并无多大关系,{:4_184:}但现在我发现一个更有意思的事情,就是我生成文件 大小满足 (code大小) % 4 = 1的时候,代码必定正常运行, (code大小) % 4 = 2的时候必重启,满足 (code大小) % 4 = 0的时候运行必卡顿{:4_167:} 通过你的描述,应该是你的代码使用了大量的指针运算和结构体,以及字节对齐等等,估计还是代码的问题,需要耐心排查。 御坂美琴我老婆 发表于 2024-1-5 21:38
你好,我这边实测,结果重启现象还会出现,但现在我发现一个更有意思的事情,就是我生成文件 大小满足 ...
会不会是指令缓存技术方面的BUG,可以把主频降为24MHz,WTST = 0试试,或者主频52MHz,WTST = 1试试 【单片机为STC32F12K54,主频52M,电压2.8V,WTST = 2】 这个 可以
社区闲人 发表于 2024-1-5 21:59
通过你的描述,应该是你的代码使用了大量的指针运算和结构体,以及字节对齐等等,估计还是代码的问题,需要 ...
我觉得你说的很有可能,我是驱动OLED所有存了很多点阵数组,然后调用的时候是通过指针调用的,结构体倒是没有用,字节对齐我之前也往这个方向想过,但我查了一些资料,字节对齐好像是结构体才会有的问题,所以后面也没往这个方向上靠,可以请教一下指针啥的和字节对齐有联系吗 神农鼎 发表于 2024-1-5 22:28
【单片机为STC32F12K54,主频52M,电压2.8V,WTST = 2】 这个 可以
嗯嗯,我觉得也和硬件应该关系不大