Если мы в программе хотим посчитать большой интервал времени, можно обратиться к системным часам. Прошло пять лет с момента запуска программы или не прошло? Сейчас узнаем.
Если мы измеряем небольшие интервалы -- к нашим услугам таймеры. В 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-разрядную сетку.
То есть, засечь более длинные интервалы таким способом попросту невозможно. В этом и была причина ошибки.
И эта ошибка не исправима. Надо переделывать подход. Скорее всего, придётся настраивать "настоящий" таймер.
Если мы измеряем небольшие интервалы -- к нашим услугам таймеры. В 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-разрядную сетку.
То есть, засечь более длинные интервалы таким способом попросту невозможно. В этом и была причина ошибки.
И эта ошибка не исправима. Надо переделывать подход. Скорее всего, придётся настраивать "настоящий" таймер.
28.04.2023 в 21:42
30.04.2023 в 20:23
17.05.2023 в 21:34