Цитата(rezident @ Feb 3 2009, 01:41)

Код
unsigned int tmp1, tmp2;
do
{ tmp1=msCounter;
tmp2=msCounter;
} while(tmp1!=tmp2);
if (tmp2 >= 1000)
{
...
}
А вот с обнулением сложнее.

Это вообще неправильный подход к программированию когда volatile-переменная с неатомарным доступом модифицируется сразу в нескольких частях программы. Либо используйте дублирование этой переменной с семафором доступа, либо используйте семафор для ее обнуления. Вообще это так принципиально ее в майне обнулять?
Как-то уж очень геморно. Интеррапты запрещать как-то читабельней. Хотя, тоже фигня...
А если не в майне обнулять, то где? Для того, чтобы ошибки не было нужно только там же, где приращение происходит, т.е. в прерывании. A volatile - это в данном случае и не обязательно как я понимаю. volatile ведь нужно применять для переменных, которые могут быть изменены аппаратно. А тут только софтово, просто в прерывании.
Я тему открыл потому, что ситуация эта неправильная какая-то. Я считаю, что компилятор должен об этом заботиться, а он игнорирует и заставляет юзера принимать доп.меры. Вот я и пытаюсь узнать как заставить компилятор правильно компилировать.
...Дело в том, что таких ситуаций немеренно, когда в функциях происходят сравнения данных, которые могут быть изменены в прерывании. Это ж повсеместно!! И что?? Перед каждым if, case, while, for... запрещать прерывание, чтобы переменная правильно сравнивалась??????....... Ну не гемор разве?...
PS. zltigo тему быстренько перенес в ветку для ламеров, а сам как всегда определенного ответа дать не смог. Сколько помню его, все ходит вокруг да около и мало кому реально помогает. Я уж и сомневаюсь что он профессионал.