Для работы с RS485 в интернете для записи значения задержки в регистр RTOR не раз встречалась такая строка:
usart -> RTOR = 0.00175 * baudRate + 1;
У меня она вызывает три ошибки, последняя из которых такая: make: *** [makefile:70: SysQuad.elf] Error 1. Если usart -> RTOR присваевается константа, компиляция проходит без ошибок. Недоумение даже не в этом. Подстилаю соломку и записываю её в так:
usart -> RTOR = (uint32_t)(0.00175 *(float) baudRate) + 1;
И это тоже вызывает ошибку. Случайно вместо uint32_t записываю int32_t и, о чудо, - компиляция проходит без ошибок. Для меня это совершенно не понятная ситуация, поскольку RTOR определён как uint32_t. Можно было бы порадоваться и успокоиться, но остаётся беспокойство: "Не ударила бы эта "хорошая" непонятка в дальнейшем.
У меня без ошибок собирается, какой именно текст ошибок?
По всей видимости для работы с float подтягиваются доп. библиотеки, которые не помещаются в обозначенную секцию. Здесь вообще лучше целыми числами оперировать, хотя бы так (только удостовериться, что не будет переполнения при умножении):
usart->RTOR = (baudRate * 175) / 100000 + 1;
baudRate, соответственно, тоже целое должно быть.
usart->RTOR = (baudRate * 175) / 100000 + 1;
В точку - так работает. В программе у меня уже есть вещественное деление uint32_t / uint32_t, причём значения под полную завязку. И к нему компилятор не имеет претензий и результат адекватный. Пока писал возник вопрос, что лучше. Деление вещественных чисел или переменные перевести в uint64_t и применить целочисленное деление с последующим нормированием. Ну, и для общего развития: почему с int32_t компиляция проходит нормально?
@yuriy возможно для int32_t где-то в другом месте программы и так есть подобные операции, поэтому новая строка ничего не меняет. Можно все детали в map-файле или в ассемблерных инструкциях посмотреть/сравнить.
В данном случае, поскольку памяти не так много и нет FPU, то лучше везде по возможности оперировать с целыми значениями.
В данном случае, поскольку памяти не так много и нет FPU, то лучше везде по возможности оперировать с целыми значениями.
В плане компиляции понятно, но по времени где будет быстрее? Спасибо за советы.