|
STM32F2: printf (float) |
|
|
|
Dec 8 2016, 04:53
|

Местный
  
Группа: Участник
Сообщений: 319
Регистрация: 31-01-12
Пользователь №: 69 978

|
Во всех своих проектах пользуюсь выводом отладочных сообщений, в том числе выводом значений переменных. Float переменные обычно вывожу printf("%.2f\n", val); - таким методом пользуюсь и на L0, и на F4 контроллерах, и через UART и через SWO интерфейс. Однако на STM32F205 контроллере не работает, как надо, например printf("%.2f\n", 1.0f); выводит 0.00, при этом в настройках линкера включено Код -specs=nano.specs -u _printf_float Что ни так с этим контроллером?
|
|
|
|
|
Dec 8 2016, 07:17
|

Местный
  
Группа: Участник
Сообщений: 319
Регистрация: 31-01-12
Пользователь №: 69 978

|
Цитата(Сергей Борщ @ Dec 8 2016, 10:01)  С выводом чисел с плавающей точкой была только одна проблема - адрес дна стека должен быть кратен 8. У вас оно пришет 0.00, то есть оно распознало модификатор %f и что-то вывело. Но вывело явно не то, вероятнее всего потому, что переменная оказалась не в том месте, где ее ожидал printf. никаких переменных printf("%f\n", 1.0f); выводит 0.000000 а printf("%f\n", 1.1f); выводите -0.000000
Сообщение отредактировал k000858 - Dec 8 2016, 07:19
|
|
|
|
|
Dec 8 2016, 10:11
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(scifi @ Dec 8 2016, 11:02)  Это называется долбаные даблы. И от них никуда не деться, если принтфить флоаты. Каждый раз как об этом подумаю - злюсь... Такие же траблы были бы если выводился тип long long. Так что дело не в плавучке, а в размере используемых типов данных. Если всегда не более 4 байт - то и с выравниванием на 4 всё должно работать нормально.
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Dec 9 2016, 06:53
|
Частый гость
 
Группа: Свой
Сообщений: 142
Регистрация: 11-01-11
Из: Орел
Пользователь №: 62 159

|
Цитата(k000858 @ Dec 8 2016, 10:53)  спасибо. проблема решена.
причина озвучена выше: адрес стека не был выровнен
вопрос в тему: выравнивание адреса указателя стека к 8 должно быть обязательно на всех типах ядер (конкретно STM32L0, STM32F4) ? во любых типах проектов или только в тех, что используют newlib для print/sprint ? Разрешите поинтересоваться, а как у вас получилось, что адрес стека оказался не выровнен? И в какой IDE вы работаете? У меня такого ни разу не было, ни в одном проекте.
Сообщение отредактировал Pridnya - Dec 9 2016, 06:53
|
|
|
|
|
Dec 9 2016, 09:29
|
Частый гость
 
Группа: Свой
Сообщений: 142
Регистрация: 11-01-11
Из: Орел
Пользователь №: 62 159

|
Цитата(demiurg_spb @ Dec 9 2016, 12:23)  В знаете, что можно и без IDE вовсе работать. Всё с командной строки и правки править руками и исходники и файл линкера и правила сборки и стартап файл. Основная масса открытого софта именно так и реализована. Я знаю, что можно в простейшем текстовом редакторе работать...с exe-шниками для командной строки, и браузер самому можно написать, но я об этом не спрашивал. Если вы хотели сказать, что из-за такого "открытого" софта (частично открытого для лица его использующего) и появилась ошибка "невыровненный адрес стека", то я с вами соглашусь.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|