Помогите поменять delay на millis

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Такого гоунокода давно тут не постили.
Неоспоримые моменты конечно есть.
Перечислю.
Это заявка на оригинальность , нерабочесть и дурость автора.

Поясню:
Вот смотри
Вначале цикла обновляет таймер.
Первые 300мс диод не горит.
Это действие 1

Следующие 800мс диод не горит, по истечении загорается
Это было действие 2

Горит он 300мс и гаснет
Действие 3

Диод зажигается (действие 4) и сразу тухнет, начало следующего цикла.

Итого диод горит 300мс и ещё пару тактов.

Задача не выполнена, код кривой и слабочитаемый.
Садись двойка

b707
Offline
Зарегистрирован: 26.05.2017

Кактус, не совсем прав. Это код, где 1 диод горит 800мс и не горит 300 мс. Он состоит из двух абслолютно одинаковых частей, одну из которых можно безболененно выкинуть (это к слову об "эффективности" :)

 while(1)
    {
unsigned long current_time = millis();
    //действие1;

//  delay(500);
while(millis()-current_time<300) {};
digitalWrite(13,LOW);

current_time = millis();
    //действие2;

//  delay(500);
while(millis()-current_time<800) {};
digitalWrite(13,HIGH);
    }

сократив код ровно вдвое :)

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Как этот код должен примерно выглядеть:

uint32_t timer1, timer2;

int main(void){
pinMode(13,1);
pinMode(12,1);
while(1){

if(millis()-timer1>=300){
timer1=millis ();
digitalWrite(13,!digitalRead(13));}

if(millis()-timer2>=800){
timer2=millis();
digitalWrite(13,!digitalRead(12));}

}

 

b707
Offline
Зарегистрирован: 26.05.2017

Kakmyc пишет:

Как этот код должен примерно выглядеть:

Кактус, вот нафига подсказывать? - у меня нет сомнений. что вы это можете :) - цель была привести ник Вавгат к пониманию, что он не разбирается в сути миллис.

А теперь он напишет, что "что-то такое имел в виду... " Вспомните Великого - чтобы не признавать свой промах. подобные люди идут на любое вранье.

WavGat
Offline
Зарегистрирован: 14.04.2020

Действительно невнимательный. Только вот Вы изначально ставите такие условия, при которых мой вариант будет выглядеть как быдлокод. При таких условиях конечно же алгоритм нужно менять, но не беда, попробуем набыдлокодить и так.

Задача: использовать мой код и Ваше условие (2 светодиода), а также условие автора (действие 1, 500 мс, действие 2, 500 мс, действие 3, 500 мс, действие 4, 500 мс).

Решение возможно, только если действие 1, 2, 3 и 4 длятся менее 100 мс, а ведь мы этого наверняка не знаем. Нам понадобятся доп. переменные.

unsigned long current_time_for_led1 = millis();
unsigned long current_time_for_led2 = millis();
unsigned long current_time = millis();
unsigned long new_time;
bool led1;
bool led2;

void setup() {
// Пропущу начальную часть

  while(1)
  {
	     //действие1;
	 
	 //  delay(500);
	 new_time=millis();
	 while(new_time-current_time<500) {
           new_time = millis();
           testLed1();
           testLed2();
         };
	 
	     //действие2;
	 
	 //  delay(500);
	 new_time=millis();
	 while(new_time-current_time<500) {
           new_time = millis();
           testLed1();
           testLed2();
         };
	 
	     //действие3;

	 //  delay(500);
	 new_time=millis();
	 while(new_time-current_time<500) {
           new_time = millis();
           testLed1();
           testLed2();
         };

	     //действие4;

	 //  delay(500);
	 new_time=millis();
	 while(new_time-current_time<500) {
           new_time = millis();
           testLed1();
           testLed2();
         };
  }
}
void testLed1() {
  if(new_time-current_time_for_led1>300) {
    if(led1) {
        digitalWrite(13,LOW);
        led1 = false;
      } else {
        digitalWrite(13,HIGH);
        led1 = true;
    };
   new_time_for_led1 = current_time;
  };
};

void testLed2() {
  if(new_time-current_time_for_led1>800) {
    if(led2) {
        digitalWrite(12,LOW);
        led2 = false;
      } else {
        digitalWrite(12,HIGH);
        led2 = true;
    };
   new_time_for_led2 = current_time;
  };
};

 

b707
Offline
Зарегистрирован: 26.05.2017

