Gnu — плавание руки в строку (sprintf)

Я использую руку 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

Работает с KC_UART_sendstring(LPC_UART0, "number is 1.100 ");?

pmg 19.07.2019 14:58

Откуда вы знаете, что sprintf() "не работает"?

Armali 19.07.2019 15:05

программа не может выполнить sprintf, и она останавливается на этой строке, если я добавляю u_printf_float в опцию компоновщика. если я прокомментирую sprintf, он отправляет номер 1.100 с uart. если я удалю u_printf_float в опции компоновщика, программа не остановится на строке sprintf и не будет выполняться, пока (1) и номер отправки будет 1.100.

Flamador 19.07.2019 15:08

Вы указали формат печати для int_FP? (community.nxp.com/thread/44262#comment-375421). Небольшое замечание: используйте snprintf ;-)

dceccon 19.07.2019 15:09

У меня нет вкладки библиотекаря, поэтому я не могу найти, где добавить int_fp.

Flamador 19.07.2019 15:17

Спецификатор формата %f ожидает double, а не `float. Try double`.

Codo 19.07.2019 15:41

Просто удвойте его: sprintf(msg , "number is %.3f ", (double)flt);

Codo 19.07.2019 15:51

извините, я пытаюсь заменить float на double, но это снова не работает

Flamador 19.07.2019 15:58

Вы включили stdio.h? Насколько велик ваш стек?

Eugene Sh. 19.07.2019 16:19

Да, stdio.h включен. Я понятия не имею о размере стека. Как я могу проверить размер стека?

Flamador 19.07.2019 16:35

Вам нужно проверить скрипт компоновщика

Eugene Sh. 19.07.2019 16:59

__Main_Stack_Size = 1024;

Flamador 19.07.2019 17:05

Этого может быть недостаточно. Вы используете четверть только для своего msg. sprintf также довольно требователен. Попробуйте удвоить.

Eugene Sh. 19.07.2019 17:10

Я пытаюсь увеличить размер стека и переопределить msg[50], но это не работает.

Flamador 19.07.2019 17:23
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
14
1 181
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Глядя на Техническое описание LPC1769, я не вижу никаких ФПУ.

Итак, если нет ФПУ, как вы справляетесь floats?

  • купить новый чип с FPU
  • код без поплавка
  • программное обеспечение FPU, но обратите внимание, что ваша программа будет страдать от проблем с производительностью (скорость, ОЗУ)

Код без поплавка

использовать делитель и делимое. Пи просто unsigned pi_x_1000000 = 3141593;

затем, если вы хотите вычислить что-то вроде периметра круга,

unsigned circumference = (pi_x_1000000 * 2 * radius) / 1000000;

Примечание: ваш чип может стоить 12$, он ограничен по скорости/ОЗУ, и, в зависимости от того, чего вы хотите добиться с его помощью, вы можете рассмотреть возможность использования другого решения, кроме программного FPU. В промышленности мы не используем поплавки из-за проблем с затратами и производительностью.

это Cortex M3, а не M3F!

Guillaume D 19.07.2019 15:27

какие альтернативы я могу использовать?

Flamador 19.07.2019 15:33

Если у микроконтроллера нет FPU, это не значит, что он не может выполнять операции с плавающей запятой. Операции с плавающей запятой также можно выполнять в программном обеспечении. Компилятор специально поддерживает параметры -mfloat-abi=soft и -mfloat-abi=softfp.

Codo 19.07.2019 15:39

... и вам не нужно менять код: об этом позаботится компилятор.

Codo 19.07.2019 15:45

@GuillaumeD См. gcc.gnu.org/onlinedocs/gcc/ARM-Options.html. Это софтфп.

S.S. Anne 19.07.2019 15:53

Я думаю, что типы ABI называются мягкий поплавок и плавающий, но параметры командной строки называются мягкий, софтфп и жесткий. На указанной странице написано: Допустимые значения: «soft», «softfp» и «hard».

Codo 19.07.2019 15:56

"softfp" для гибрида, но если у вас нет FPU... гибрид означает FPU и программное обеспечение.... embedartistry.com/blog/2017/10/9/…

Guillaume D 19.07.2019 15:57

прочитайте вашу ссылку, в ссылке, которую вы мне дали: «softfp позволяет генерировать код с использованием аппаратных инструкций с плавающей запятой»

Guillaume D 19.07.2019 16:00

Я пытаюсь добавить -mfloat-abi=soft в компоновщик и не работает, так же как и -mfloat-abi=softfp не работает. Правда ли, что я добавляю их в параметры компоновщика

Flamador 19.07.2019 16:20

Этот ответ, похоже, не решает реальной проблемы, и мне непонятно, почему он принят.

Eugene Sh. 19.07.2019 16:21

этот ответ актуален, потому что @Flamador был заинтересован в использовании float, но не знал о недостатках использования float во встроенных системах.

Guillaume D 19.07.2019 16:53

Другие вопросы по теме