產生上述問題的主要原因是當我們修改心跳時間後系統會調用OnHeartbeatProducerUpdate
這個函數去更新NextTime
的值,下面看看定時器中的處理:
這是一個1ms的定時器
//定時器3中斷服務函數
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET) //溢出中斷
{
TimeCNT++;
if (TimeCNT >= TIMER_MAX_COUNT)
{
TimeCNT=0;
}
if (TimeCNT == NextTime)
{
last_time_set = TimeCNT;
TimeDispatch(); //定時時間到,執行時間相關的分發任務
}
}
TIM_ClearITPendingBit(TIM3,TIM_IT_Update); //清除中斷標誌位
}
當我們修改了NextTime
的值後會造成TimeCNT
的值大於NextTime
的值,所以TimeCNT
就會一直自加,直到大於TIMER_MAX_COUNT
清零後纔會自動發送心跳包。
解決方法就是在OnHeartbeatProducerUpdate
這個函數中處理一下,加上這麼一句:
if(NextTime>10)
TimeCNT=NextTime-10;
else
TimeCNT=0;