Кактус. я же говорил? - чудо просто скопировало ваше решение, а чтобы это не было так заметно - вставило его внутрь своего быдлокода про 4 задачи по 500 мс

 

WavGat
Offline
Зарегистрирован: 14.04.2020

b707 пишет:

Kakmyc пишет:

Как этот код должен примерно выглядеть:

Кактус, вот нафига подсказывать? - у меня нет сомнений. что вы это можете :) - цель была привести ник Вавгат к пониманию, что он не разбирается в сути миллис.

А теперь он напишет, что "что-то такое имел в виду... " Вспомните Великого - чтобы не признавать свой промах. подобные люди идут на любое вранье.

Вы меня не знаете, а уже судите обо мне. Я всегда стараюсь говорить правду, вместо того, чтобы врать. Может я в чём-то не разбираюсь - это да. Только вот кричать "это всё фигня, так никто не делает" может любой. А подсказать где и в чём ошибка... Пусть сам ищет и придумывает.

WavGat
Offline
Зарегистрирован: 14.04.2020

b707 пишет:

Кактус. я же говорил? - чудо просто скопировало ваше решение, а чтобы это не было так заметно - вставило его внутрь своего быдлокода про 4 задачи по 500 мс

 

 

И в каком месте я его скопировал?

b707
Offline
Зарегистрирован: 26.05.2017

WavGat пишет:

Только вот Вы изначально ставите такие условия, при которых мой вариант будет выглядеть как быдлокод.

вы абсолютно правы. Я намеренно выбрал такие условия, чтобы доказать вам. что ваш вариант - это быдлокод . Доказать именно вам, потому абсолютно всем остальным в этой ветке это и так ясно.

И в итоге в вашем последнем решении, кроме полностью спиз... ого кода Кактуса - вы опять не смогли продемонстрировать, как код с циклами while обеспечит вам независмое мигание двух диодов.

 

(за быдлокод прошу прощения :) - но это слово для своего "творчества" вы выбрали сами.

b707
Offline
Зарегистрирован: 26.05.2017

WavGat пишет:

И в каком месте я его скопировал?

в процедурах testled1 testled2

Кроме того, в этих процедурах нет вашего кода через while - так что это не решение, а читерство

Duino A.R.
Offline
Зарегистрирован: 25.05.2015

pioli пишет:

Да. Вы всё правильно поняли. Это то что нужно, как бы странно это кому ни казалось. Спасибо. Вопрос решен)

Я как это прочитал... Это ж просто ДЗ по информатике. Сказал препод:"Заменить delay() на millis()". Ну на тебе - заменили. Всё. Какие там "блокирующие"/"не блокирующие"... Я вас умоляю. Пиво на самоизоляции по интернету с доставкой заказал - полдня ждешь, да ещё за деньги. А ДЗ по интернету с доставкой заказал - меньше двух часов и бесплатно. А ещё и срач эпический - бонусом. Всё можно от игрушек или порнухи отвлечься. Разнообразие. :))

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ТС, на.  4 функции вызываются друг за другом с интервалом в секунду, потом останавливаются.  При этом loop() вообще не при делах, пишы туда что хочешь, хоть delay(100500) на вызов функций это не отразица.   Захочешь узнать как эта магия работает - спроси меня как. 

/*
    Name:       Blink.ino
    Created:	15.04.2020 15:43:04
    Author:     DetSimen
*/
#include <Arduino.h>
#include <TimerList.h>

extern TTimerList TimerList;

const uint32_t DELAY_TIME = 1000;

void tmrTimerEnd(void);    // пратотипчики. :) 

void Doing0(void); 
void Doing1(void);
void Doing2(void);
void Doing3(void);

pvfCallback DoingList[] = { Doing0, Doing1, Doing2, Doing3 };
const uint8_t DOING_LIST_COUNT = sizeof(DoingList) / sizeof(pvfCallback);

volatile uint8_t CurrentDoing = 0;


THandle hTimer = TimerList.Add(DELAY_TIME, tmrTimerEnd, TIMER_STOPPED);

uint32_t FirstRunningTime = 0;

void StartDoing(void) {
    FirstRunningTime = millis();
    CurrentDoing = 0;
    DoingList[CurrentDoing]();
    TimerList.Reset(hTimer);
}

void tmrTimerEnd(void) {
    CurrentDoing++;
    if (CurrentDoing > (DOING_LIST_COUNT - 1))
        TimerList.Stop(hTimer);
    else {
        DoingList[CurrentDoing]();
        TimerList.Reset(hTimer);
    }
}

