k000858 0 8 декабря, 2016 Опубликовано 8 декабря, 2016 · Жалоба Во всех своих проектах пользуюсь выводом отладочных сообщений, в том числе выводом значений переменных. Float переменные обычно вывожу printf("%.2f\n", val); - таким методом пользуюсь и на L0, и на F4 контроллерах, и через UART и через SWO интерфейс. Однако на STM32F205 контроллере не работает, как надо, например printf("%.2f\n", 1.0f); выводит 0.00, при этом в настройках линкера включено -specs=nano.specs -u _printf_float Что ни так с этим контроллером? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 134 8 декабря, 2016 Опубликовано 8 декабря, 2016 · Жалоба С выводом чисел с плавающей точкой была только одна проблема - адрес дна стека должен быть кратен 8. У вас оно пришет 0.00, то есть оно распознало модификатор %f и что-то вывело. Но вывело явно не то, вероятнее всего потому, что переменная оказалась не в том месте, где ее ожидал printf. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k000858 0 8 декабря, 2016 Опубликовано 8 декабря, 2016 (изменено) · Жалоба С выводом чисел с плавающей точкой была только одна проблема - адрес дна стека должен быть кратен 8. У вас оно пришет 0.00, то есть оно распознало модификатор %f и что-то вывело. Но вывело явно не то, вероятнее всего потому, что переменная оказалась не в том месте, где ее ожидал printf. никаких переменных printf("%f\n", 1.0f); выводит 0.000000 а printf("%f\n", 1.1f); выводите -0.000000 Изменено 8 декабря, 2016 пользователем k000858 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 8 декабря, 2016 Опубликовано 8 декабря, 2016 · Жалоба А куда ж эти цифирки-то кладутся, если не в стек?! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 8 декабря, 2016 Опубликовано 8 декабря, 2016 · Жалоба А куда ж эти цифирки-то кладутся, если не в стек?! Как куда? В регистры. Стек используется в функциях плавучки. Если нет выравнивания стека по 8 байтам, то происходят чудеса. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k000858 0 8 декабря, 2016 Опубликовано 8 декабря, 2016 · Жалоба спасибо. проблема решена. причина озвучена выше: адрес стека не был выровнен вопрос в тему: выравнивание адреса указателя стека к 8 должно быть обязательно на всех типах ядер (конкретно STM32L0, STM32F4) ? во любых типах проектов или только в тех, что используют newlib для print/sprint ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 8 декабря, 2016 Опубликовано 8 декабря, 2016 · Жалоба вопрос в тему: выравнивание адреса указателя стека к 8 должно быть обязательно на всех типах ядер (конкретно STM32L0, STM32F4) ? во любых типах проектов или только в тех, что используют newlib для print/sprint ? Это требование ARM EABI. На практике косяки вылазили только с плавучкой, но для порядка надо везде. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k000858 0 8 декабря, 2016 Опубликовано 8 декабря, 2016 · Жалоба Это требование ARM EABI. На практике косяки вылазили только с плавучкой, но для порядка надо везде. спасибо за разъяснения Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 8 декабря, 2016 Опубликовано 8 декабря, 2016 · Жалоба Кажется, я буковки напутал :laughing: Это называется AAPCS. Тут. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 8 декабря, 2016 Опубликовано 8 декабря, 2016 · Жалоба Это называется долбаные даблы. И от них никуда не деться, если принтфить флоаты. Каждый раз как об этом подумаю - злюсь... Такие же траблы были бы если выводился тип long long. Так что дело не в плавучке, а в размере используемых типов данных. Если всегда не более 4 байт - то и с выравниванием на 4 всё должно работать нормально. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 8 декабря, 2016 Опубликовано 8 декабря, 2016 · Жалоба Это называется долбаные даблы. И от них никуда не деться, если принтфить флоаты. Каждый раз как об этом подумаю - злюсь... Теоретически можно сделать ключик компилятора "treat double as float" и собирать стандартную библиотеку с этой опцией. Но пока никто не озаботился :laughing: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RuWorker2 0 9 декабря, 2016 Опубликовано 9 декабря, 2016 (изменено) · Жалоба спасибо. проблема решена. причина озвучена выше: адрес стека не был выровнен вопрос в тему: выравнивание адреса указателя стека к 8 должно быть обязательно на всех типах ядер (конкретно STM32L0, STM32F4) ? во любых типах проектов или только в тех, что используют newlib для print/sprint ? Разрешите поинтересоваться, а как у вас получилось, что адрес стека оказался не выровнен? И в какой IDE вы работаете? У меня такого ни разу не было, ни в одном проекте. Изменено 9 декабря, 2016 пользователем Pridnya Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 9 декабря, 2016 Опубликовано 9 декабря, 2016 · Жалоба В знаете, что можно и без IDE вовсе работать. Всё с командной строки и правки править руками и исходники и файл линкера и правила сборки и стартап файл. Основная масса открытого софта именно так и реализована. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RuWorker2 0 9 декабря, 2016 Опубликовано 9 декабря, 2016 · Жалоба В знаете, что можно и без IDE вовсе работать. Всё с командной строки и правки править руками и исходники и файл линкера и правила сборки и стартап файл. Основная масса открытого софта именно так и реализована. Я знаю, что можно в простейшем текстовом редакторе работать...с exe-шниками для командной строки, и браузер самому можно написать, но я об этом не спрашивал. Если вы хотели сказать, что из-за такого "открытого" софта (частично открытого для лица его использующего) и появилась ошибка "невыровненный адрес стека", то я с вами соглашусь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 9 декабря, 2016 Опубликовано 9 декабря, 2016 · Жалоба Дальнейшее обсуждение считаю бессмысленным. Чего не знаю, того не существует - этот лозунг не для меня. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться