-
- Подскажу еще один способ замеров интервалов времени. Без inc/dec
счетчиков. Для примера, ST HAL предоставляет время в ms посредством
функции HAL_GetTick(); Единожды запоминаем текущее время: static
uint32_t time_start = HAL_GetTick(); и далее в том месте где надо
проверить не вышло ли время, просто находим разницу между начальным
и текущим временем непосредственно в самом условии: if
(HAL_GetTick() RxTx(130 знак., 25.10.2020 16:10 - 18:41)
- лучше так time_start += 1000UL Дoктyp77(44 знак., 26.10.2020 09:47)
- а при переполнении?) - lexxx-lexxx(25.10.2020 17:47)
- Легко отслеживается evgeniy1294(130 знак., 25.10.2020 18:16)
- Переполнение вообще не влияет - Йцyк(25.10.2020 20:34, )
- +1. Главное обеспечить беззнаковые одной размерности для вычитания. - Nikolay_Po(25.10.2020 21:15)
- Дополнение: разность должна иметь тот же тип, что и уменьшаемое, и вычитаемое. SciFi(118 знак., 25.10.2020 21:35)
- +1. Главное обеспечить беззнаковые одной размерности для вычитания. - Nikolay_Po(25.10.2020 21:15)
- Переполнение вообще не влияет - Йцyк(25.10.2020 20:34, )
- Легко отслеживается evgeniy1294(130 знак., 25.10.2020 18:16)
- Вот так делаю. Удобно Tpoeшник(796 знак., 25.10.2020 08:45 - 10:37)
- Раз уж дело дошло до типов, задам вопрос здесь(в этой ветке): а в
чем смысл писать std::uint32_t вместо просто uint32_t? - Constantin24(26.10.2020 08:05)
- Namespace жеж. Видимо, защита от вредителя, который переопределит
тип uint32_t на что-нибудь гадкое. Но если спросите моё мнение, от
таких вредителей надо защищаться организационными мерами.
Пропускной режим, репрессии, вот это всё. - SciFi(26.10.2020 08:33)
- да кому в голову придет переопределить тип uint32_t ?.. - Constantin24(26.10.2020 13:26)
- Бросайте плюсы, это гиблое дело. Они всего лишь подкидывают
множество вопросов, не имеющих никакого отношения к делу. Старый
добрый Си решает все вопросы эффективно без лишнего шума и пыли, в
области микроконтроллеров уж точно. - SciFi(26.10.2020 13:30)
- низачто. Надоело таскать структуру какой либо микросхемы с
настройками и к ней обращаться... - Constantin24(26.10.2020 14:34)
- Хозяин — барин. Но вообще я согласен, что шишки, набитые
собственноручно, действуют убедительнее, чем чужие. - SciFi(26.10.2020 15:27)
- полностью солидарен! - Constantin24(28.10.2020 12:59)
- Хозяин — барин. Но вообще я согласен, что шишки, набитые
собственноручно, действуют убедительнее, чем чужие. - SciFi(26.10.2020 15:27)
- низачто. Надоело таскать структуру какой либо микросхемы с
настройками и к ней обращаться... - Constantin24(26.10.2020 14:34)
- Бросайте плюсы, это гиблое дело. Они всего лишь подкидывают
множество вопросов, не имеющих никакого отношения к делу. Старый
добрый Си решает все вопросы эффективно без лишнего шума и пыли, в
области микроконтроллеров уж точно. - SciFi(26.10.2020 13:30)
- Именно, а ещё есть boost:uint32_t - evgeniy1294(26.10.2020 11:35)
- да кому в голову придет переопределить тип uint32_t ?.. - Constantin24(26.10.2020 13:26)
- Namespace жеж. Видимо, защита от вредителя, который переопределит
тип uint32_t на что-нибудь гадкое. Но если спросите моё мнение, от
таких вредителей надо защищаться организационными мерами.
Пропускной режим, репрессии, вот это всё. - SciFi(26.10.2020 08:33)
- INT16U и INT08U это наверно специально для выноса моска? - Vit(25.10.2020 09:00)
- Еще бы U8 и U16 можно было бы понять - VLLV(25.10.2020 10:41)
- Это для того чтоб не выписываться и чётче видеть важное. Где то
подсмотрел. - Tpoeшник(25.10.2020 10:27)
- Чем stdint.h не устраивает? - VLLV(25.10.2020 10:42)
- Еще компактнее будет сделать mbedder.h с понятиями u8, u16, u32,
u64 и s8, s16, s32 и s64. Для еще большей сестры таланта можно
вместо битовой длины залудить байтовую - u1, u2, u4, u8 и s1, s2,
s4, s8 :)) - MBedder(25.10.2020 10:48)
- Вот я тоже себе сделал u1, u2, u4, u8. Непонятно, кто и зачем придумал uint32_t ? Ведь всё равно нету uint29_t, uint31_t и т.д. Зачем тогда в 8 раз умножать? Ale3000(134 знак., 27.10.2020 04:17)
- У меня global.h в котором: Tpoeшник(742 знак., 26.10.2020 11:38)
- Вот в фортране как было удобно-то. Если переменная начинается на
"йоклмн" -- то целая, иначе вещественная. - fk0(25.10.2020 13:16)
- Это в каком Фортране так было, в IV? - BlackPrapor(25.10.2020 20:39)
- После того, как увидел, что компилятор ARM по разному компилирует
самопал и стдинт, больше самопал не использую. Неважно, что оба
варианта работают. - VLLV(25.10.2020 13:03)
- stdint - это ведь тоже самопал, набор typedef и #define. Кто мешает
сделать свое точно так же, а не через алиасы? - MBedder(25.10.2020 13:15 - 13:19)
- Что такое int_fast32_t я знаю будучи пьяным и разбуженным в 4 утра.
Что такое u8 -- не знаю, не уверен, ибо есть нюансы. Для
int_fast32_t есть INT_FAST32_MAX и PRIdFAST32 например, а для u8
что? Для именно u8 или i8 вообще интересно, это char, signed char
или unsigned char (кто не знает -- это ТРИ РАЗНЫХ типа). Можно для
всех библиотечных типов придумать свои алиасы, но читать такую
программу -- невозможно. Потом #define вместо typedef использовать
нельзя, т.к. у него fk0(809 знак., 25.10.2020 14:58)
- В stdint #define используются не вместо typedef, разумеется: MBedder(99 знак., 25.10.2020 14:59)
- Да никто не мешает, но лучше иметь возвожность свалить вину на компиляторописателей, а не рвать волосы на ж. Опять таки, кросс-платформенность уже реализована, меньше думать. - VLLV(25.10.2020 14:04)
- stdint - это Стандарт, заголовок, обязанный быть у каждого
компилятора - lloyd(25.10.2020 13:18)
- Когда-то пробовал в IAR C коде включить #include <stdint.h>, не смогло найти. Попробовал дать полный путь ради прикола, этот нашло, но другие include, которые внутри stdint.h, опять не находит. Как правильно подключить так и не понял, сделал побыстрому свой, так и осталось тогда - maleon(25.10.2020 13:28)
- В какой статье УК говорится про "обязанный"? И кто мешает иметь
одновременно и stdint, и myint?? - MBedder(25.10.2020 13:20)
- Когда один и на себя кодишь - никто. Мне тоже u8, u16 больше нравятся, но когда на чужого дядю кодить стал (результат - код, а не готовое устройство), пришлось стандарт stdint блюсти и уже в своем коде старом тяжелее разбираться стало. - Andreas(25.10.2020 13:59)
- >В какой статье УК говорится про "обязанный" lloyd(78 знак., 25.10.2020 13:30)
- Меньше какашек от зануд прилетать будет. Можешь встать в позу,
конечно, тоже жизненная позиция :-) - SciFi(25.10.2020 13:22)
- Ну разишто :)) - MBedder(25.10.2020 14:49)
- Что такое int_fast32_t я знаю будучи пьяным и разбуженным в 4 утра.
Что такое u8 -- не знаю, не уверен, ибо есть нюансы. Для
int_fast32_t есть INT_FAST32_MAX и PRIdFAST32 например, а для u8
что? Для именно u8 или i8 вообще интересно, это char, signed char
или unsigned char (кто не знает -- это ТРИ РАЗНЫХ типа). Можно для
всех библиотечных типов придумать свои алиасы, но читать такую
программу -- невозможно. Потом #define вместо typedef использовать
нельзя, т.к. у него fk0(809 знак., 25.10.2020 14:58)
- Заинтриговал. А какой вариант красивше скомпилировался-то? Может, самопал надо было брать? - SciFi(25.10.2020 13:12)
- stdint - это ведь тоже самопал, набор typedef и #define. Кто мешает
сделать свое точно так же, а не через алиасы? - MBedder(25.10.2020 13:15 - 13:19)
- Еще компактнее будет сделать mbedder.h с понятиями u8, u16, u32,
u64 и s8, s16, s32 и s64. Для еще большей сестры таланта можно
вместо битовой длины залудить байтовую - u1, u2, u4, u8 и s1, s2,
s4, s8 :)) - MBedder(25.10.2020 10:48)
- Чем stdint.h не устраивает? - VLLV(25.10.2020 10:42)
- Раз уж дело дошло до типов, задам вопрос здесь(в этой ветке): а в
чем смысл писать std::uint32_t вместо просто uint32_t? - Constantin24(26.10.2020 08:05)
- есть системный таймер uint32_t sysTimer_ms который инкрементируется каждую 1мс. При необходимости можно любой добавить - 100мс, 1с, 1час. Потом для таймера завожу переменную uint32_t timer_n. Ну и дальше просто: AVF(451 знак., 25.10.2020 08:17)
- "Программный таймер" - это вырожденный случай оси, предоставляющей сервис времени. =AK=(276 знак., 24.10.2020 14:27, ссылка)
- Эх-хе-хе... Помницца, был здесь знатный срач по поводу 100500 канального ШИМ на АВР. - mse homjak(24.10.2020 00:17)
- Ответов много и все верный.. ну как же моих трех копеек ))... POV_(2655 знак., 23.10.2020 19:43, )
- Библиотека тут чрезмерна, заводишь несколько декрементных счетчиков и всё. Счетчик это хорошо накатанная (шаблон, паттерн) конструкция вида RxTx(362 знак., 23.10.2020 19:37)
- только так и делаю. Оно ж (через 1 мсек) всё равно щелкает. А какая там библиотека? Таймеры щелкают в прерывании systick/ - Лaгyнoв(23.10.2020 18:48)
- Как вариант - Evgeny_CD(23.10.2020 18:13, ссылка)
- Генерим прерывания от одного аппаратного таймера каждую
миллисекунду (наименьший общий квант). Делаем N софт-таймеров и
инициализируем их требуемыми значениями периодов в мс - 3, 25, 100,
60000. В 1-мс прерывании декрементируем каждый софт-таймер, и при
достижении нуля переинициализируем его прежним значением и
генерируем event, interrupt или что угодно. Это все - не благодари
:)) - MBedder(23.10.2020 16:29)
- Можно не соглашаться? - Tpoeшник(23.10.2020 17:34)
- Нельзя, я тоже так делаю :) Но наверно так, как советует SciFi,
получится чуть быстрее. Если только это имеет значение :) - VLLV(23.10.2020 17:42)
- Правильно ли я понимаю, что предлагается внутри прерывания
детектить ноль в счетчике программного таймера и генерить евент в
систему или некое прерывание? - Tpoeшник(23.10.2020 17:48)
- Угу, вот такое УГ VLLV(3269 знак., 23.10.2020 17:50)
- А можно посмотреть пример управления светодиодом по схеме Tpoeшник(44 знак., 23.10.2020 18:18)
- Делаю такое на прототридах Дункелса и простых разностях (таймер -
сохраненное значение) Cкpипaч(496 знак., 23.10.2020 19:57, ссылка)
- у Дункельса есть и таймеры. Пользую их много лет с непременным
успехом. - LightElf(23.10.2020 20:19)
- Ткните, плз, пальцем, посмотрю. Cкpипaч(115 знак., 25.10.2020 11:01)
- оно не то чтобы абстракция, просто вынесенный в отдельный файл
кусок кода. Удобно использовать и в прототредах и в простом большом
цикле. LightElf(12 знак., 25.10.2020 12:53, ссылка)
- Спасибо. Cкpипaч(96 знак., 26.10.2020 08:54)
- Просто и со вкусом. Жаль, раньше не попалось на глаза. Меньше зоопарка было бы. - SciFi(25.10.2020 13:16)
- оно не то чтобы абстракция, просто вынесенный в отдельный файл
кусок кода. Удобно использовать и в прототредах и в простом большом
цикле. LightElf(12 знак., 25.10.2020 12:53, ссылка)
- Ткните, плз, пальцем, посмотрю. Cкpипaч(115 знак., 25.10.2020 11:01)
- у Дункельса есть и таймеры. Пользую их много лет с непременным
успехом. - LightElf(23.10.2020 20:19)
- я могу! но в моей реализации Aleksey_75(210 знак., 23.10.2020 18:38)
- вот где "сила": Tpoeшник(243 знак., 24.10.2020 00:49 - 11:06)
- Мне вот чего непонятно. Для arr_caxapa[0]= 10 мы получаем задержку
от 10 до 110? Зачем такая широкая граница? - teap0t(24.10.2020 11:15)
- Не понял. С первого прохода вскакивает в if и делаем тогл.
Следующий тогл через 10 мс - Tpoeшник(24.10.2020 11:25)
- Зачем такая широкая граница >100 ? - teap0t(24.10.2020 11:35)
- Не понял. С первого прохода вскакивает в if и делаем тогл.
Следующий тогл через 10 мс - Tpoeшник(24.10.2020 11:25)
- Попробовал откомпилировать : TMR_UKRAINE not defined - VLLV(24.10.2020 09:48)
- Так ниже по теме сама таймерная обёртка! Подразумевалось что вы читаете тему. - Tpoeшник(24.10.2020 10:57)
- Вероятно, такой код выдают белорусские айтишники, массово сбежавшие в Киев от притеснений батькиного режима. - SciFi(24.10.2020 09:59)
- Мне вот чего непонятно. Для arr_caxapa[0]= 10 мы получаем задержку
от 10 до 110? Зачем такая широкая граница? - teap0t(24.10.2020 11:15)
- Жулик :) - VLLV(23.10.2020 18:47)
- почему ? это не ось , это реализация которую описывал ниже )) - Aleksey_75(23.10.2020 18:51)
- Красиво, но к старости перестал любить такие прокладочки. Чем
меньше уровней, тем лучше. - VLLV(23.10.2020 19:27)
- это зависит от уровня абстракции. если прокладочка - это
виртуальная машина, то она чаще всего даёт значимый оверхед. если
это всего лишь функционал расширяющий возможности - то почему бы и
нет? чем больше нижележащие функции могут, тем меньше кода
приходится писать далее. при этом потери на таких "прокладках"
незначительны. - Mahagam(23.10.2020 21:08)
- Именно так! оверхеда там совсем не много, а вот сам механизм
отложенных функций очень выручает - Aleksey_75(23.10.2020 21:23)
- Какой именно механизм? А то с state-machine.com (quantum leaps)
первый вопрос -- а что будет, когда очередь переполнится. - fk0(23.10.2020 21:31)
- в моем варианте это 12 одновременно работающих таймеров, все что выше падает в фифо с пересчетом времени от счетчика который отработает первым, по отработке выдернется из фифо и переместится в пул. На самом деле по моим задачам фифо всегда пуст, максимум заполнение пула 10 счетчиками. Естественно это не серебряная пуля, но меня вполне устраивает и вопросов пока не было! Aleksey_75(140 знак., 23.10.2020 21:42)
- Какой именно механизм? А то с state-machine.com (quantum leaps)
первый вопрос -- а что будет, когда очередь переполнится. - fk0(23.10.2020 21:31)
- Именно так! оверхеда там совсем не много, а вот сам механизм
отложенных функций очень выручает - Aleksey_75(23.10.2020 21:23)
- это зависит от уровня абстракции. если прокладочка - это
виртуальная машина, то она чаще всего даёт значимый оверхед. если
это всего лишь функционал расширяющий возможности - то почему бы и
нет? чем больше нижележащие функции могут, тем меньше кода
приходится писать далее. при этом потери на таких "прокладках"
незначительны. - Mahagam(23.10.2020 21:08)
- Красиво, но к старости перестал любить такие прокладочки. Чем
меньше уровней, тем лучше. - VLLV(23.10.2020 19:27)
- почему ? это не ось , это реализация которую описывал ниже )) - Aleksey_75(23.10.2020 18:51)
- вот где "сила": Tpoeшник(243 знак., 24.10.2020 00:49 - 11:06)
- Не люблю усложнять. В этом проекте светодиоды/подсвет мерцают с фиксированными частотами 10 Гц и 1 Гц, совпадающими с частотами стандартных событий. Если нужно специальная частота, то это делается внутри системного прерывания. VLLV(472 знак., 23.10.2020 18:34)
- Делаю такое на прототридах Дункелса и простых разностях (таймер -
сохраненное значение) Cкpипaч(496 знак., 23.10.2020 19:57, ссылка)
- А можно посмотреть пример управления светодиодом по схеме Tpoeшник(44 знак., 23.10.2020 18:18)
- Угу, вот такое УГ VLLV(3269 знак., 23.10.2020 17:50)
- Правильно ли я понимаю, что предлагается внутри прерывания
детектить ноль в счетчике программного таймера и генерить евент в
систему или некое прерывание? - Tpoeшник(23.10.2020 17:48)
- Нельзя, я тоже так делаю :) Но наверно так, как советует SciFi,
получится чуть быстрее. Если только это имеет значение :) - VLLV(23.10.2020 17:42)
- Спасибо! Я сомневался, что это правильно: инкремент или декремент
(в зависимости от реализации) переменной каждого таймера, сравнение
с заданным интервалом, флаг выставить при достижении и все это в
прерывании, я ведь помню "в прерывании не рожать - сунул-вынул и
бежать". А тут десяток (если таймеров много) -- или ++. - Peter_M(23.10.2020 16:55)
- Про прерывания есть точный критерий, который можно выразить в цифрах. Если время выполнения обработчика прерывания таково, что не позволяет вовремя успеть обработать что-то в другом месте программы, то что-то явно неправильно. Всё остальное — размахивание руками, сводящееся в конце концов к этому же. - SciFi(23.10.2020 17:39)
- Можно не соглашаться? - Tpoeшник(23.10.2020 17:34)
- напишу общий комментарий к выложенным примерам. Mahagam(389 знак., 23.10.2020 16:25)
- В случае с 1ms "системный тик" это 1000 Hz кажется. А зачем кто то
меняет этот самый тик? - Tpoeшник(23.10.2020 16:57)
- как зачем? у меня, например, в проекте на старте тик был 100Hz. и его разрешения хватало. а потом я потребовалось сделать 200Hz, хотя таймеров было уже натыкано достаточно. и нигде ничего менять не пришлось. - Mahagam(23.10.2020 17:27)
- Я менял с 1000 Гц на 10 кГц потому что так проще организовать поддержку периферии. - VLLV(23.10.2020 17:23)
- В случае с 1ms "системный тик" это 1000 Hz кажется. А зачем кто то
меняет этот самый тик? - Tpoeшник(23.10.2020 16:57)
- Мое решение выглядит следующим образом: evgeniy1294(3490 знак., 23.10.2020 15:57)
- Нужна очередь с приоритетом (priority queue), реализуется на
двоичной куче... Если таймеров буквально меньше десятка, то просто
односвязный список. В списке хранится абсолютное время
(относительно некой точки отсчёта, не важно какой), после которого
таймер должен сработать. Логика работы такая: fk0(1965 знак., 23.10.2020 15:43 - 15:51, ссылка)
- Воистину, у погромистов мозги набекрень... ))) Из любой элементарщины сделают "винду"... - my504(23.10.2020 16:42)
- Как-то сложно для микроконтроллеров. Легче вдуплить все таймеры в
массив, в прерывании отнять 1 от значения каждого софт-таймера и
если ноль вызвать калбек функцию (при её наличии) Boвa(141 знак., 23.10.2020 15:48)
- Да ничего сложного, у меня на PIC18 работало. Попозже код напишу.
Вот куча (очередь) -- сложно и не знаю как тут проще (если таймеров
100 штук). - fk0(23.10.2020 15:52)
- Да в принципе можно и так как вы пишите, но вместо односвязного
списка - очередь упорядоченная по оставшемуся времени. Сортировка
по времени происходит в момент добавления события. В момент
обработки события событие выбрасывается, и головой очереди
становится следующее. НО если нужно сформировать какую-то циклическую последовательной
действий очень все это не красиво будет. - Boвa(23.10.2020 16:02)
- Проблема линейной очереди -- гигантское время вставки если в
очереди 6144 таймеров, например. Кроме того API прикладного уровня
может иметь, например, функцию остановки/отмены запущенного
таймера. Т.е. нужны операции: 1) вставки в очередь, 2) извлечение
из головы очереди, 3) удаление произвольного элемента. Бинарная
куча выглядит диковато и перетряхивает вообще всю память, но у ней
худшее время понятно. Есть вариант со скип-листами, но там удалить
физически нельзя, только fk0(427 знак., 23.10.2020 20:49, ссылка)
- Есть замечательная статья, расписывающая возможные подходы к
организации списка таймеров - lloyd(23.10.2020 21:10, ссылка)
- "Simple Timing Wheels" -- это какой-то испорченный пересказ на тему bucket queue. Для которых известно, что они хорошо работают когда там распределение равномерное и/или число приоритетов -- небольшое. В нашем случае числа большие (32-битное время, например) и распределение явно не равномерное, все таймеры могут свалиться в один bucket. "Since there may be many timers in any given slot, we maintain an ordered list of timers for each slot..." -- и здесь мы возвращаемся к fk0(1897 знак., 23.10.2020 22:28, ссылка)
- Заводить 64К софтварных таймеров это новые
вершиныЭвересты говнокода. Я так не умею, увы. - Boвa(23.10.2020 21:06)- В этом и важное свойство библиотечных функций или функций ядра ОС,
что они не знают, что там у тебя. И способны работать и в таких
ситуациях. А для себя ты можешь сказать "мне в проекте достаточно
10 таймеров". А ядро ОС или библиотека не могут так сказать. - fk0(23.10.2020 21:10)
- Эта тема немного про другое. (См. старттопик.) - Boвa(23.10.2020 21:15)
- В этом и важное свойство библиотечных функций или функций ядра ОС,
что они не знают, что там у тебя. И способны работать и в таких
ситуациях. А для себя ты можешь сказать "мне в проекте достаточно
10 таймеров". А ядро ОС или библиотека не могут так сказать. - fk0(23.10.2020 21:10)
- Есть замечательная статья, расписывающая возможные подходы к
организации списка таймеров - lloyd(23.10.2020 21:10, ссылка)
- Проблема линейной очереди -- гигантское время вставки если в
очереди 6144 таймеров, например. Кроме того API прикладного уровня
может иметь, например, функцию остановки/отмены запущенного
таймера. Т.е. нужны операции: 1) вставки в очередь, 2) извлечение
из головы очереди, 3) удаление произвольного элемента. Бинарная
куча выглядит диковато и перетряхивает вообще всю память, но у ней
худшее время понятно. Есть вариант со скип-листами, но там удалить
физически нельзя, только fk0(427 знак., 23.10.2020 20:49, ссылка)
- Да в принципе можно и так как вы пишите, но вместо односвязного
списка - очередь упорядоченная по оставшемуся времени. Сортировка
по времени происходит в момент добавления события. В момент
обработки события событие выбрасывается, и головой очереди
становится следующее. НО если нужно сформировать какую-то циклическую последовательной
действий очень все это не красиво будет. - Boвa(23.10.2020 16:02)
- Да ничего сложного, у меня на PIC18 работало. Попозже код напишу.
Вот куча (очередь) -- сложно и не знаю как тут проще (если таймеров
100 штук). - fk0(23.10.2020 15:52)
- Какая еще библиотека? Вы не в состоянии написать инкремент
переменной со сравнением и сбросом? my504(493 знак., 23.10.2020 13:51)
- Я могу ошибаться в рассуждениях. Peter_M(691 знак., 23.10.2020 15:22)
- Системы с "тиком" -- не нужны, если это не time triggered
архитектура. См. мой ответ выше. Он даёт таймеры с минимальной
дискретностью (а не с тиками по 50мкс и сверхчастыми прерываниями).
Правильно, незачем вообще что-то инкрементировать. Поэтому вся
арифметика над абсолютным значением времени в будущем, а не над
временными интервалами (т.е. "проснуться когда время >=
13:00", а не "спать 3 часа"). Равно как и незачем за раз
обрабатывать более одного таймера, если их fk0(23 знак., 23.10.2020 15:49)
- А потом такой берет и переводит стрелки часов с 1 января 1970 года
в 2020 год. Или наоборот. lloyd(66 знак., 23.10.2020 19:55)
- Это само собой и обязательно. Я поэтому и написал -- время от момента старта прибора. Всегда нужно монотонное внутреннее время. Для включения чего-то по-расписанию использовать календарное время тоже нельзя. Верней можно, но функция которая "спит до такого-то календарного времени" получается достаточно сложной: fk0(1022 знак., 23.10.2020 21:05, ссылка)
- А потом такой берет и переводит стрелки часов с 1 января 1970 года
в 2020 год. Или наоборот. lloyd(66 знак., 23.10.2020 19:55)
- Какая точность нужна для выдержек времени? Обычно программные таймеры не требуют шести знаков точности. Исходя из потребной точности/разрешения следует выбрать максимальный интервал аппаратных прерываний. Если не инкрементировать частные таймеры, то придется сохранять стартовые значения софтовых таймеров и выполнять математику сравнения с единым таймером. Оно зачем? Никакой экономии не будет. Сплошная путаница. А так, назначили пересчет, сбросили тело таймера в коде (тело my504(109 знак., 23.10.2020 15:45)
- у меня подобное реализовано на регистрах сравнения таймера, также
можно устанавливать произвольные значения , при установке считываем
текущее значение счетчика , добавляем новое время, грузим в
свободный регистр сравнения, в таблицу кладем указатель на функцию
которую нужно ввызвать по таймауту! все работает аппаратное и не
жрет ресурсов! На 3 аппаратных таймера stm32 выходит 12 независимых
счетчиков - Aleksey_75(23.10.2020 15:36)
- Вы о каких ресурсах говорите? О вычислительных? А ничего, если
аппаратные гораздо ценнее, если речь идет о столь пустяковой
задаче? Вы предложили использовать не просто таймеры, а полноценные
таймеры с 4 каналами... Странный выбор... - my504(23.10.2020 15:55)
- вы предлагаете каждую ms парсить значения ? вот это действительно очень затратно! У меня это не пустяковая задача! Практически вся программа построена на отложенных функциях - Aleksey_75(23.10.2020 16:03)
- Вы о каких ресурсах говорите? О вычислительных? А ничего, если
аппаратные гораздо ценнее, если речь идет о столь пустяковой
задаче? Вы предложили использовать не просто таймеры, а полноценные
таймеры с 4 каналами... Странный выбор... - my504(23.10.2020 15:55)
- Системы с "тиком" -- не нужны, если это не time triggered
архитектура. См. мой ответ выше. Он даёт таймеры с минимальной
дискретностью (а не с тиками по 50мкс и сверхчастыми прерываниями).
Правильно, незачем вообще что-то инкрементировать. Поэтому вся
арифметика над абсолютным значением времени в будущем, а не над
временными интервалами (т.е. "проснуться когда время >=
13:00", а не "спать 3 часа"). Равно как и незачем за раз
обрабатывать более одного таймера, если их fk0(23 знак., 23.10.2020 15:49)
- Я могу ошибаться в рассуждениях. Peter_M(691 знак., 23.10.2020 15:22)
- а что за контроллер ? мож использовать регистры сравнения таймера? - Aleksey_75(23.10.2020 13:26)
- Обычно не нужно строго выдерживать период, достаточно "в следующий
раз через N мс или чуть позже". В этом случае удобно вот так: SciFi(424 знак., 23.10.2020 13:15)
- Ошибся малёха malek_(123 знак., 24.10.2020 16:07, )
- Или так malek_(206 знак., 24.10.2020 16:04, )
- Всё так, но здесь период ограничен значением INT_MAX, это в 2 раза
меньше, чем UINT_MAX (ограничение в моём примере). - SciFi(24.10.2020 16:11)
- Это да, но не всегда период нужен в 2 раза больше, а иначе находим компромисс между желаемым и возможным - malek_(24.10.2020 16:35, )
- Всё так, но здесь период ограничен значением INT_MAX, это в 2 раза
меньше, чем UINT_MAX (ограничение в моём примере). - SciFi(24.10.2020 16:11)
- Только лучше вместо Samx(115 знак., 23.10.2020 16:15)
- Подскажу еще один способ замеров интервалов времени. Без inc/dec
счетчиков. Для примера, ST HAL предоставляет время в ms посредством
функции HAL_GetTick(); Единожды запоминаем текущее время: static
uint32_t time_start = HAL_GetTick(); и далее в том месте где надо
проверить не вышло ли время, просто находим разницу между начальным
и текущим временем непосредственно в самом условии: if
(HAL_GetTick() RxTx(130 знак., 25.10.2020 16:10 - 18:41)