Софт-таймер — это же простой счётчик. В общем цикле крутишь глобальные переменные и истово их плюсуешь, пока не достигнут некоего значения. Достигли, обнуляешься и делаешь некое действие... ничего сложного И, да, не так страшен FreeRTOS штука простая и приятная. Сразу к ней привыкать надо.

Комментарии: 26

  1. Anton

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

    • Pihto

      Антон, правильнее так, конечно. Просто, для понимания, можно в начале наплодить переменных. Одна — более правильно

      • Anton

        переменная в цикле не даёт гарантированной задержки и будет плавать от фазы луны и погоды на марсе (пожеланий компилятора и оптимизатора кода).... :)

        • Pihto

          Эээ?! С чего бы?! И откуда там миллисекунды? Там кратные 16 000 000 или 8 000 000 если склероз не изменяет...

          • Anton

            ну например в коде написано for(uint32_t i = 0; i < 1000000; i++) ; что даст некоторую задержку, да... но если вставить перед циклом некий код или после него, то задержка может уплыть, т.к. оптимизатор по другому организует результирующий код... так же оно будет плавать от уровня оптимизации -O2 и -Os будут давать совсем разные результаты....

            • Pihto

              А, нет, нет, нет... я такого не говорил и не писал )))) Мокрое дело шьёте, сэээр! )

  2. Anton

    А это тогда было о чем? :)))

    • Pihto

      Ща. void Timers::initTimer2FastPWM() { TCCR2A = 0; TCCR2A = (1 << COM2A1) | (0 << COM2A0) | (1 << COM2B1) | (0 << COM2B0) | (0 << WGM21) | (1 << WGM20); TCCR2B = 0; TCCR2B = (0 << CS22) | (1 << CS21) | (0 << CS20) | (0 << WGM22); // TCCR2B = (1 << CS20); // CLK/1 // TCCR2B |= (1<

      • Anton

        ну вот в прерывании и надо плюсовать одну единственную переменную... а не в "общем цикле плюсуем и делаем когда обнулилось" :))

        • Pihto

          Ну да. ))) мы прост друг-друга не поняли )

          • Anton

            Ну как уж в сообщении написано, так я и понял, а написано там именно про общий цикл и так далее... :)

            • Pihto

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

              • Anton

                я бы сказал его обязательно нужн сделать static volatile :)

                • Cyberzx

                  Зачем?

                  • Pihto

                    Ну... не всегда Чтобы компилер не оптимизировал эту переменную. Если её запихивать в класс, то точно static. Если деление таймера меньше 64, то хорошо volatile

                    • Anton

                      если счетчик инкрементится в прерывании некоторые особо "умные" оптимизаторы его могут попросту выпиливать, по этому volatile :)

                      • Pihto

                        avr2 вроде бы, вполне терпимо обращается

                        • Cyberzx

                          Ну если у тебя цикл while (timer < deadline); то да. компилятор может этот цикл _обнулить_

                          • Pihto

                            Нет, не надо делать while Это уЖаСнО )))

                            • Cyberzx

                              да какая разница? )

                        • Anton

                          Оно как повезет, может выпилит, а может нет... я давно уже не работал с аврками, так что незнаю как там дела обстоят, но GCC частенько выпиливает такое, если volatile не написать :)

                          • Pihto

                            А уж что gcc в лялихе с переменными творит, это ж описать никакой докой не получается )))

                            • Anton

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

                              • Cyberzx

                                вообще надо эти цикли задержки на ассемблере писать. для компилятор асм священен и он его трогать не будет

                              • Pihto

                                Получаем "залепуху". Забываем про неё. Пытаемся пустить какой-то другой процесс и получаем срыв по собачьему таймеру ) Что да, то да. Я тут написал утилитку под ffmpeg, пока вспомнил про волатильность, полночи промаялся. Счётчик совсем рехнулся )))

              • Paschendale

                Я читаю) И пытаюсь внять сиим подсказкам.

Не нашли ответ?

Вам также может быть интересно