|
|
  |
Программный таймер, как красиво обойти переполнение? |
|
|
|
Oct 28 2014, 20:13
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(Ruslan-maniak @ Oct 28 2014, 19:52)  Да, цель именно выжать максимальную оптимизацию как по времени так и по памяти. В нынешних железах это конечно не принципиально. Но просто хочет это мой внутренний перфекционист. Получается, что это чисто теоретическое упражнение. И правильное решение одно: ассемблер. А на практике за такие потуги надо очень больно бить по рукам, ибо, как известно, "преждевременная оптимизация - корень всех зол". Цитата(Ruslan-maniak @ Oct 28 2014, 19:52)  А использовать таймер на 25 дней - это как-то странно по моему. Для таких масштабов есть RTC. Не спешите. В очень многих кортексах есть счётчик циклов DWT_CYCCNT, и он очень удобен для этих самых задержек. Причём в МК из серии LPC43xx с частотой 204 МГц он переполняется каждые 21 сек.
|
|
|
|
|
Oct 29 2014, 04:54
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Ruslan-maniak @ Oct 29 2014, 09:38)  jcxz, вы предложили то же самое: использовать 2 переменных. Где Вы углядели 2-ю? Вроде всего одна: t. Цитата(Ruslan-maniak @ Oct 29 2014, 09:38)  Побейте тогда по рукам ещё и создателей библиотек которые оптимизируют свои творения до применения в реальных проектах. scifi Вам дело говорит. 1. Кто занимается оптимизацией инкремента переменной  , не пишут реальных проектов. 2. Кто пишет реальные проекты, не занимаются оптимизацией инкремента.
|
|
|
|
|
Oct 29 2014, 05:34
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Давайте поглядим Плюсы минусы вашей оптимизации Минусы 1. Меньший диапазон возможных значений в 2 раза 2. Строго говоря есть необходимость отметить это в документации, и возможные ошибки при использовании функции тем кто не в курсе. 3. Поскольку потери случаются на длинном конце использования, то еще долгий процесс выявления ошибки 4. Необходимость кучи объяснений почему вы сделали так а не иначе в коде Плюсы 1. Вы выиграли 4 байта памяти. Даже если взять древний проц с каким нибудь 2 КБайтами памяти, то вы выиграли ~0.2% ресурса с каждого таймера. Для обычных кортексов с 48 Кбайтами 0.008% В целом неплохо потрудились
|
|
|
|
|
Oct 29 2014, 08:13
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Ruslan-maniak @ Oct 29 2014, 11:31)  Считайте по пальцам из вашего примера: переменная "t" - РАЗ, переменная "TOUT" - ДВА. Про второй пункт вашего поста я промолчу. С чего вы взяли что TOUT это обязательно переменная??? Под TOUT имелось в виду выражение. Откройте любой учебник по си чтобы узнать значение термина expression.
|
|
|
|
|
Oct 29 2014, 08:53
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
1. Почему нет, я участвовал в разработке системы которая работала автономно несколько лет без сбоев, повисаний, перезагрузок. При этом у нее был миллисекундный таймер для внутреннего времени (по ряду причин РТС использовать было нельзя), и почему бы раз в месяц этой системе не синхронизировать с центром время, данные и прочее? 1.1. Вы пишите что-то только один раз? На реюзинг не рассчитываете? Почему вы уверены что ваш код не запустят для микросекундного или наносекундного таймера?
2. Вы не застали замечательную ошибку паскаля который для delay в начале работы программы делал калибровку. Он брал цикл в сколько-то тактов и считал сколько милсекунд ушло на него, потом делил одно на другое и получал калиброванное значение чтобы точнее делать delay. Где то в районе 90 годов, все программы сделанные на этом паскале хором перестали работать. Потому что частота процов так возросла, что отведенный цикл стал выполнятся за 0 мСек, и деление на 0 давало ошибку. Уверен что те кто писал библиотечную функцию тоже заложились что процы же не станут в 1000 раз быстрее)
Мораль - потенциально кривое решение, рано или поздно вылезет, так что если есть какие-то ограничения они должны быть обложены асертами, описанием и прочее. В противном случае выгода от оптимизации нивелируется потенциальными граблями. Это как фасад здания покрасить, а внутри помойку устроить.
3. Сделайте вашим методом паузу больше половины интервала. Там можно так исхитриться что при заданной частоте проверок и интервале, оно будет так переполнятся что в 90% случаев все будет ок, а в 10% будет второй круг. И его ловить - это задача с подвохом...
4. странные и не очевидные ходы требует больше слов для их оправдания...
решение для ТС приведено сразу же в начальных постах, оно его устроило и оно является очевидно правильным.
|
|
|
|
|
Apr 1 2015, 08:55
|

Частый гость
 
Группа: Свой
Сообщений: 167
Регистрация: 25-12-09
Из: Минск
Пользователь №: 54 460

|
Цитата(scifi @ Jan 24 2014, 13:49)  +1. Кстати, стандарт Си гарантирует, что при вычитании (unsigned int) - (unsigned int) результат будет корректным, пока разница во времени не превышает те самые 50 дней (для 32 бит), несмотря на переполнение первой или второй переменной. У меня тут тоже с коллегами разгорелся спор, можно ссылку на стандарт с упоминанием этой гарантии, не могу найти.
|
|
|
|
|
Apr 1 2015, 10:16
|
Профессионал
    
Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528

|
Цитата(Integro @ Apr 1 2015, 15:55)  У меня тут тоже с коллегами разгорелся спор, можно ссылку на стандарт с упоминанием этой гарантии, не могу найти. В стандарте С (6.2.5.9) есть такой текст: Цитата The range of nonnegative values of a signed integer type is a subrange of the corresponding unsigned integer type, and the representation of the same value in each type is the same.33)A computation involving unsigned operands can never overflow, because a result that cannot be represented by the resulting unsigned integer type is reduced modulo the number that is one greater than the largest value that can be represented by the resulting type. А стандарт С++ в (3.9.1) содержит такой текст: Цитата Unsigned integers shall obey the laws of arithmetic modulo 2n where n is the number of bits in the value representation of that particular size of integer. и ниже примечание, совпадающее по смыслу с текстом из стандарта С, про арифметику по модулю 2 n. Впрочем всё это фигня и словесная эквилибристика. А правда жизни состоит в том, что все эти свойства и поведение знаковых и беззнаковых типов диктуются устройством АЛУ и принятым в подавляющем большинстве современных машин представлением знаковых целых в так называемом "двоичном коде с дополнением до 2". Преимущество такого представления - то что АЛУ работает совершенно одинаково, а разница signed/unsigned учитывается только при интерпретации признаков переполнения и переноса ( C и V ), и при многоразрядной арифметике, для правильно учёта переноса из младшего слова в старшее. Изначально С неявно предполагал именно такое представление целых (как и сделано в PDP-11, на которых он изначально появился). Альтернативные представления уже тогда были редкостью. Все более поздние изменения стандартов в части целочисленной арифметики и сдвигов просто витиевато выражают простую мысль: "делайте что хотите, но результат должен быть такой же как на "нормальных" процессорах использующих код с дополнением до двойки". То есть сначала было придумано АЛУ, работающее с неотрицательными целыми числами, потом придумано как представлять отрицательные числа так, чтобы не переделывать АЛУ, а уж потом сочинители стандартов попытались описать что получилось так как они умеют это делать.
--------------------
Russia est omnis divisa in partes octo.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|