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 по умолчанию и на предупреждения не смотрел. Удивили осциллограммы...