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

WinAVR + float == просто беда

уважаемые профессионалы! помогите понять, что происходит.

есть такой код (это уже извраты в процессе отладки, не обращайте внимание на volatile и прочие несуразности):

volatile static int16_t arg;
volatile static float argf;

int16_t get_temp(uint8_t chanel);

int16_t get_temperature(uint8_t chanel){
    arg = get_temp(chanel);
    argf = arg; // уже на этом операторе argf получает дикое значение, если arg == 92.
    argf = argf - config.offset[chanel];
    argf = argf * config.gain[chanel];
    argf = argf / 1000;
    return argf;
}

config.offset и config.gain имеют тип float

 

казалось бы все нормально... ан нет! если get_temp возвращает 82, то на выходе имеем нормальное значение 16. если же get_temp возвращает 92, то argf получает значение с 9 нулями!!! разумеется, функция возвращает какую-то ересь...

 

самое смешное заключается в том, что если get_temp вернет число, например, 100, то результат снова имеет разумный вид...

 

собираю проект в WinAVR 20100110. раньше доверял этой версии, как самому себе... отлаживаю в протеусе...

 

может, я где-то туплю по-черному?!

 

P.S.

похоже, разобрался... ступил. если подключить библиотеку математики (опция -lm) глюки пропадают. при этом очень заметно сокращается объем прошивки!

но не понятно, почему никаких ошибок и варнингов на отсутствие библиотеки...

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


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

но не понятно, почему никаких ошибок и варнингов на отсутствие библиотеки...

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

 

Смотрите map-файл, там много полезной информации о том, откуда что взяли...

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

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


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

код там не очень адекватный...

код вполне адекватный, просто при отладке в протеусе невозможно просмотреть состояние переменных, если они локальные для функции. поэтому пришлось простейшее выражение разбивать на отдельные этапы вычисления, чтобы понять, в какой момент возникают чудеса. причина чудес все равно остается неизвестной...

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


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

код вполне адекватный
Вам не про Ваш код говорили, про код, реализующий операции над флоатами не из libm...

По поводу доверия к этой весьма древней сборке.

В ней полно проблем, которые уже давно устранены в более свежих сборках (есть совсем свежак от этого лета).

 

https://sourceforge.net/projects/mobileches...hots%20(Win32)/

 

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


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

В ней полно проблем, которые уже давно устранены в более свежих сборках (есть совсем свежак от этого лета).

 

https://sourceforge.net/projects/mobileches...hots%20(Win32)/

 

у меня вечно какие-то проблемы с новыми сборками...

во-первых, я привык к понятию апгрейда, т.е. накатыванию свежего поверх старого с получением плюшек. в случае avr-gcc это не прокатывает: старый код перестает компилироваться (хоть и по банальным причинам, но все-таки), куда-то что-то пропадает и т.п.

во-вторых, по неизвестным причинам некоторые вещи меняются крайне радикально и в не удобную сторону. например, avr-size вдруг начинает выводить информацию вообще каким-то странным форматом, что не только сналету не понятно, какой объем кода получился, но и после детального анализа вопросы остаются...

в третьих, Eclipse... я установил в него плагин AVR и успешно им пользуюсь с WinAVR. после установки новой версии компилятора у меня вечно проблемы с интеграцией в Eclipse с существующими плагинами...

 

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

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


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

старый код перестает компилироваться (хоть и по банальным причинам, но все-таки), куда-то что-то пропадает и т.п.

Радикальных изменений пара:

Сделали нормальную работу с данными во FLASH - соответственно, много пришлось поправить (в чужом коде const добавлять).

Очень приличная оптимизация - код, где есть данные с доступом из обработчиков прерываний, при несоблюдении правил оптимизируется в ничто.

Это всё правится один раз. Я пережил это...

Кроме того, то что получиться будет проще портироваться на другие процессоры (с очень качественными компиляторами, например ARM с arm-none-eabi-gcc).

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


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

Спасибо. Пытаюсь понять сам, ковыряясь в новых версиях, что стало иным. Но под "куда-то что-то пропадает" я имел ввиду, например, avrdude, который то есть, то нет. или другие вспомогательные утилиты... И в WinAVR была вполне себе толковая документация по avr-libc, да и по самому GCC тоже, а в новых сборках нет...

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


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

я имел ввиду, например, avrdude, который то есть, то нет.
WinAVR был сборной солянкой, мухи и котлеты в одном флаконе. Вы имели 100 мегабайт архива из которых половину не использовали. Просто один человек дергал их всех вместе из разных мест и складывал в один мешок. Да, конечно, многие хотят большую зеленую кнопку "сделать мне хорошо!". На самом же деле это совершенно независимые инструменты и любой человек в состоянии скачать их из разных мест самостоятельно. На компилятор вам ссылку уже дали. Компилятор gcc идет в комплекте с binutils (ассемблер as, линкер ld, библиотекарь ar, утилиты преобразования объектных файлов objcopy, objdump и т.п.) и библиотекой avr-libc, потому что он от них зависит. Самая свежая документация на компилятор, binutils и avr-libc лежит на сайтах этих программ и легко гуглится. Самый свежий make и утилиты работы с файлами берутся из msys (сейчас уже msys2), гуглится. Самая свежая дудка лежит на своем сайте и тоже легко гуглится. Нужен компилятор посвежее - обновили только компилятор. Нужна дудка с поддержкой нового кристалла - обновили только дудку.

Ну в самом деле, изюм же не только в булочках продается...

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


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

Из радикальных изменений вспоминается всего два:

1) Добавлено ключевое слово __flash.

2) avr-libc претерпел изменения в части компоновки библиотек:

раньше цеплялась либа на всё семейство, а теперь для каждого таргета своя либа:

    MCU = atmega128
    ....
    LDFLAGS += -l$(MCU)

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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