zHz00 Untitled

пятница, 28 апреля 2023
03:17 Козлёнок, который умел считать до двадцати одного
Если мы в программе хотим посчитать большой интервал времени, можно обратиться к системным часам. Прошло пять лет с момента запуска программы или не прошло? Сейчас узнаем.

Если мы измеряем небольшие интервалы -- к нашим услугам таймеры. В Windows это, как правило, QueryPerformanceCounter().

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

Вот это убойная вещь. Блоки таймеров сначала надо настроить, потом запустить, потом за ними следить. Или настроить прерывание.

Счётчик тактов работает проще. Считываем первый раз -- начало интервала. Считываем второй -- конец интервала. Вычитаем и получаем искомое.

Мне надо было отмерять таймаут по 30 секундам. Прошло 30 секунд -- завершаем операцию. Частота МК -- 200 МГц. Сколько тактов мы насчитаем за 30 секунд? Очевидно, 30*200'000'000=6'000'000'000. И да, я поставил разделитель между тысячами.

Счётчик я сделал, но от срабатывал неправильно. Когда я получал число миллисекунд, оно оказывалось равно 21474. Это слишком мало.

21 секунда... а сколько это в тактах процессора? И это было 4'294'800'000. Хм, четыре с небольшим миллиарда. Где я уже видел это число?

А число 4'294'967'296 вам ни о чём не говорит? Это двойка в 32 степени.

Счётчик тактов процессора 32-разрядный и переполняется каждую 21 секунду! А 30 секунд это 6 миллиардов, и такое число не помещается в 32-разрядную сетку.

То есть, засечь более длинные интервалы таким способом попросту невозможно. В этом и была причина ошибки.

И эта ошибка не исправима. Надо переделывать подход. Скорее всего, придётся настраивать "настоящий" таймер.

@темы: Программирование, Борьба с техникой

URL
Существуют ли слепо-глухо-немые люди? Не ставшие такими, ...
Иногда, читая древние корекские летописи, представлюешь е...
Алекс, не мог сразу сказать, что-ли, что хрен мне что све...
Корейская собака снова в строю! Долго меня мучил вопрос,...
Пока что о молодежной. На данный момент жутко популярны х...
у нас в инсте на прошлой неделе проректор умер...я все по...

28.04.2023 в 21:42

28.04.2023 в 21:42
Тоже мне, проблема) Считай количество переполнений этого счётчика. У тебя же явно проверки происходят чаще чем раз в 21 секунду. %)
URL

30.04.2023 в 20:23

30.04.2023 в 20:23
Отмеряй два раза по 15.
URL

17.05.2023 в 21:34

17.05.2023 в 21:34
Xersareeth, Foul thing, да, думал над подобными решениями, но однозначно пока не придумал.
URL
Добавить комментарий

Расширенная форма

Подписаться на новые комментарии
Получать уведомления о новых комментариях на E-mail