Jump to content

    
Sign in to follow this  
ARV

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

Recommended Posts

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

есть такой код (это уже извраты в процессе отладки, не обращайте внимание на 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) глюки пропадают. при этом очень заметно сокращается объем прошивки!

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

Share this post


Link to post
Share on other sites
но не понятно, почему никаких ошибок и варнингов на отсутствие библиотеки...

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

 

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

Edited by alx2

Share this post


Link to post
Share on other sites
код там не очень адекватный...

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

Share this post


Link to post
Share on other sites
код вполне адекватный
Вам не про Ваш код говорили, про код, реализующий операции над флоатами не из libm...

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

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

 

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

 

Share this post


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

 

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

 

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

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

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

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

 

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

Share this post


Link to post
Share on other sites
старый код перестает компилироваться (хоть и по банальным причинам, но все-таки), куда-то что-то пропадает и т.п.

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


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

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this