Я использую руку gnu на eclipse (lpc1769 m3 cortex). Я хочу преобразовать значение с плавающей запятой в строку с помощью sprintf, но это не работает.
Я добавляю -u_printf_float в опцию компоновщика, но это не сработало. Как я могу решить?
int main(void) {
InitBoard();
float flt = 1.1;
char msg[256];
sprintf(msg , "number is %.3f ", flt);
while (1){
KC_UART_sendstring(LPC_UART0, msg);
delay_ms(500);
}
}
это мой вариант компоновщика
-T "C:\Users**имя пользователя**\Eclipse-workspace\Test_1\ldscript\LPC17xx.ld" -Xlinker --gc-sections -L"C:\Users**имя пользователя**\AppData\Roaming\xPacks @gnu-mcu-eclipse\arm-none-eabi-gcc\7.2.1-1.1.5.content\arm-none-eabi\lib\thumb\v7-m" -Wl,-Map,"Test_1.map" --specs=nano.specs -u_printf_float
Откуда вы знаете, что sprintf() "не работает"?
программа не может выполнить sprintf, и она останавливается на этой строке, если я добавляю u_printf_float в опцию компоновщика. если я прокомментирую sprintf, он отправляет номер 1.100 с uart. если я удалю u_printf_float в опции компоновщика, программа не остановится на строке sprintf и не будет выполняться, пока (1) и номер отправки будет 1.100.
Вы указали формат печати для int_FP? (community.nxp.com/thread/44262#comment-375421). Небольшое замечание: используйте snprintf ;-)
У меня нет вкладки библиотекаря, поэтому я не могу найти, где добавить int_fp.
Спецификатор формата %f ожидает double, а не `float. Try double`.
Просто удвойте его: sprintf(msg , "number is %.3f ", (double)flt);
извините, я пытаюсь заменить float на double, но это снова не работает
Вы включили stdio.h? Насколько велик ваш стек?
Да, stdio.h включен. Я понятия не имею о размере стека. Как я могу проверить размер стека?
Вам нужно проверить скрипт компоновщика
__Main_Stack_Size = 1024;
Этого может быть недостаточно. Вы используете четверть только для своего msg. sprintf также довольно требователен. Попробуйте удвоить.
Я пытаюсь увеличить размер стека и переопределить msg[50], но это не работает.





Глядя на Техническое описание LPC1769, я не вижу никаких ФПУ.
Итак, если нет ФПУ, как вы справляетесь floats?
Код без поплавка
использовать делитель и делимое.
Пи просто unsigned pi_x_1000000 = 3141593;
затем, если вы хотите вычислить что-то вроде периметра круга,
unsigned circumference = (pi_x_1000000 * 2 * radius) / 1000000;
Примечание: ваш чип может стоить 12$, он ограничен по скорости/ОЗУ, и, в зависимости от того, чего вы хотите добиться с его помощью, вы можете рассмотреть возможность использования другого решения, кроме программного FPU. В промышленности мы не используем поплавки из-за проблем с затратами и производительностью.
это Cortex M3, а не M3F!
какие альтернативы я могу использовать?
Если у микроконтроллера нет FPU, это не значит, что он не может выполнять операции с плавающей запятой. Операции с плавающей запятой также можно выполнять в программном обеспечении. Компилятор специально поддерживает параметры -mfloat-abi=soft и -mfloat-abi=softfp.
... и вам не нужно менять код: об этом позаботится компилятор.
@GuillaumeD См. gcc.gnu.org/onlinedocs/gcc/ARM-Options.html. Это софтфп.
Я думаю, что типы ABI называются мягкий поплавок и плавающий, но параметры командной строки называются мягкий, софтфп и жесткий. На указанной странице написано: Допустимые значения: «soft», «softfp» и «hard».
"softfp" для гибрида, но если у вас нет FPU... гибрид означает FPU и программное обеспечение.... embedartistry.com/blog/2017/10/9/…
прочитайте вашу ссылку, в ссылке, которую вы мне дали: «softfp позволяет генерировать код с использованием аппаратных инструкций с плавающей запятой»
Я пытаюсь добавить -mfloat-abi=soft в компоновщик и не работает, так же как и -mfloat-abi=softfp не работает. Правда ли, что я добавляю их в параметры компоновщика
Этот ответ, похоже, не решает реальной проблемы, и мне непонятно, почему он принят.
этот ответ актуален, потому что @Flamador был заинтересован в использовании float, но не знал о недостатках использования float во встроенных системах.
Работает с
KC_UART_sendstring(LPC_UART0, "number is 1.100 ");?