void Doing0(void) {
    Serial.print("Do something 0, ms = ");
    Serial.println(millis() - FirstRunningTime);
}

void Doing1(void) {
    Serial.print("Do something 1, ms = ");
    Serial.println(millis() - FirstRunningTime);
}

void Doing2(void) {
    Serial.print("Do something 2, ms = ");
    Serial.println(millis() - FirstRunningTime);
}

void Doing3(void) {
    Serial.print("Do something 3, ms = ");
    Serial.println(millis() - FirstRunningTime);
}



void setup()
{
	Serial.begin(115200);
	delay(250);

    StartDoing();
}

void loop()
{
}

Timerlist возьмешь там  https://github.com/DetSimen/Arduino_TimerList

Вывод в порт:

 

pioli
Offline
Зарегистрирован: 14.04.2020

DetSimen пишет:

Хера се. Мощно. Этот как проехать 10 метров на формуле-1 вместо то, чтобы пройти пешком). Спасибо схоронил на будущее:)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

pioli пишет:

DetSimen пишет:

Хера се. Мощно. Этот как проехать 10 метров на формуле-1 вместо то, чтобы пройти пешком). Спасибо схоронил на будущее:)

а я то всё ждал, когда Дед со своей библиотекой нарисуется, дождались )))

А человек далёкий от программирования завёл бы четыре переменных на значения задержек, четыре булевых под флаг необходимости отработки конкретного таймера и всех делов и, никаких блокирующих задержек

WavGat
Offline
Зарегистрирован: 14.04.2020

А тем временем у микроконтроллера своё мнение:

unsigned long TestTime;

void setup() {
  Serial.begin(115200);
  Serial.println("Start");

  TestTime=micros();
  test1();
  Serial.println(micros()-TestTime);
  
  TestTime=micros();
  test2();
  Serial.println(micros()-TestTime);

  TestTime=micros();
  test3();
  Serial.println(micros()-TestTime);

  Serial.println("End");
}

void test1() {
  int i = 0;
  while(i<100) {
    do1();
    delay(500);
    do2();
    delay(500);
    do3();
    delay(500);
    do4();
    delay(500);
    i++;
  };
};

void test2() {
  int i = 0;
  unsigned long current_time = millis();
  while(i<100) {
  cycle:
    do1();
    current_time = millis();
    while(millis()-current_time<500) {};
    do2();
    current_time = millis();
    while(millis()-current_time<500) {};
    do3();
    current_time = millis();
    while(millis()-current_time<500) {};
    do4();
    current_time = millis();
    while(millis()-current_time<500) {};
    i++;
  };
};

void test3() {
  int i = 0;
  int operation_num=0;
  unsigned long timer = millis();
  while(i<100) {
    if(millis()-timer>500){
     switch(operation_num){
         case 0:
           do1();
            break;
         case 1:
           do2();
            break;
         case 2:
           do3();
            break;
         case 3:
           do4();
            break;
     }
     timer=millis();
     operation_num++;
     if(operation_num>3) {
      operation_num=0;
      i++;
     }
    }
  };
};

void loop() {
}

void do1 () {
  digitalWrite(13,HIGH);
};

void do2 () {
  digitalWrite(13,LOW);
};

void do3 () {
  digitalWrite(13,HIGH);
};

void do4 () {
  digitalWrite(13,LOW);
};

Из результата

Start
200003172
200001132
200411108
End

вроде как даже delay не "грузит" так ядро, как "продвинутый код".

b707
Offline
Зарегистрирован: 26.05.2017

WavGat пишет:

А тем временем у микроконтроллера своё мнение:

это не у микроконтроллера....

 

 

Впрочем, коллеги, я пас. Такой упертости можно только позавидовать :)

Если хотите - обьясняйте ему сами или просто заблочте нафик.... хотя нет, если заблочить, он будет чувствовать себя несправедливо обиженным героем... :)

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Плоскоголовый, ты прежде чем такие тесты писать с кодом разберись.
Ты нахера все переменные сбрасываешь в одном месте ?

Слабо при входе в функцию сбросить, при выходе из нее значение запомнить, а после всех функций вывести результаты ?

b707
Offline
Зарегистрирован: 26.05.2017

насчет секунд свое замечание снимаю, сам слепой. множитель 100 не увидел.

 

А насчет самого сравнения - оно бессмысленно, потому что варианты кода делают разные действия.

