• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Научите считать float

sharikov

Active member
понадобилась работа с плавающей точкой и тут снова граблями по лбу.
в компилере UDK float поломан, ладно поставил gcc5.2 от SysGCC - оно float компилит но линкер ругается: undefined reference to `abort'
что делать- то?

вообще espressif разочаровывает. больше года к нему не притрагивался а прогресс отсутствует начисто: стабильного sdk так и нет, стабильного компилятора нет, стабильно работающих модулей нет...
 

nikolz

Well-known member
есть два способа обойти эту проблему:
1) работать с фиксированной точкой
2) использовать запись констант float как шестнадцатеричные целые
 

jcmvbkbc

New member
Например, невозможно указать константы с плавающей точкой.
Я так и думал, что дойдёт до этого. :) Нет, это не проблема компилятора, это проблема этой конкретной сборки компилятора или настроек окружения. esp-open-sdk собирает нормальный компилятор. Другие сборки под windows, и, вроде бы даже, эта же сборка у других людей тоже нормально работают с плавающей точкой.
 
Последнее редактирование:

nikolz

Well-known member
Я так и думал, что дойдёт до этого. :) Нет, это не проблема компилятора, это проблема этой конкретной сборки компилятора или настроек окружения. esp-open-sdk собирает нормальный компилятор. Другие сборки под windows, и, вроде бы даже, эта же сборка у других людей тоже нормально работают с плавающей точкой.
Ну и зачем Вы это написали?
Как эти Ваши умозаключения решают данную проблему?
Мне, как полагаю и всем другим, вообще по... чья проблема это компилятора или сборки,
важно лишь ее решение а не рассуждения на тему.
 

jcmvbkbc

New member
Ну и зачем Вы это написали?
Как эти Ваши умозаключения решают данную проблему?
Разве это не очевидно? Собирайте компилятор сами или используйте сборки которые работают.

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

nikolz

Well-known member
Разве это не очевидно? Собирайте компилятор сами или используйте сборки которые работают.
Вы, очевидно, заблуждаетесь на счет "всех других".
Если вы помните, вот здесь уже поднимался вопрос об этой конкретной проблеме, но после этого ответа обсуждение как-то сошло на нет. Если проблема всё ещё актуальна, можем продолжить, но для этого вам должно быть не "по...".
Эта ошибка никуда не делась.
А у других ее нет, потому что у них нет констант с плавающей.
если я не ошибаюсь, то в примерах такие константы есть лишь для датчика BMP180.
А судя по вопросам и темам на форуме за последний год такие примеры всем по... Так как в основном все озадачены публичной публикацией чего-то или проблемами начального запуска.
----------------
чтобы не татитб Ваше и свое время на схоластические дискуссии о возможных причинах, просьба выложить сборку, которая работает нормально.
спасибо.
 

nikolz

Well-known member
Разве это не очевидно? Собирайте компилятор сами или используйте сборки которые работают.
Вот Вам пример голословности Ваших рассуждений.
----------------------------
Поставил последнюю версию UDK.
Получили:
08:18:31 **** Build of configuration Default for project eps8266_ili9341 ****
mingw32-make.exe -f C:/Espressif/examples/ESP8266/esp8266_ili9341/Makefile all
CC driver/hspi.c
CC driver/Font64.c
C+ driver/Adafruit_ILI9341_fast_as.cpp
CC driver/Font32.c
CC driver/mini-printf.c
C+ driver/Adafruit_GFX_AS.cpp
driver/Adafruit_GFX_AS.cpp:668:2: error: floating constant truncated to zero [-Werror=overflow]
float rounding = 0.5;
^
driver/Adafruit_GFX_AS.cpp:670:2: error: floating constant truncated to zero [-Werror=overflow]
float eep = 0.000001;
^
C:/Espressif/examples/ESP8266/esp8266_ili9341/Makefile:327: recipe for target 'build/driver/Adafruit_GFX_AS.o' failed
mingw32-make.exe: *** [build/driver/Adafruit_GFX_AS.o] Error 1

08:20:40 Build Finished (took 2m:8s.733ms)
-------------------------
А Ваш ответ про очевидность - это лишь доказательство бессмысленности Ваших рассуждений про причины этой ошибки. Вы ее не устранили а лишь занимаетесь демагогией.
 

jcmvbkbc

New member
Вот Вам пример голословности Ваших рассуждений.
----------------------------
Поставил последнюю версию UDK.
Я нигде не утверждал, что последняя версия UDK -- это рабочая сборка.
Вот что со следующим кодом (вы не привели исходного кода примера для проверки, поэтому я использовал следующий пример) делает компилятор собранный с помощью esp-open-sdk:

Код:
$ cat flc.c
float f(float a)
{
        float v = 0.5;
        return a + v;
}

$ ~/tmp/esp/esp-open-sdk/xtensa-lx106-elf/bin/xtensa-lx106-elf-gcc -Os -S flc.c
$ cat flc.s
        .file   "flc.c"
        .global __addsf3
        .text
        .literal_position
        .literal .LC0, 0x3f000000
        .align  4
        .global f
        .type   f, @function
f:
        l32r    a3, .LC0
        addi    sp, sp, -16
        s32i.n  a0, sp, 12
        call0   __addsf3
        l32i.n  a0, sp, 12
        addi    sp, sp, 16
        ret.n
        .size   f, .-f
        .ident  "GCC: (crosstool-NG crosstool-ng-1.22.0-55-gecfc19a) 4.8.5"
Константа на месте и никаких предупреждений от компилятора.

А Ваш ответ про очевидность - это лишь доказательство бессмысленности Ваших рассуждений про причины этой ошибки. Вы ее не устранили а лишь занимаетесь демагогией.
Во-первых, рассуждения о причинах ошибки основаны на результатах отладки компилятора. У меня ошибка не воспроизводится, а косвенные признаки указывают на проблему в mpfr. Если вы считаете мои рассуждения бессмысленными, можете их оспорить или предложить свою теорию, но пожалуйста, аргументированно.
Во-вторых, нападать на меня совершенно необязательно.
 

nikolz

Well-known member
Я не совсем понимаю, что я там должен увидеть. Что означает "Я так понимаю проблема внутри espressif всетаки 1.5.4.1." ? Что это за цифры?
Вы не там читаете.
Посмотрите последний пост, где теже самые ошибки появились в версии ESP8266_NONOS_SDK_V2.0.0_16_07_19 Release Notes
Эту ошибку я проверял с версии 1.0 до версии 2.0. Она не зависит от версии SDK.
Это чисто глюк компилятора.
 

jcmvbkbc

New member
Вы не там читаете.
Я читаю пост, на который указывает ваша ссылка.

Посмотрите последний пост, где теже самые ошибки появились в версии ESP8266_NONOS_SDK_V2.0.0_16_07_19 Release Notes
То что у вас есть эта ошибка я знаю, а больше там нет никакой новой информации.

Эту ошибку я проверял с версии 1.0 до версии 2.0. Она не зависит от версии SDK.
Это чисто глюк компилятора.
Вот я вам выше привёл лог и результат компиляции компилятором, собранным esp-open-sdk, там нет этой ошибки. В начале топика ТС написал, что компилятор собранный SysGCC тоже правильно работает с float. Это два примера работающих сборок.
Но как я понимаю, вы хотите получить работающий компилятор в UDK. Ок, я посмотрю, что можно сделать.
 

nikolz

Well-known member
Я читаю пост, на который указывает ваша ссылка.


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


Вот я вам выше привёл лог и результат компиляции компилятором, собранным esp-open-sdk, там нет этой ошибки. В начале топика ТС написал, что компилятор собранный SysGCC тоже правильно работает с float. Это два примера работающих сборок.
Но как я понимаю, вы хотите получить работающий компилятор в UDK. Ок, я посмотрю, что можно сделать.
Спасибо, будем ждать.
 

Urbas81

Member
Подскажите по проблеме: необходимо преобразовывать 2 INT во float, для значений >1 работает, а если в результате преобразования получается значение 0.5 или любое меньше 1 программа зависает и срабатывает wdt. Насколько я понял проблема в функции pow(double x, double y), может есть вариант проще исключающий зависание?
Код:
double pow(double x,double y)
{
    double z , p=1;
//y<0 ? z=-y : z=y ;
if(y<0)
    z = fabs(y);
else
    z = y;
for(int i=0; i<z ; ++i)
{
    p *= x;
}
if(y<0)
   return 1/p;
else
   return p;
}
 

nikolz

Well-known member
Подскажите по проблеме: необходимо преобразовывать 2 INT во float, для значений >1 работает, а если в результате преобразования получается значение 0.5 или любое меньше 1 программа зависает и срабатывает wdt. Насколько я понял проблема в функции pow(double x, double y), может есть вариант проще исключающий зависание?
Код:
double pow(double x,double y)
{
    double z , p=1;
//y<0 ? z=-y : z=y ;
if(y<0)
    z = fabs(y);
else
    z = y;
for(int i=0; i<z ; ++i)
{
    p *= x;
}
if(y<0)
   return 1/p;
else
   return p;
}
а через присвоение не преобразуется?
--------------------
предположим у вас целое число два байте
int y1=100; // младший байт
int y2=20; //старший байт
float x=y1+y2<<8;
или
float x=y1+256*y2;
----------------------------------
или надо что-то другое
 

Urbas81

Member
а через присвоение не преобразуется?
--------------------
предположим у вас целое число два байте
int y1=100; // младший байт
int y2=20; //старший байт
float x=y1+y2<<8;
или
float x=y1+256*y2;
----------------------------------
или надо что-то другое
А должно, надо попробовать, я заморочился с мантиссами и экспонентами.
 
Сверху Снизу