Софт-таймер — это же простой счётчик. В общем цикле крутишь глобальные переменные и истово их плюсуешь, пока не достигнут некоего значения. Достигли, обнуляешься и делаешь некое действие... ничего сложного И, да, не так страшен FreeRTOS штука простая и приятная. Сразу к ней привыкать надо.
Комментарии: 26
Anton
Не очень хороший вариант софтового счетчика... Лучше иметь 1 глобальную переменную и плюсовать её в прерывании таймера выполняющегося например каждую миллисекунду, а по всему остальному коду уже проверять эту переменную на нужное значение... А если делать совсем правильно, то надо отрабатывать еще и переполнение этой переменной...
Pihto
Антон, правильнее так, конечно. Просто, для понимания, можно в начале наплодить переменных. Одна — более правильно
Anton
переменная в цикле не даёт гарантированной задержки и будет плавать от фазы луны и погоды на марсе (пожеланий компилятора и оптимизатора кода).... :)
Pihto
Эээ?! С чего бы?! И откуда там миллисекунды? Там кратные 16 000 000 или 8 000 000 если склероз не изменяет...
Anton
ну например в коде написано for(uint32_t i = 0; i < 1000000; i++) ; что даст некоторую задержку, да... но если вставить перед циклом некий код или после него, то задержка может уплыть, т.к. оптимизатор по другому организует результирующий код... так же оно будет плавать от уровня оптимизации -O2 и -Os будут давать совсем разные результаты....
Pihto
А, нет, нет, нет... я такого не говорил и не писал )))) Мокрое дело шьёте, сэээр! )
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<
-
-
12.03 2020 21:12:54
-
-
12.03 2020 21:13:13
-
-
12.03 2020 21:14:03
-
-
12.03 2020 21:17:38
-
-
12.03 2020 21:18:05
-
-
12.03 2020 21:18:13
-
-
12.03 2020 21:18:51
-
-
12.03 2020 21:19:00
-
-
12.03 2020 21:19:24
-
-
12.03 2020 21:19:53
-
-
12.03 2020 21:20:21
-
-
12.03 2020 21:22:13
-
-
12.03 2020 21:20:24
-
-
12.03 2020 21:20:53
-
-
12.03 2020 21:22:31
-
-
12.03 2020 21:22:36
-
-
12.03 2020 21:24:14
-
-
12.03 2020 21:24:17
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
Я читаю) И пытаюсь внять сиим подсказкам.