Вавгат, когда вы наконец поймете, что код садмана и кактуса лучше не потому, что он "быстрее" или "эффективнее", а потому что он выполняет свою задачу. а ваш нет.

WavGat
Offline
Зарегистрирован: 14.04.2020

(200003172 / 4 ) / 100 циклов. = 500007,93 что примерно равно 500 мс. Что не так? Не верите, проверьте и выложите свой результат. Полный скетч я прикрепил.

WavGat
Offline
Зарегистрирован: 14.04.2020

Kakmyc пишет:
Плоскоголовый, ты прежде чем такие тесты писать с кодом разберись. Ты нахера все переменные сбрасываешь в одном месте ? Слабо при входе в функцию сбросить, при выходе из нее значение запомнить, а после всех функций вывести результаты ?

Думаете это сильно повлияет на результат? Проведите свой тест. Я уже понял, что кричать с места вы тут горазд, а как правильно - сами не знаете.

b707
Offline
Зарегистрирован: 26.05.2017

WavGat пишет:

(200003172 / 4 ) / 100 циклов. = 500007,93 что примерно равно 500 мс. Что не так? Не верите, проверьте и выложите свой результат. Полный скетч я прикрепил.

все верно. В отличии от вас я умею признавать ошибки. Множитель 100 не заметил.

А ответ по существу читайте выше. вы сравниваете скорость вашего НЕ_РАБОЧЕГО кода с двумя рабочими. даже если ваш и быстрее - зачем он нужен, если не работает?

WavGat
Offline
Зарегистрирован: 14.04.2020

Так объясните почему он не рабочий? У меня на столе прекрасно работал, причём проверял по три раза и с 10 циклами и с 50-ю и со 100. И даже порядок тестов пробовал менять, но так и не понял чем мой вариант в конкретно данной задаче (а не в любой другой гипотетической), хуже?

Может я чего-то не понимаю? Почему мой код "НЕРАБОЧИЙ"? Только пожалуйста без унижений и оскорблений.

b707
Offline
Зарегистрирован: 26.05.2017

WavGat пишет:

Может я чего-то не понимаю? Почему мой код "НЕРАБОЧИЙ"? Только пожалуйста без унижений и оскорблений.

не понимаете, очевидно.

перечитайте еще раз ветку. я отвечал на этот вопрос несколько раз. И не только я. Оскорбления можно не читать.

WavGat
Offline
Зарегистрирован: 14.04.2020

Задача любого учителя (а Вы здесь выступаете в роли учителя), не дать готовый результат, а показать в каком направлении двигаться. Разве нет?

Я дал человеку готовый результат под его задачу? Нет! Я лишь показал на примере его кода, как заменить delay на millis. Человек понял суть? Вроде да.

А вы берёте, меняете задачу и пытаетесь алгоритм от задачи А применить к задаче Б без каких либо изменений. Показали свой вариант - хорошо. Знаете больше меня? Тоже хорошо. Но обзывать дебилами, тупоголовыми и пр. - это уже уровень Вашего воспитания.

WavGat
Offline
Зарегистрирован: 14.04.2020

Не понимаю и хочу чтобы мне объяснили, если конечно это не тайна какого-то общества.

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

делаем действие 1
ждём 500 мс
...

Данную задачу (как и любую другую) можно решить разными способами. Я предложил свой. Он решает задачу? Да. Так в чём моя ошибка?

Kakmyc
Offline
Зарегистрирован: 15.01.2018

b707 пишет:

насчет секунд свое замечание снимаю, сам слепой. множитель 100 не увидел.

 

А насчет самого сравнения - оно бессмысленно, потому что варианты кода делают разные действия.

Вавгат, когда вы наконец поймете, что код садмана и кактуса лучше не потому, что он "быстрее" или "эффективнее", а потому что он выполняет свою задачу. а ваш нет.

Он даже не знает, что такое конец цикла.

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Специально для дебилов, делаю как положено

b707
Offline
Зарегистрирован: 26.05.2017

WavGat пишет:

Я предложил свой. Он решает задачу? Да. Так в чём моя ошибка?

все. я сдаюсь. ваш код лучше. быстрее и эффективнее других кодов, которые выложены в этой ветке. И полностью решает задачу "замены делай на миллис".

 

Кажется. у Полякова одна героиня говорила "Зануда - это мужчина, которому проще отдаться. чем обьяснить свое нежелание это делать" (с)

b707
Offline
Зарегистрирован: 26.05.2017

Kakmyc пишет:
Специально для дебилов, делаю как положено

