вы этой функцией получаете текущее значение секунд и миллисекунд
делаете это не выключая прерывания.
у вас между строчкой где вы сохраняете секунды и строчкой где вы сохраняете миллисекунды может произойти прерывание, и все испортить
к примеру у вас 1 секунда и 999 мсек
вы сохраняете значение 1 секунда
-------------
происходит прерывание
1сек становиться 2
999 мсек - становится 0 м сек
вы возвращаетесь обратно
-------------
сохраняете миллисекунды 0
и вместо 2 сек 0 мсек имеете
1 сек (ее вы сохранили до прерывания) и 0 мсек (вы их сохранили после), то есть на 1 секунду меньше
с этой же функцией если будет перекрут миллисекунд который вы пропустили, то сработает условие и число секунд увеличится...
Цитата(GetSmart @ Jan 5 2014, 17:51)

ИМХО по поводу функции bsp_get_sys_uptime лучше бы читать только три первых переменных и если секунды отличаются, то миллисекунды обнулять. Возвращать ессно последние прочитанные секунды.
Не поможет
если любая переменная читается не за 1 команду и изменяется в прерывании, то для работы с ней ОБЯЗАТЕЛЬНО надо запрещать прерывание или быть готовым к получению некорректных данных. Потому что во время ее чтения она может быть изменена, и часть переменной будет новой, а часть старой.
тут фактически это и есть, переменная состоит из 2 частей секунду и миллисекунды. Считать ее за 1 такт нет возможности, это 2 значения. Эта переменная меняется в прерывании, значит надо либо его запретить, либо быть готовым что пока вы читаете переменную она может измениться, и часть переменной будет старая, а часть новая.
Автор запрещать прерывание не стал, (не понятно почему, ведь ничего не теряется, все отработается через 1, 2 такта, возможно есть еще и другие прерывание более критичные чем от системного таймера), поэтому придумал как поправить некорректные данные.
Можно было считать параметры 3 раза, и выбрать пару совпадающих. При повреждении 1 совпали 2 и 3, при повреждении 3 совпали бы 1 и 2, при повреждении 2, все были бы разными, во всех 3 случаях есть верная не поврежденная переменная...
при изменении между переменными, опять же были бы совпадения 1 со 2 или 2 с 3.