本帖最后由 shipeng 于 2018-8-18 09:43 编辑
遇到一个奇怪的bug,非要设置断点监视单片机运行才能正常执行,全速运行后似乎单片机会自动跳过某一行,请教高人:
芯片用的是STM32F429
void TimeRefresh(void)
{
static u16 time_reg=0xFFFF;
u16 buf16=CUS_RTCTimeGet()>>8;
if (buf16!=time_reg)
{
time_reg = buf16;
DispTime();
}
}
以上是一个显示时间刷新函数,现在有个问题时间老是停住不被刷新,仿真后在if里面“time_reg = buf16;”行设置断点发现程序根本不会进入if里面运行,但是如果在“u16 buf16=CUS_RTCTimeGet()>>8;”行设置断点后又能进入if条件从而成功刷新时间不知道做何解,可能有人会怀疑是CUS_RTCTimeGet()函数调用太频繁导致,特别说明一下此问题函数我是1秒才调用1次的。另外我再附上CUS_RTCTimeGet()函数:
u32 CUS_RTCTimeGet(void)
{
u32 buf32;
RTC_TimeTypeDef RTC_TimeStruct;
HAL_RTC_GetTime(&hrtc,&RTC_TimeStruct,RTC_FORMAT_BCD);
buf32=(RTC_TimeStruct.Hours<<16)|(RTC_TimeStruct.Minutes<<8)|RTC_TimeStruct.Seconds;
return buf32;
}
此帖出自
小平头技术问答
加了volatile问题还是没有解决(对于临时变量默认都是volatile,没有必要加),不到万不得已不想修改优化等级,关键貌似和优化等级没有关联,因为在“u16 buf16=CUS_RTCTimeGet()>>8;”行设置断点后就能正常刷新时间,未设置该行断点时查看buf16值发现为上次函数调用值。
貌似非要在关键位置设置断点监视单片机运行才能正常刷新时间,全速运行后他就会偷懒跳过“u16 buf16=CUS_RTCTimeGet()>>8;”行运行,真是个贱骨头
一周热门 更多>