а смысл?

Kakmyc
Offline
Зарегистрирован: 15.01.2018

b707 пишет:

Kakmyc пишет:
Специально для дебилов, делаю как положено

а смысл?

Да бесят такие уроды.
В моем коде не туда инкремент всунул и сравнивает со своим говном.

Kakmyc
Offline
Зарегистрирован: 15.01.2018
unsigned long TestTime;

void setup() {
  Serial.begin(115200);
  Serial.println("Start");

  TestTime=micros();
  test1();
  Serial.println(micros()-TestTime);
  
  TestTime=micros();
  test2();
  Serial.println(micros()-TestTime);

  TestTime=micros();
  test3();
  Serial.println(micros()-TestTime);

  Serial.println("End");
}

void test1() {
  int i = 0;
  while(i<100) {
    do1();
    delay(500);
    do2();
    delay(500);
    do3();
    delay(500);
    do4();
    delay(500);
    i++;
  };
};

void test2() {
  int i = 0;
  unsigned long current_time = millis();
  while(i<100) {
  cycle:
    do1();
    current_time = millis();
    while(millis()-current_time<500) {};
    do2();
    current_time = millis();
    while(millis()-current_time<500) {};
    do3();
    current_time = millis();
    while(millis()-current_time<500) {};
    do4();
    current_time = millis();
    while(millis()-current_time<500) {};
    i++;
  };
};

void test3() {
  int i = 0;
  int operation_num=0;
  unsigned long timer = millis();
  while(i<100) {
    if(millis()-timer>500){
     switch(operation_num){
         case 0:
           do1();
            break;
         case 1:
           do2();
            break;
         case 2:
           do3();
            break;
         case 3:
           do4();
            break;
     }
     timer=millis();
     operation_num++;
     if(operation_num>3) {
      operation_num=0;
      //i++; ИНКРЕМЕНТ ДОЛЖЕН БЫТЬ В КОНЦЕ ЦИКЛА
     }//конец проверки if(operation_num>3)

    }// конец проверки if(millis()-timer>500)

i++;
    //ВОТ ТУТ КОНЕЦ ЦИКЛА
  };//конец цикла while

};//конец функции

void loop() {
}

void do1 () {
  digitalWrite(13,HIGH);
};

void do2 () {
  digitalWrite(13,LOW);
};

void do3 () {
  digitalWrite(13,HIGH);
};

void do4 () {
  digitalWrite(13,LOW);
};

Вот так должен выглядеть код.

Потому, что миллис без делей, это ОТСУТСТВИЕ БЛОКИРОВКИ КОДА

Значит и замерять мы должны время за которое проходит цикл.

 

Вот оно:

17:55:20.759 -> Start
17:58:40.935 -> 200004140
18:02:01.051 -> 199999460
18:02:01.051 -> 236
18:02:01.051 -> End

 

Найди отличия со своим говном

мой цикл прошел 100 раз за 236микросекунд

а твой за 200млн+ микросекунд

И в свой код я могу добавить еще много всего и все будет выполнятся ПАРАЛЛЕЛЬНО: опрос кнопок,вывод на дисплей, передача данных и тд  и тп.

А твое говно будет висеть каждый раз при мигании светодиодом.

Потому , что я просто в цикле проверяю, не пора ли переключить состояние пина ? если не пора . то просто иду дальше, если пора то переключаю и опять же иду дальше, эта проверка занимает 2мкс.

А дебилы переключают диод и ждут полсекунды ничего не делая, что бы включить его обратно.

В этом отличие millis() от delay()

 

b707
Offline
Зарегистрирован: 26.05.2017

Kakmyc пишет:

мой цикл прошел 100 раз за 236микросекунд

увы, но это невозможно. Ищи ошибку. В цикле стоит задержка 500мс и потому сто таких циклов не могут быть существенно быстрее 200 секунд

Это не отменяет того, что само это сравнение - бред. Не ведись.

WavGat
Offline
Зарегистрирован: 14.04.2020

Kakmyc пишет:

unsigned long TestTime;

void setup() {
  Serial.begin(115200);
  Serial.println("Start");

  TestTime=micros();
  test1();
  Serial.println(micros()-TestTime);
  
  TestTime=micros();
  test2();
  Serial.println(micros()-TestTime);

  TestTime=micros();
  test3();
  Serial.println(micros()-TestTime);

  Serial.println("End");
}

