Top.Mail.Ru
Уведомления
Очистить все

Непонятка с регистром RTOR в STM32F030F

(@yuriy)
Level 3

Для работы с 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. Можно было бы порадоваться и успокоиться, но остаётся беспокойство: "Не ударила бы эта "хорошая" непонятка в дальнейшем.


Цитата
Создатель темы Размещено : 24.02.2026 00:31
Aveal
(@aveal)
Top level Admin

У меня без ошибок собирается, какой именно текст ошибок?


ОтветитьЦитата
Размещено : 24.02.2026 12:30
(@yuriy)
Level 3

ОтветитьЦитата
Создатель темы Размещено : 24.02.2026 13:07
Aveal
(@aveal)
Top level Admin

По всей видимости для работы с float подтягиваются доп. библиотеки, которые не помещаются в обозначенную секцию. Здесь вообще лучше целыми числами оперировать, хотя бы так (только удостовериться, что не будет переполнения при умножении):

usart->RTOR = (baudRate * 175) / 100000 + 1;

baudRate, соответственно, тоже целое должно быть.


ОтветитьЦитата
Размещено : 24.02.2026 13:41
(@yuriy)
Level 3

Запись от: @aveal

usart->RTOR = (baudRate * 175) / 100000 + 1;

В точку - так работает. В программе у меня уже есть вещественное деление uint32_t / uint32_t, причём значения под полную завязку. И к нему компилятор не имеет претензий и результат адекватный. Пока писал возник вопрос, что лучше. Деление вещественных чисел или переменные перевести в  uint64_t и применить целочисленное деление с последующим нормированием. Ну, и для общего развития: почему с int32_t компиляция проходит нормально?


ОтветитьЦитата
Создатель темы Размещено : 24.02.2026 14:07
Aveal
(@aveal)
Top level Admin

@yuriy возможно для int32_t где-то в другом месте программы и так есть подобные операции, поэтому новая строка ничего не меняет. Можно все детали в map-файле или в ассемблерных инструкциях посмотреть/сравнить.

В данном случае, поскольку памяти не так много и нет FPU, то лучше везде по возможности оперировать с целыми значениями.


ОтветитьЦитата
Размещено : 24.02.2026 14:49
(@yuriy)
Level 3

Запись от: @aveal

В данном случае, поскольку памяти не так много и нет FPU, то лучше везде по возможности оперировать с целыми значениями.

В плане компиляции понятно, но по времени где будет быстрее? Спасибо за советы.


ОтветитьЦитата
Создатель темы Размещено : 24.02.2026 15:46
Aveal
(@aveal)
Top level Admin

@yuriy Вот как раз без FPU с float будет намного медленнее.


ОтветитьЦитата
Размещено : 24.02.2026 16:32
Поделиться:
Обзор конфиденциальности

На этом сайте используются файлы cookie, что позволяет нам обеспечить наилучшее качество обслуживания пользователей. Информация о файлах cookie хранится в вашем браузере и выполняет такие функции, как распознавание вас при возвращении на наш сайт и помощь нашей команде в понимании того, какие разделы сайта вы считаете наиболее интересными и полезными.