реклама на сайте
подробности

 
 
4 страниц V  « < 2 3 4  
Reply to this topicStart new topic
> Программный таймер, как красиво обойти переполнение?
Integro
сообщение Apr 1 2015, 11:50
Сообщение #46


Частый гость
**

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



Цитата(SSerge @ Apr 1 2015, 13:16) *

Спасибо за ответ, я уже так же нашел пару сносок на буржуйских форумах.
Go to the top of the page
 
+Quote Post
SSerge
сообщение Apr 1 2015, 14:13
Сообщение #47


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Почитал ради интереса библиотеки stm32cubef4.
Там есть замечательная функция void HAL_Delay(__IO uint32_t Delay) и куча мест где таймауты проверяются прямо в коде аналогичным образом.
Тех кто рискнёт пользоваться этим "программным продуктом" ждёт жестокий облом через 49 дней, 17часов, 2 минуты и 47 секунд.
Повбивав би ...

Моя версия таймера:
Код
extern "C" uint32_t GetTime(); // возвращает системное время, 1тик=1мс

class Csofttimer
{
    uint32_t Timeout;
public:
    bool timeout(){return (int)(Timeout-GetTime()) <= 0;  };
    void settimer(uint32_t time){Timeout = GetTime()+time;};
};


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Apr 1 2015, 15:51
Сообщение #48


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Цитата
У меня тут тоже с коллегами разгорелся спор, можно ссылку на стандарт с упоминанием этой гарантии, не могу найти.

нафига стандарт то?
просто вычтите одно без знаковое из другого, и посмотрите что получилось в итоге если считать результат без знаковым.
Это гарантия не стандарта, а устройства числа...
Go to the top of the page
 
+Quote Post
scifi
сообщение Apr 1 2015, 19:28
Сообщение #49


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Golikov A. @ Apr 1 2015, 18:51) *
нафига стандарт то?
просто вычтите одно без знаковое из другого, и посмотрите что получилось в итоге если считать результат без знаковым.

Да! Только хардкор, только реверс-инжиниринг языка Си! disco.gif
Мануалы придумал трус! 08.gif
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Apr 1 2015, 19:44
Сообщение #50


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Причем тут это?
Покажите мне место в стандарте где написано что 2+4=6?
или место где написано 2+4=4+2

есть вещи которые описаны не стандартом а здравым смыслом и физикой природы...
так вот на пальцах

если у нас есть без знаковое от 0 до 15
2 - 12 = -10
а -10 имеет представление 0x6, что в без знаковом представлении просто 6, а теперь считаем сколько прошло с 12 до 2..
13 14 15 0 1 2 - вот и ответ... 6.
Так факт того что без знаковые не переполняются это свойства представления числа и принципов работы арифметики в компутере, а не стандарт языка...
Go to the top of the page
 
+Quote Post
Integro
сообщение Apr 1 2015, 20:25
Сообщение #51


Частый гость
**

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



Да, я полностью с вами согласен, но аргумент "здравый смысл" в моем случае не прокатил, да и не професcиональный аргумент, поэтому мне понадобилось хоть какое-то сноски.
Go to the top of the page
 
+Quote Post
scifi
сообщение Apr 1 2015, 21:26
Сообщение #52


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Golikov A. @ Apr 1 2015, 22:44) *
есть вещи которые описаны не стандартом а здравым смыслом и физикой природы...

Ага, "физика природы". А как насчёт порядка вычисления операндов в выражении? А если стандарт говорит, что этот порядок в данном случае не определён? А реверс-инжиниринг показал какой-то порядок? А завтра порядок изменился, потому что фаза Луны сменилась или что-то в этом духе? Может быть, лучше было мануал почитать?
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Apr 2 2015, 06:40
Сообщение #53


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Вам нравиться слово реверс инжиниринг?

Данный вопрос не имеет отношения к экспериментальному установлению истины, которую и я считаю весьма зыбкой в условиях проф разработки.

Если на данный вопрос и есть ответ то не в стандартах С, а в стандартах представления двоичного числа и реализации операции вычитания.

ответ добывается так
1. представление числа в 2-ичном виде. Берем 2 числа, и 4 битную арифметику, числа 2 и 12 представляются как 0010 и 1100 - надеюсь тут не будет ремарки про реверс инжиниринг? Документальное подтверждение что числа представляются так надо искать в разделах математики.
2. Реализация вычитания, как сложение с дополнительным кодом числа. Тут опять я надеюсь обойдемся без реверс инжиниринга, документальное подтверждение не знаю где, в каких то книгах по информатики
и того 2 - 12 == 2 + @12 так я обозначил доп код 12.
2 == 0010, @12 == @1100 == (~(1100) + 1) == 0011 + 1 == 0100
3. Сложение 2 ичных числе, документальное подтверждение в разделах математики, реверс инжиниринг не применяем

2 - 12 == 2 + @12 == 0010 + @1100 == 0010 + 0100 == 0110 = 6


Теперь у меня вопрос к реверс инжинеру, что я сделал не так?

В данном конкретном случае просто так получается, это здравый смысл физики нашей природыsm.gif))) и никакого реверса...


Со знаковыми так не выходит, потому что в 4 битах у них только пол диапазона, то есть дойдя до 0111 до 7, они пойдут дальше до 1000, но в знаковом это -8. Надо понять главное это все представление чисел, это не их значения. Значения у них всегда одно оно не меняется, просто мы решили что 1000 - это -8 для знакового и 8 для без знакового, просто решили все операции происходят с двоичным исходником, всегда одинаково.

То есть важно понять что нет никакой магии или особо указания в том что мы вычитаем именно без знаковые, компилятор не делает ничего особенного увидев эту запись, он делает все те же операции что и обычно, просто результат представляет по другому. Получив в ходе вычитания 1000 для знакового результата он скажет что это -8, а для без знакового скажет что это +8 и все!
Go to the top of the page
 
+Quote Post

4 страниц V  « < 2 3 4
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th June 2025 - 01:12
Рейтинг@Mail.ru


Страница сгенерированна за 0.0141 секунд с 7
ELECTRONIX ©2004-2016