код для КНОПОК - помогите разобраться

Тема в разделе "Микроконтроллеры AVR", создана пользователем Alexandro77, 26 сен 2019.

Метки:
  1. offigate

    offigate Нерд

    Вопрос был не о переполнениии, а о том, что в данном случае плохого случится из-за него? Конкретно, без отмазок и отсылок, в интернете все в слишком общем виде.
     
  2. DetSimen

    DetSimen Guest

    в данном случае, на 50-е сутки, если кто на кнопку нажмёт в неудачный момент, то миллис переполнится, процессор вспухнет, познав сингулярность, взорвёца и забрызгает байтами окружающий унылый пейзаш, и всё вокруг превратицца примерно в OFFIGATE. От тут:

    Код (C++):
    if (millis() >= button.ts)
      {
        button.ts = millis() + 10;
    Но мы же должны писать надёжные программы, не?
     
  3. SergeiL

    SergeiL Оракул Модератор

    Тут два варианта. Или правильно или глючит.
    Во втором варианте возможно все что угодно. Все зависит от того, где эта кнопка стоит? :)
     
  4. b707

    b707 Гуру

    этот код прям как будто специально написан, чтобы продемонстрировать всю глубину последствий переполнения :)
    Обычно код новичков глючит только при переходе через ноль. Тут же, при неудачном раскладе - кнопка просто залипнет на весь следующий период переполнения миллис - то есть на 2 месяца
     
    parovoZZ нравится это.
  5. offigate

    offigate Нерд

    Каков он, неудачный расклад? В чем он состоит, когда (то бишь за счет чего) он может случиться?
     
  6. b707

    b707 Гуру

    может вы все-таки уже сделаете над собой усилие и почитаете про беззнаковую арифметику и переполнение?
    Вас надо было послать в гугль еще 10 сообщений назад - но над вами сжалились. Вижу что зря - вы из-за этого все больше на шею садитесь
     
  7. DetSimen

    DetSimen Guest

    Нахрена? Чем меньше в башке знаний, тем больше апломба.
     
    Andrey12 и Asper Daffy нравится это.
  8. offigate

    offigate Нерд

    Я уже прочитал прочитал про беззнаковую арифметику и переполнение. Я спрашивал о другом - что реально случится, если сделать неправильно? Вы сказали при каких-то условиях кнопка залипнет на 50 дней. Это просто ужасно.

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

    Это точно. Ответ на вопрос, который я задаю, требует знаний. Я не знаю на него ответа. А вы знаете?
     
  9. akl

    akl Гуру

    прикол в том, что миллис это unsigned long, то есть максимальное значение времени возможное это 32 бита - FFFFFFFF, что в пересчете на секунды примерно 50 дней или типа того. а FFFF FFFF +1 будет равно 0 (нуль) и счет начнется поновой.
    Допустим что таймер дотикал до FFFF FFF2, в этот момент как обычно сработало условие if (millis() >= button.ts)
    после этого button.ts станет равным FFFF FFF2 + A(10 то бишь) что = FFFF FFFC
    button.ts = FFFF FFFC получается в этот момент
    затем через несколько миллисекунд миллис обнуляется и начинает выдавать значения с нуля - 1, 2, 3, и т.д. 50 дней.
    А button.ts у нас как раз незадолго до обнуления стал FFFF FFFC и условия снова не сработает, вот в этом и попадос.

    ну и еще неизвестно какие эффекты могут быть, я сам в этом не очень разобрался. Считается что относительный счет с вычитанием if (millis() - currentmillis > timeout) работает лучше. Но я не проверял, т.к. мои устройства по 50 дней на одной зарядке не живут
     
    Andrey12 нравится это.
  10. offigate

    offigate Нерд

    Перед тем как обнулиться, разве он не примет все значения вплоть до FFFF FFFF? В моем куске кода вроде бы как примет, там нет ничего, что могло бы ему помешать. Просто так в нем не видать никакого "неудачного расклада".

    Но на самом деле вопрос еще сложней :)
     
    Последнее редактирование: 20 ноя 2019
  11. akl

    akl Гуру

    кто? миллис() выдаст все значения до FFFF FFFF, но button.ts меняется только с шагом 10мс, а от последнего значения FFFF FFFC (условно) до FFFF FFFF сильно меньше чем 10мс, так и получится что button.ts залипнет. и даже если менять button.ts каждую миллисекунду это ничего не гарантирует
     
    Andrey12 нравится это.
  12. offigate

    offigate Нерд

    Но сравнение-то идет напрямую, там никаких 10 мс нет:
    Код (C++):
    if (millis() >= button.ts)
    Рано или поздно millis() выдаст FFFF FFFF и код отработает.
     
  13. DetSimen

    DetSimen Guest

    if (millis() >= button.ts)
    {
    button.ts = millis() + 10;

    Ты толи совсем тупой, button.ts у тебя больше текущего милиис на 10 миллисекунд ВСЕГДА.
     
    Andrey12 нравится это.
  14. akl

    akl Гуру

    if (millis() >= button.ts) сработает только когда millis() выдаст значение больше того на котором перед обнулением залип button.ts, то есть FFFF FFFC, это случится не раньше чем через 49 дней, и не факт что после этого что-то отлипнет кстати
     
    Andrey12 нравится это.
  15. offigate

    offigate Нерд

    Не всегда. Только после того как сравнение уже было выполнено. :D
     
  16. offigate

    offigate Нерд

    Вы же выше писАли, что тот момент, когда button.ts присвивается значение FFFF FFFC, значение millis() равно FFFF FFF2. Через 1 мс оно станет FFFF FFF3. А через 10 мс оно станет FFFF FFFC, сравнение сработает. В честь чего это millis() вдруг сразу перескочит через значения FFFF FFFC, FFFF FFFD, FFFF FFFE, FFFF FFFF прямо в 0?
     
  17. DetSimen

    DetSimen Guest

    ну вот у тебя миллис стал FFFFFFFE, предыдущий button.ts был значить FFFFFFF4.
    сравнение прошло удачно, тоись button.ts теперь стал FFFFFFFE
    а в след. раз if с миллис вызвался, когда в ём было 00000004.
    в сравнении потом кто будет больше, ватьмашу?
     
    Andrey12 нравится это.
  18. DetSimen

    DetSimen Guest

    если программа коряво написана, миллис может вызываться и не раз в миллисекунду, а существенно реже. если чо
     
    Andrey12 нравится это.
  19. Asper Daffy

    Asper Daffy Иксперд

    Да, уж!

    "Уж" - если кто не знает, это зверь такой.
     
  20. DetSimen

    DetSimen Guest

    Опщем, лучше пусть буду я тупой. Спорить с граммотеями больше не собираюсь.
    Когда-нибудь ты на такой угол налетишь с разворота, не обязательно с миллис. Послушаем потом твои песни.
     
    Andrey12 и Asper Daffy нравится это.