Периодичность выполнения

Lictor
Offline
Зарегистрирован: 01.10.2015

Доброго дня

Небольшой вопрос, когда мне нужно что бы что-то выполнялось, допустим, раз в секунду я писал такое:

if (currentMillis - previousMillis > 1000) {
        previousMillis = currentMillis;
//некий код
}

В сети нашел такой вариант:

if(millis()%1000==0) {
//некий код
}

Второй код мне конечно же понравился больше: там нет двух переменных занимающих много места. НО! не получится ли, что второй код будет выполняться через раз, а то и реже? Если контроллер будет чем либо занят и не обработает эту строку вовремя?

Клапауций 232
Offline
Зарегистрирован: 05.04.2016
MagicianT
Offline
Зарегистрирован: 03.10.2015

Oooops.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Мало того! Определенные значения (каждую 43 мсек) millis() банально "проскакивает", поэтому % - ну никак не подходит. :)

Lictor
Offline
Зарегистрирован: 01.10.2015

 

Все давно придумано до нас. Благодарю.

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

Lictor пишет:

 

Все давно придумано до нас. Благодарю.

внимательно там

27 unsigned long current  =  micros();                      tick = 0;
28 // unsigned long current  =  millis();                      tick = 0;

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Lictor пишет:

В сети нашел такой вариант:

if(millis()%1000==0) {
//некий код
}

Второй код мне конечно же понравился больше: там нет двух переменных занимающих много места. НО! не получится ли, что второй код будет выполняться через раз, а то и реже? Если контроллер будет чем либо занят и не обработает эту строку вовремя?

1. А Вы поинтересуйтесь сколько и каких ресурсов занимает операция %

2. Получится.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Lictor пишет:

if (currentMillis - previousMillis > 1000) {
        previousMillis = currentMillis;
//некий код
}

Если Вам нужно, чтобы код исполнялся "раз в секунду", а не "не более одного раза в секунду", то следует писать:

if (currentMillis - previousMillis > 1000) {
        previousMillis += 1000;
//некий код
}