Перейти к содержанию
    

Во всех своих проектах пользуюсь выводом отладочных сообщений, в том числе выводом значений переменных. Float переменные обычно вывожу printf("%.2f\n", val); - таким методом пользуюсь и на L0, и на F4 контроллерах, и через UART и через SWO интерфейс.

 

Однако на STM32F205 контроллере не работает, как надо, например printf("%.2f\n", 1.0f); выводит 0.00, при этом в настройках линкера включено

-specs=nano.specs  -u _printf_float

 

Что ни так с этим контроллером?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

С выводом чисел с плавающей точкой была только одна проблема - адрес дна стека должен быть кратен 8. У вас оно пришет 0.00, то есть оно распознало модификатор %f и что-то вывело. Но вывело явно не то, вероятнее всего потому, что переменная оказалась не в том месте, где ее ожидал printf.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

С выводом чисел с плавающей точкой была только одна проблема - адрес дна стека должен быть кратен 8. У вас оно пришет 0.00, то есть оно распознало модификатор %f и что-то вывело. Но вывело явно не то, вероятнее всего потому, что переменная оказалась не в том месте, где ее ожидал printf.

никаких переменных

 

printf("%f\n", 1.0f); выводит 0.000000

а printf("%f\n", 1.1f); выводите -0.000000

Изменено пользователем k000858

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А куда ж эти цифирки-то кладутся, если не в стек?!

Как куда? В регистры.

Стек используется в функциях плавучки. Если нет выравнивания стека по 8 байтам, то происходят чудеса.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

спасибо. проблема решена.

 

причина озвучена выше: адрес стека не был выровнен

 

вопрос в тему: выравнивание адреса указателя стека к 8 должно быть обязательно на всех типах ядер (конкретно STM32L0, STM32F4) ?

во любых типах проектов или только в тех, что используют newlib для print/sprint ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вопрос в тему: выравнивание адреса указателя стека к 8 должно быть обязательно на всех типах ядер (конкретно STM32L0, STM32F4) ?

во любых типах проектов или только в тех, что используют newlib для print/sprint ?

Это требование ARM EABI. На практике косяки вылазили только с плавучкой, но для порядка надо везде.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это требование ARM EABI. На практике косяки вылазили только с плавучкой, но для порядка надо везде.

спасибо за разъяснения

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это называется долбаные даблы. И от них никуда не деться, если принтфить флоаты.

Каждый раз как об этом подумаю - злюсь...

 

Такие же траблы были бы если выводился тип long long.

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

Если всегда не более 4 байт - то и с выравниванием на 4 всё должно работать нормально.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это называется долбаные даблы. И от них никуда не деться, если принтфить флоаты.

Каждый раз как об этом подумаю - злюсь...

Теоретически можно сделать ключик компилятора "treat double as float" и собирать стандартную библиотеку с этой опцией. Но пока никто не озаботился :laughing:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

спасибо. проблема решена.

 

причина озвучена выше: адрес стека не был выровнен

 

вопрос в тему: выравнивание адреса указателя стека к 8 должно быть обязательно на всех типах ядер (конкретно STM32L0, STM32F4) ?

во любых типах проектов или только в тех, что используют newlib для print/sprint ?

Разрешите поинтересоваться, а как у вас получилось, что адрес стека оказался не выровнен? И в какой IDE вы работаете? У меня такого ни разу не было, ни в одном проекте.

Изменено пользователем Pridnya

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В знаете, что можно и без IDE вовсе работать. Всё с командной строки и правки править руками и исходники и файл линкера и правила сборки и стартап файл.

Основная масса открытого софта именно так и реализована.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В знаете, что можно и без IDE вовсе работать. Всё с командной строки и правки править руками и исходники и файл линкера и правила сборки и стартап файл.

Основная масса открытого софта именно так и реализована.

Я знаю, что можно в простейшем текстовом редакторе работать...с exe-шниками для командной строки, и браузер самому можно написать, но я об этом не спрашивал. Если вы хотели сказать, что из-за такого "открытого" софта (частично открытого для лица его использующего) и появилась ошибка "невыровненный адрес стека", то я с вами соглашусь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Дальнейшее обсуждение считаю бессмысленным.

Чего не знаю, того не существует - этот лозунг не для меня.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...