主板芯片为stm32f4系列,由于换了OLED,所有相关程序重写。
主要程序写好,下载到MCU里运行也正常,但在调试时发现不定时复位。
1 查看任务延时,基本没问题。
2 仔细检查数组边界及数据类型问题,也没发现有问题。
3 把看门狗屏蔽,在线调试运行后发现程序死在显示任务中。
即RTX任务调试窗口显示显示任务一直运行,下一个任务一直等待。
为了进一步缩小错误范围,在显示任务中建立7个u32全局变量
static uint32_t DRCORDNUM0=0,
DRCORDNUM1=0,
DRCORDNUM2=0,
DRCORDNUM3=0,
DRCORDNUM4=0,
DRCORDNUM5=0,
DRCORDNUM6=0;
在被测试任务程序中插入:
if(DRCORDNUM0>=10000000)DRCORDNUM0=0;
else DRCORDNUM0++;
if(DRCORDNUM1>=10000000)DRCORDNUM1=0;
else DRCORDNUM1++;
if(DRCORDNUM2>=10000000)DRCORDNUM2=0;
else DRCORDNUM2++;
if(DRCORDNUM3>=10000000)DRCORDNUM3=0;
else DRCORDNUM3++;
...............................................................................
if(DRCORDNUM6>=10000000)DRCORDNUM=0;
else DRCORDNUM6++;
观察停止时各个变量数据,可以判断有问题语句大致位置。
最后查到程序基本死在此处:
while((SPI4->SR&SPI_SR_RXNE)==0){}; 由于输出控制LED为单输出,所以没有输入。
这段语句很容易出问题。
改为:while(SPI4->SR&SPI_SR_BSY);
现在已经运行45分钟了,没停。希望没事。
顺便感谢 https://www.amobbs.com/thread-5614282-1-1.html