void test1() {
  int i = 0;
  while(i<100) {
    do1();
    delay(500);
    do2();
    delay(500);
    do3();
    delay(500);
    do4();
    delay(500);
    i++;
  };
};

void test2() {
  int i = 0;
  unsigned long current_time = millis();
  while(i<100) {
  cycle:
    do1();
    current_time = millis();
    while(millis()-current_time<500) {};
    do2();
    current_time = millis();
    while(millis()-current_time<500) {};
    do3();
    current_time = millis();
    while(millis()-current_time<500) {};
    do4();
    current_time = millis();
    while(millis()-current_time<500) {};
    i++;
  };
};

void test3() {
  int i = 0;
  int operation_num=0;
  unsigned long timer = millis();
  while(i<100) {
    if(millis()-timer>500){
     switch(operation_num){
         case 0:
           do1();
            break;
         case 1:
           do2();
            break;
         case 2:
           do3();
            break;
         case 3:
           do4();
            break;
     }
     timer=millis();
     operation_num++;
     if(operation_num>3) {
      operation_num=0;
      //i++; ИНКРЕМЕНТ ДОЛЖЕН БЫТЬ В КОНЦЕ ЦИКЛА
     }
    }
i++;
    //ВОТ ТУТ КОНЕЦ ЦИКЛА
  };
};

void loop() {
}

void do1 () {
  digitalWrite(13,HIGH);
};

void do2 () {
  digitalWrite(13,LOW);
};

void do3 () {
  digitalWrite(13,HIGH);
};

void do4 () {
  digitalWrite(13,LOW);
};

Вот так должен выглядеть код.

Потому, что миллис без делей, это ОТСУТСТВИЕ БЛОКИРОВКИ КОДА

Значит и замерять мы должны время за которое проходит цикл.

 

Вот оно:

17:55:20.759 -> Start
17:58:40.935 -> 200004140
18:02:01.051 -> 199999460
18:02:01.051 -> 236
18:02:01.051 -> End

 

Найди отличия со своим говном

мой цикл прошел 100 раз за 236микросекунд

а твой за 200млн+ микросекунд

И в свой код я могу добавить еще много всего и все будет выполнятся ПАРАЛЛЕЛЬНО: опрос кнопок,вывод на дисплей, передача данных и тд  и тп.

А твое говно будет висеть каждый раз при мигании светодиодом.

Потому , что я просто в цикле проверяю, не пора ли переключить состояние пина ? если не пора . то просто иду дальше, если пора то переключаю, эта проверка занимает 2мкс.

А дебилы переключают диод и ждут полсекунды ничего не делая, что бы включить его обратно.

В этом отличие millis() от delay()

 

Теперь подробно про уродов:

Выполнить 100 раз цикл, в котором 4 действия попеременно выполняются с интервалом в 0,5 секунды. Теоретически расчетное время 4*0,5*100=200 сек. А ваш вариант уложился в 236 микросекунд. Круто. И у кого тут теперь нерабочий вариант?

Kakmyc
Offline
Зарегистрирован: 15.01.2018

ППЦ.

Данный тест показывает время прохождения 100 циклов.

Если мигать нужно с частотой 1Гц то для того что бы мой диод мигнул, должно пройти 1000000/2=500000 циклов.

Во время прохождения всех этих циклов, я могу выполнять кучу других действий.

это и есть ОТСУТСТВИЕ БЛОКИРОВКИ КОДА

WavGat
Offline
Зарегистрирован: 14.04.2020

Сколько раз в Вашем варианте выполнилась задача №2? (функция do2())

Kakmyc
Offline
Зарегистрирован: 15.01.2018

WavGat пишет:

Сколько раз в Вашем варианте выполнилась задача №2? (функция do2())

 

А сколько раз в моем коде выполнилось условие : if (millis()-TestTime>500) ?

Замер дает время выполнения 100 циклов кода . а не время мигания 100раз светодиодом.

 

Правильно, нисколько. Потому , что за 236мкс ниразу не прошло 500мс .

что не помешало 100 раз проверить: а точно ли не прошло 500мс

 

Как еще обьяснить Долб***у ( не ошибка, действительно в данном случае с большой буквы) что такое НЕБЛОКИРУЮЩАЯ ФУНКЦИЯ

WavGat
Offline
Зарегистрирован: 14.04.2020

Я взял задачу автора, провёл 100 итераций и замерял время. То, как Вы реализовали данную задачу - это уже Ваша проблема. Я поставил итерацию переменной i в такое место, где получится 100 итераций всей задачи, а не конкретно вашего цикла.

