STC32F定时器延时问题
最近调试32F程序,发现一个难以理解的问题,不知道群里有没有人经历过,是根本解决了还是绕道走了。就是定时器计数(定时器节拍为100ms),计数到给定数值后跳出,32F的执行结果是程序死掉了,经测试,定时器运行正常,但不是所有的地方都死掉,写入程序后在固定的某一段延时程序死掉,开始有一处死掉,后来绕道走了,但后来编写程序又有一段也是死掉,尽管也可以绕道过去,但想知道个究竟,经过反复测试没有头绪,今天放到群里,看看有没有类似经历的朋友。此延时方式在以前的15F好8G上没有发生过。第一次发现的程序如下,void LoadWeight(word bWork)
{
if(gsPar.bpRam == 1)return;
if(bWork == 1)MoveDw();
else
MoveUp();
gwTimer = 0;
while(gwTimer <= 20);
MoveStop();
// if(gsPar.bpRam == 1)return;
// if(bWork == 1)
// {
// MoveDw();
// gwTimer = 0;
// while(gwTimer <= 20);
// MoveStop();
// }
// else
// {
// MoveUp();
// gwTimer = 0;
// while(gwTimer <= 20);
// MoveStop();
// }
}
没有屏蔽的段落,在15F,8G上正常,但在32F上会跑死,本段落屏蔽后,启用下边屏蔽的就会通过。经过多次测试,本段落的while(gwTimer <= 20);调整为:while(gwTimer <= 20)_nop_();后正常。
还有一段是:
gwTimer = 0;
while(gwTimer <= 2)_nop_();
Display(ERRP,0);
gwTimer = 0;
while(gwTimer <= 20)_nop_();
上述正常,但while(gwTimer <= 2)_nop_();改为while(gwTimer <= 2);便会跑死,下边的显示程序不在执行。
项目程序还有许多 gwTimer = 0;
while(gwTimer <= x);方式,目前发现上述两处需要绕道解决。
不知道群里朋友有没有经历,或者谁知道问题所在,望指点,谢谢!
按照你说的方法写了一个测试程序,没能复现问题,用附件例程试试看。 乘风飞扬 发表于 2024-1-12 14:19
按照你说的方法写了一个测试程序,没能复现问题,用附件例程试试看。
谢谢,单独测试测试不出来,以前的8位机一直着这么用的。程序是原来的移植过来的。但在32F上出问题,而且不是全部,仅仅是个别的地方,目前全部改成while(gwTimer <= 20)_nop_();了,加个空指令。功能性的执行全部通过了。但还有新的问题,就是整个程序运行,不知道什么时候会死机。目前正在查找原因。调试上述bug时,死机的时候,在定时器里调试 SBUF = gwTimer;通过串口看到数据正常。我怀疑程序跑飞了,什么原因促成的,目前还不知道。之前的是某一程序段,固定语句跑飞,换种方式解决了,但是整体运行程序在一个未知时间点跑飞,目前正在记录运行时间测试,看看是否是固定时间点触发了什么。 乘风飞扬 发表于 2024-1-12 14:19
按照你说的方法写了一个测试程序,没能复现问题,用附件例程试试看。
比如上述屏蔽段,和非屏蔽段,作用是一样的,但是非屏蔽段不能正常运行,换一种方式改为屏蔽段的编写方式,就正常运行,没有理由可讲。 乘风飞扬 发表于 2024-1-12 14:19
按照你说的方法写了一个测试程序,没能复现问题,用附件例程试试看。
刚刚试了ICacheOn()功能,通电后依然死在了void LoadWeight(word bWork)的while(gwTimer <= 20);里边 ,更改为while(gwTimer <= 20)_nop_();后通过了。预计这个原因找不到,还会出现其他问题,比如程序整体运行后的未知死机现象,非常像程序跑飞了,明天我在循环里边喂狗试试。程序工作后,自己退出到待机状态就证明确实程序跑飞了。实验结果我发到这里。 mengxuan1303 发表于 2024-1-12 16:17
刚刚试了ICacheOn()功能,通电后依然死在了void LoadWeight(word bWork)的while(gwTimer...
能否提供一个简单的,能够复现问题的项目进行分析? 乘风飞扬 发表于 2024-1-12 16:22
能否提供一个简单的,能够复现问题的项目进行分析?
怀疑程序停在了某一个时间点,还确实是。昨天下班后保留机器程序正常运转,显示信息换成计时信息,在90分钟的一个时间点上,有一句判断执行虚拟按键的程序,在判断语句上停止了,早晨来时看到时间停留在7200s上(上电从5400开始)。
if(giDifF >= 500 || gdwTime >= gdwInterval)SetKey(KEY_cal);
gdwTime 记录到7199停止。虚拟按键程序里边就是更改两个变量的状态,没有循环语句。
先试着绕道解决这个问题,有时间的话我把项目程序的外设虚拟或删掉,技术核心部分虚拟或删掉,仅留串口做测试分析,如果还能遇到上述问题,我发文在此供大家研究。 STC32F12K54 LQFP48 UART2 我的配置不太成功(基本都是误码), 我使用的自己的板子, 和追风剑开发板
请问谁有一个成功的例子?
页:
[1]