Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
if (TmpH!=High) TmpL= ReadReg(TimerCounter);… а таймер будет достаточно скоростным — имеем реальный риск всё же неверно считать данные.
if (TmpH!=High) TmpL= ReadReg(TimerCounter);
unsigned long int GetTimer(void) {
unsigned long TmpHFirst,TmpH,TmpL;
TmpHFirst=High;
TmpL= ReadReg(TimerCounter);
if (TmpHFirst!=(TmpH=High)) {
//Вот тут произошло прерывание, изменилось значение High, а вы уже считали старое.
TmpL= ReadReg(TimerCounter); // Считываете значение соответствующее новому значению High.
}
return (TmpH<<sizeof(int))+TmpL;
}Алгоритм с циклом может выполняться значительное время, что Джек и указал.
unsigned long int GetTimer(void) {
return (High<<sizeof(int))+0;
}unsigned long int GetTimer(void) {
return (High<<sizeof(int))+0;
}TmpH=High; // = 10
TmpL= ReadReg(TimerCounter); // = 999
// тут случилось прерывание и High заинкрементилось
if (TmpH!=High) TmpL= ReadReg(TimerCounter); // TmpL = 001
return (TmpH<<sizeof(int))+TmpL; // Вернули 10.001
TmpWait=GetTimer()+SomeDelay;
while (TmpWait > GetTimer()); /* первая строка */
while ((TmpWait — GetTimer()) > 0); /*вторая строка */
prevTime = GetTime();
while( GetTime() - prevTime < delay );
unsigned long int GetTimer(void) {
unsigned long TmpH,TmpL;
TmpH=High;
TmpL= ReadReg(TimerCounter);
if ( TmpH != High || TmpH++ != High ) exit(error);
return (TmpH<<sizeof(int))+TmpL;
}unsigned long int GetTimer(void) {
unsigned long TmpH,TmpL;
TmpH=High;
TmpL=ReadReg(TimerCounter);
if ( TmpH+1 == High ) TmpL=ReadReg(TimerCounter);
if ( TmpH != High || TmpH++ != High ) exit(error);
return (TmpH<<sizeof(int))+TmpL;
}unsigned long int GetTimer(void) {
return (High<<sizeof(int))+0;
// Или просто
return High;
}unsigned long int GetTimer(void) {
DisableInt();
unsigned long TmpH=High;
if (TimerOvBit()) TmpH++; //Это условие не сработало здесь.
//А Здесь происходит переполнение и следующей строкой "ReadReg", вместо значения близкого к максимуму, считает близкое к нулю.
TmpH=(TmpH<<sizeof(int))+ ReadReg(TimerCounter);
EnableInt();
return Tmp;
}unsigned long int GetTimer(void) { unsigned long TmpH,TmpL; do { TmpH=High; TmpL= ReadReg(TimerCounter); while (TmpH!=High); return (TmpH<<sizeof(int))+TmpL; }
if (TmpH!=(TmpH=High)) TmpL= ReadReg(TimerCounter);
— это неопределенное поведение. В условии одна и та же переменная читается и модифицируется.unsigned long TmpWait;
TmpWait=GetTimer()+SomeDelay;
while (TmpWait > GetTimer()) ; /* первая строка */
while ((TmpWait - GetTimer()) > 0) ; /*вторая строка */
}
unsigned long TmpWait;
TmpWait=GetTimer()+SomeDelay;
while ((GetTimer()+SomeDelay)>TmpWait) ; /* первая строка */
while ((TmpWait - GetTimer() - SomeDelay) > 0) ; /*вторая строка */
}
К вопросу о таймерах в ОСРВ