100 раз do1(), 100 раз ждем 0,5 сек после do1(), ... 100 раз do4(), 100 раз ждем 0,5 сек после do4().

Все три теста работают именно так. А у Вас что? Что с чем Вы сравнили?

Kakmyc
Offline
Зарегистрирован: 15.01.2018

WavGat пишет:

Я взял задачу автора, провёл 100 итераций и замерял время. То, как Вы реализовали данную задачу - это уже Ваша проблема. Я поставил итерацию переменной i в такое место, где получится 100 итераций всей задачи, а не конкретно вашего цикла.

100 раз do1(), 100 раз ждем 0,5 сек после do1(), ... 100 раз do4(), 100 раз ждем 0,5 сек после do4().

Все три теста работают именно так. А у Вас что? Что с чем Вы сравнили?

 

Совсем кретин ?

Зачем нужен мк , что бы посчитать сколько раз мигнет 200 раз диод с частотой 1ГЦ ?

200*1=200 секунд.

Просто у дебилов 200секунд будет выполнятся 100циклов.

А у нормальных людей 1000000000 циклов.

 

Ты вообще разницы не видишь в том висит у тебя МК или работает ?

MaksVV
Offline
Зарегистрирован: 06.08.2015

сурово...Чел честно заменил delay на millis

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Kakmyc пишет:

Совсем кретин ?

у дебилов 

Давай без этого обойдемся, а то уже я тебя чистить буду

Kakmyc
Offline
Зарегистрирован: 15.01.2018
unsigned long TestTime;

void setup() {
  Serial.begin(115200);
  Serial.println("Start");

 // TestTime=micros();
  test1();
  //Serial.println(micros()-TestTime);
  
  //TestTime=micros();
  test2();
  //Serial.println(micros()-TestTime);

 // TestTime=micros();
  test3();
  //Serial.println(micros()-TestTime);

  Serial.println("End");
}

void test1() {
  unsigned long  i = 0;
  TestTime=micros();
  while(micros()-TestTime<10000000) {
    do1();
    delay(500);
    do2();
    delay(500);
    do3();
    delay(500);
    do4();
    delay(500);
    i++;
  };
  Serial.println(i);
};

void test2() {
  unsigned long i = 0;
  TestTime=micros();
  unsigned long current_time = millis();
  while(micros()-TestTime<10000000) {
  cycle:
    do1();
    current_time = millis();
    while(millis()-current_time<500) {};
    do2();
    current_time = millis();
    while(millis()-current_time<500) {};
    do3();
    current_time = millis();
    while(millis()-current_time<500) {};
    do4();
    current_time = millis();
    while(millis()-current_time<500) {};
    i++;
  };
  Serial.println(i);
};

void test3() {
  unsigned long i = 0;
  int operation_num=0;
  TestTime=micros();
  unsigned long timer = millis();
  while(micros()-TestTime<10000000) {
    if(millis()-timer>500){
     switch(operation_num){
         case 0:
           do1();
            break;
         case 1:
           do2();
            break;
         case 2:
           do3();
            break;
         case 3:
           do4();
            break;
     }
     timer=millis();
     operation_num++;
     if(operation_num>3) {
      operation_num=0;
      //i++; ИНКРЕМЕНТ ДОЛЖЕН БЫТЬ В КОНЦЕ ЦИКЛА
     }
    }
i++;
    //ВОТ ТУТ КОНЕЦ ЦИКЛА
  };
  Serial.println(i);
};

void loop() {
}

void do1 () {
  digitalWrite(13,HIGH);
};

void do2 () {
  digitalWrite(13,LOW);
};

void do3 () {
  digitalWrite(13,HIGH);
};

void do4 () {
  digitalWrite(13,LOW);
};

 

Вот тебе тест количества прохождений циклов за 10 секунд.

Что бы кое кто увидел, что в моем  случае диод тоже мигает когда надо

 

Вот что получилось:

18:40:15.245 -> Start
18:40:25.247 -> 5
18:40:35.275 -> 5
18:40:45.273 -> 1728495
18:40:45.273 -> End

 

Kakmyc
Offline
Зарегистрирован: 15.01.2018

В общем ну иго нафик.

у человека wavgat головного мозга

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Kakmyc пишет:

у человека wavgat головного мозга

с этим я согласен, но правила приличия требуют... 

WavGat
Offline
Зарегистрирован: 14.04.2020

Kakmyc пишет:

WavGat пишет:

