Sprintf и значения с плавающей точкой на последовательном порту IAR - PullRequest
0 голосов
/ 12 марта 2019

У меня есть следующий фрагмент кода, который я компилирую на своем рабочем месте IAR.

// global declaration
float fval = 3.14f;
uint8_t uartTxBuffer [100];

void function(void)
{
  memset(uartTxBuffer,'\0',sizeof(uartTxBuffer);
  sprintf(uartTxBuffer,"\n\r Value is %f",fval);
  UartWrite(uart, uartTxBuffer,strlen(uartTxBuffer));
}

Вывод Value is %f // and not 3.14 Может кто-нибудь объяснить мне, в чем проблема в моем коде?Это функция Uartwrite или я делаю какую-то ошибку в использовании языка Си?Я попробовал тот же код, используя printf на Keil MDK, и он выводит правильное значение на последовательный терминал.Так это проблема IDE?Кто-нибудь может направить меня сюда?

1 Ответ

0 голосов
/ 12 марта 2019

После краткого исследования это выяснилось

https://www.iar.com/support/tech-notes/general/problems-with-printf-floating-point-f-on-arm/

Кажется, проблема в выравнивании байтов указателя стека.Установите точку останова на вызов sprintf () и проверьте значение указателя стека в отладчике.

Большинство ответов, которые я нашел, относятся к FreeRTOS (чего я не знаю, используете ли вы его):

разрыв sprintf под новым FreeRTOS

sprintf% f искажает стек

sprintf во FreeRTOS

Распространенным решением является использование

сторонней библиотеки с именем printf-stdarg.c, которая предоставляет крошечную реализацию print / sprintf / printf для использования в тех случаях, когда библиотеки, которыепоставляемый с компилятором слишком большой для небольшого встроенного использования

Я надеюсь, что это может помочь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...