ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Вторник
24 февраля
1572245 Топик полностью
Nikolay_Po (Сегодня, 00:38, просмотров: 42)
Век живи - век учись. Не думал, что попадусь на таком инкременте в Си: 
uint32_t DSFSMtimer = 0;// Display state mashine timer

DSFSMtimer += 500e-3 * SystemClockSpeed;


По моей задумке, переменная DSFSMtimer, должна была приращиваться с переполнением. В примере - задержка на 500мс при тактовой системного таймера 48МГц. Каковым же было моё удивление, когда переменная ушла в насыщение, сломав работу задержки!

Вычисление двойной точности с плавающей точкой меня не пугают, так как делаются проходом препроцессора. Но не всё так просто.

Такое выражение, как вверху, накинуло почти тройку килобайт к весу прошивки.

Правильно оказалось так:


DSFSMtimer += (uint32_t)(500e-3 * SystemClockSpeed);


Иначе, по первому варианту, исходное значение таймера преобразовывалось в double, складывалось в double. А затем, результат, молча, преобразовывался в int32_t с насыщением, а не с переполнением. О как!

Отсюда и лишние три килобайта кода.

Обычно, компилирую с максимумом настроенных предупреждений, когда предупреждение считается ошибкой. Думаю, заметил бы жалобу на потенциальное искажение значения. А тут - проект выходного дня. Расслабился и использовал настройки проекта Mounriver Studio, MRS2 по умолчанию и на предупреждения не смотрел. Удивили осциллограммы...