Я взял задачу автора, провёл 100 итераций и замерял время. То, как Вы реализовали данную задачу - это уже Ваша проблема. Я поставил итерацию переменной i в такое место, где получится 100 итераций всей задачи, а не конкретно вашего цикла.

100 раз do1(), 100 раз ждем 0,5 сек после do1(), ... 100 раз do4(), 100 раз ждем 0,5 сек после do4().

Все три теста работают именно так. А у Вас что? Что с чем Вы сравнили?

 

Совсем кретин ?

Зачем нужен мк , что бы посчитать сколько раз мигнет 200 раз диод с частотой 1ГЦ ?

200*1=200 секунд.

Просто у дебилов 200секунд будет выполнятся 100циклов.

А у нормальных людей 1000000000 циклов.

 

Ты вообще разницы не видишь в том висит у тебя МК или работает ?

А при чём тут количество циклов программы? Я ещё в начале темы подметил, что два дополнительных условия увеличат время ожидания между выполнением задач с 1 по 4-ую. Тест это доказал на практике. Ваш код красивее, читабельнее - ДА. Я и не спорил об этом. Вы утверждаете что мой код не рабочий, а показать в каком месте он не работает так и не удосужились. То, что микроконтроллер в это время ничего не делает и не может делать - так в задаче ему и не нужно что-то делать.

На все машины ставят гидроусилитель руля, потому что так НАДА!. Давайте и на велосипеды будем гидроусилитель ставить - вот Ваша логика. Так надо и хоть ты тресни, а почему - да просто все вокруг .... и не знают, что нужно именно так и по другому просто никак нельзя, даже если и работает, оно всё равно работает неправильно, потому что написано не по правилам! (а где эти правила написаны?)

MaksVV
Offline
Зарегистрирован: 06.08.2015

ТС, как вариант почитай тут пост #7. Может поможет. Тебе надо как бы  понять, зачем в принципе меняют delay на миллис

WavGat
Offline
Зарегистрирован: 14.04.2020

MaksVV пишет:

ТС, как вариант почитай тут пост #7. Может поможет. Тебе надо как бы  понять, зачем в принципе меняют delay на миллис

 

Я не ТС. Я понимаю зачем его меняют, но это не панацея. Есть места, где делай вполне себе может жить и никому не мешать.

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Да просто до тебя видимо не дойдет , что твоя замена это не замена ни разу, а те же грабли , только в другой проекции

b707
Offline
Зарегистрирован: 26.05.2017

MaksVV пишет:

ТС, как вариант почитай тут пост #7. Может поможет

не поможет, Макс.

Ты очень точно описал ситуацию - "чел честно заменил делей на миллис".  И потом он включил дурака и не желает понимать, что хотя он решил задачу формально верно, смысл от его решения в плане программирования ровно такой же , как если бы он просто в тексте поиском и заменой заменил слово "delay" на слово "millis".

Но формально он прав. И теперь его с этого не свернуть.

Да и фиг с ним. Мне надоело его переубеждать. С его "знаниями" он уже в двух других ветках налажал и наверняка продолжит так и дальше, так что долго не задержится

bwn
Offline
Зарегистрирован: 25.08.2014

WavGat пишет:

Я не ТС. Я понимаю зачем его меняют, но это не панацея. Есть места, где делай вполне себе может жить и никому не мешать.

А, если знаете и понимаете, то зачем нарисовали свой пример, и не объяснили ТС, что ничего не изменилось, а делей для его конкретной задачи идеален?

То b707: Вы в "Чистим форум", по этой теме вопрос задавали или какой другой? Здесь почитал чищенные, криминала не заметил, просто убрали часть срача, сохранив общую мысль.

MaksVV
Offline
Зарегистрирован: 06.08.2015

WavGat пишет:
Есть места, где делай вполне себе может жить и никому не мешать.

С этим-то как раз никто и не спорит. Ты же взялся заменить этот delay() на миллис, и сделал это, мягко говоря, не очень корректно.  Вот об этом тебе все тут толкуют, а ты упёрся. Скажу прямо, чтобы тебе было понятно. delay() заменяют на millis() в тех случаях, когда программа не должна простаивать, т.е. в программе есть другие части, которые должны также выполняться корректно, например опрос кнопок (который не терпит долгого прохода loop, а delay как раз и задерживает проход loop) и т.д. 

Если у тебя эти другие части программы отстутсвуют, то оставляй ты свой delay() и менять его на millis() , особенно по твоему способу, совершенно незачем, от слова совсем.