Компилятор матерится на eeprom_read_/eeprom_write_

flexter
Offline
Зарегистрирован: 25.05.2020

Здраствуйте. Не нашёл какой-то выделенной темы, где "знатоки" помогают "новичкам", поэтому создал эту. Если был неправ, сорян, не со зла... Итак, вопрос: кто-нибудь может мне сказать почему компилятор на функциях библиотеки <avr/eeprom.h>, выдаёт какую-то неведомую срань? Например, делаю вот так:

#include <avr/eeprom.h>
float value;

void setup() 
{

  value = eeprom_read_float(1);  
  
}

void loop() {  }

получаю вот такое вот паскудство:

 

E:\Download\radio\arduino-1.8.12\Projects\sketch_may25b\sketch_may25b.ino: In function 'void setup()':

E:\Download\radio\arduino-1.8.12\Projects\sketch_may25b\sketch_may25b.ino:7:30: warning: invalid conversion from 'int' to 'const float*' [-fpermissive]

   value = eeprom_read_float(1);

                              ^

In file included from E:\Download\radio\arduino-1.8.12\hardware\arduino\avr\cores\arduino/USBAPI.h:25:0,

                 from E:\Download\radio\arduino-1.8.12\hardware\arduino\avr\cores\arduino/Arduino.h:234,

                 from sketch\sketch_may25b.ino.cpp:1:

e:\download\radio\arduino-1.8.12\hardware\tools\avr\avr\include\avr\eeprom.h:152:7: note:   initializing argument 1 of 'float eeprom_read_float(const float*)'

 float eeprom_read_float (const float *__p) __ATTR_PURE__;

       ^~~~~~~~~~~~~~~~~

Скетч использует 444 байт (1%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 9 байт (0%) динамической памяти, оставляя 2039 байт для локальных переменных. Максимум: 2048 байт.

 

И такая хрень происходит при любом значении адреса в скобках, кроме нулевого. То есть, если в скобках ноль, или любая константа эквивалентная нулю, то всё компилируется нормально, любое другое значение - и вот такие шпалы. Причём, не зависит от того, какая из функций используется - read/write, с любыми типами данных.

Я уже весь мозг себе расцарапал - не могу понять, что этой падле из под меня надо.

 

b707
Онлайн
Зарегистрирован: 26.05.2017

Опять "особо умный" новичок...

Если вы не знаете язык, нафига лезть в системные библиотеки? 

если даже прямая подсказка компилятора

 float eeprom_read_float (const float *__p)

не наводит вас ни на какие мысли - - берите стандартную ардуиновскую библиотеку EEPROM.h и не выпендривайтесь

 

flexter
Offline
Зарегистрирован: 25.05.2020

b707 пишет:

Опять "особо умный" новичок...

Если вы не знаете язык, нафига лезть в системные библиотеки? 

если даже прямая подсказка компилятора

 float eeprom_read_float (const float *__p)

не наводит вас ни на какие мысли - - берите стандартную ардуиновскую библиотеку EEPROM.h и не выпендривайтесь

Если бы "стандартная ардуиновская библиотека" имела функцию, возвращающую значение прочитанное из EEPROM, отличного от byte типа, я бы непременно так и поступил, но к сожалению её туда не завезли, поэтому мне приходится "выпендриваться".

А Вам, если подсказка компилятора кажется совершенно очевидной, надеюсь не будет обременительным объяснить мне "особо умному новичку", каким таким ракообразным образом этот компилятор хочет, чтобы я указал ему адрес?

Я вообще вот отсюда https://alexgyver.ru/lessons/eeprom/  информацию черпнул, а не сам её по "особой умности" выдумал. И в связи с этим нахожусь в совершенном недоумении, почему простой пример из урока выпиливает вот такие вот кренделя.

 

b707
Онлайн
Зарегистрирован: 26.05.2017

flexter пишет:

Если бы "стандартная ардуиновская библиотека" имела функцию, возвращающую значение прочитанное из EEPROM, отличного от byte типа, я бы непременно так и поступил, но к сожалению её туда не завезли, поэтому мне приходится "выпендриваться".

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

читайте про EEPROM.put() get() update()

Кстати, по вашей ссылке у гайвера это все есть.

flexter пишет:
каким таким ракообразным образом этот компилятор хочет, чтобы я указал ему адрес?

то что надо указать адрес - знаете, а как указать - нет? может учебник почитать? или гугль?

Цитата:
Я вообще вот отсюда https://alexgyver.ru/lessons/eeprom/  информацию черпнул, а не сам её по "особой умности" выдумал. И в связи с этим нахожусь в совершенном недоумении, почему простой пример из урока выпиливает вот такие вот кренделя.

Так это вы у гайвера спрашивайте. почему его примеры не компилируются. А то наберутся на его сайте всякой хрени, а потом к нам бегут :)

flexter
Offline
Зарегистрирован: 25.05.2020

put'ы и get'ы "стандартной библиотеки" не возвращают значение, а присваивают его переменной, заданной в условии вызова функции. Одна переменная - одно значение. Так что, к сожалению, удивить меня Вы не смогли. Мне же надо одной float переменной присвоить результат неких арифметических операций, произведённых над несколькими значениями float типа, прочитанными из EEPROM. И плодить для этого стопицот промежуточных float переменных мне как-то совершенно не хочется.

Я бы и рад был "почитать учебник или гугль", но как раз первая ссылка в поиске Яндекса по запросу arduino avr/eeprom.h приводит меня на ту самую страницу у гайвера, которая вроде бы как раз и позиционирует себя, как "учебник".

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

#include <avr/eeprom.h>

#define EEbegin 0

float value;

void setup()
{

  value = (eeprom_read_float((float*)EEbegin) + eeprom_read_float((float*)EEbegin+4))/2;

}

void loop() {  }

 

b707
Онлайн
Зарегистрирован: 26.05.2017

flexter пишет:

Мне же надо одной float переменной присвоить результат неких арифметических операций, произведённых над несколькими значениями float типа, прочитанными из EEPROM. И плодить для этого стопицот промежуточных float переменных мне как-то совершенно не хочется.


void setup()
{
value = (eeprom_read_float((float*)EEbegin) + eeprom_read_float((float*)EEbegin+4))/2;
}

при таких запросах почему бы вам сразу не положить значение value в EEPROM, вместо того чтоб класть две отдельные промежуточные переиенные (которые вам не нужны, как вы пишете) - тогда не придется ничего рассчитывать?

flexter
Offline
Зарегистрирован: 25.05.2020

b707 пишет:

при таких запросах почему бы вам сразу не положить значение value в EEPROM, вместо того чтоб класть две отдельные промежуточные переиенные (которые вам не нужны, как вы пишете) - тогда не придется ничего рассчитывать?

Патамушта... Если бы мне было нужно одно значение, то я бы и хранил одно. А мне нужно два, которые могут изменяться независимо друг от друга по отдельности.

b707
Онлайн
Зарегистрирован: 26.05.2017

flexter пишет:

Патамушта... Если бы мне было нужно одно значение, то я бы и хранил одно. А мне нужно два, которые могут изменяться независимо друг от друга по отдельности.

ну сделали и хорошо. Вариантов всегда несколько.

можно было завести одну локальную переменную в setup() и прочитать все что нужно через EEPROM.get() . При выходе из setup() память бы освободилась и на работу основной программы никак не повлияла бы... 

-NMi-
Offline
Зарегистрирован: 20.08.2018

707-й , астафЪ иво фпакойе, наXер_он_те_нужЕн???  буй_сним_с_гайвером.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

flexter пишет:

Я вообще вот отсюда https://alexgyver.ru/lessons/eeprom/  информацию черпнул

В таком случае Вы неправильно выбрали форум для решения этой проблемы. Вам надо вот сюда - https://community.alexgyver.ru/

flexter
Offline
Зарегистрирован: 25.05.2020

ЕвгенийП пишет:

В таком случае Вы неправильно выбрали форум для решения этой проблемы. Вам надо вот сюда - https://community.alexgyver.ru/

Да это похоже парадокс всех подобных местечковых форумов, комьюнити которых преимущественно представляет собой варящийся в собственном соку закрытый клуб, состоящий из узкого круга лиц, совершенно необоснованно считающих себя "элитариями", постигшими вершины познания. И неудивительно, что постороннему человеку, случайно проходившему мимо подобного "элитного клуба" и по простоте душевной решившему спросить дорогу у местных обитателей, проще разобраться во всём самому, нежели дождаться снисхождения от высокомерных местных "мудрецов". Типа: "Да ты не знаешь наш язык! Да как ты вообще посмел ступить на порог нашего храма?! Убирайся прочь, здесь не место таким дремучим болванам!" Или: "На пресс-конференцию к звёздам нужно приходить подготовленными, а не так как Вы - вчера в подворотне, сегодня во втором ряду!" ©

Как-то так...

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

flexter, объясню Вам на пальцах.
Здесь не любят Гайвера по следующим причинам. Он ориентируется на новичков, типа продвигает ардуино в массы (ведёт блог и канал на ютубе), пишет много скетчей и библиотек, но у него куча ошибок в коде. Новички, насмотревшись Гайвера, пытаются сходу собрать вундервафлю используя его корявый код, а когда у них не получается - бегут на форум ардуино.ру и вопят о помощи, т.к. у них нихрена не работает... Здешним форумчанам это просто надоело. Поэтому при упоминании Гайвера обычно посылают... на его форум.
При этом, сам Гайвер что-то не спешит отвечать и помогать всем страждущим, хотя он "в ответе за тех, кого приручил". 
Не работает код Гайвера - пишите ему на форуме. Не отвечает - пишите в ВК, не отвечает - пишите в личку на Ютубе. 

Als
Offline
Зарегистрирован: 17.05.2015

flexter пишет:

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

http://lurkmore.to/Чсв

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

flexter пишет:

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

Всё так! Вот такое мы говно. Вот и не лезьте в чужой клуб со своим уставом.

SLKH
Offline
Зарегистрирован: 17.08.2015

ЕвгенийП пишет:

flexter пишет:

Я вообще вот отсюда https://alexgyver.ru/lessons/eeprom/  информацию черпнул

В таком случае Вы неправильно выбрали форум для решения этой проблемы. Вам надо вот сюда - https://community.alexgyver.ru/

В упомянутом ТС гайверовском уроке очень внятно написано про ту самую "функцию, возвращающую значение прочитанное из EEPROM, отличного от byte типа". Но ТС не желает это применять.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

flexter пишет:
сам как-то разобрался 

  value = (eeprom_read_float((float*)EEbegin) + eeprom_read_float((float*)EEbegin+4))/2;

Мда, соотношение уровня безграмотности с уровнем гонора ... yahoo'ею!

flexter
Offline
Зарегистрирован: 25.05.2020

ЕвгенийП пишет:
Всё так! Вот такое мы говно. Вот и не лезьте в чужой клуб со своим уставом.

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

SLKH пишет:
В упомянутом ТС гайверовском уроке очень внятно написано про ту самую "функцию, возвращающую значение прочитанное из EEPROM, отличного от byte типа". Но ТС не желает это применять.

Название функции в студию! Ок?

Ворота пишет:
Мда, соотношение уровня безграмотности с уровнем гонора ... yahoo'ею!

Да hoo'ей сколько хочешь, "грамотный"...  https://youtu.be/jbvYDqy2oO0

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

flexter пишет:

Да hoo'ей сколько хочешь

Так я это и делаю, но всё равно, спасибо, что разрешил.

flexter
Offline
Зарегистрирован: 25.05.2020

Ворота пишет:
Так я это и делаю, но всё равно, спасибо, что разрешил.

Да всегда пожалуйста, обращайся. Ну и поразмысли на досуге наз значением глагола, по аналогии с глаголами "деревенеть", "каменеть", "леденеть" и т.д.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

flexter пишет:
поразмысли на досуге
Это не по моей части - у меня размышлялка сначала не выросла, а потом и то что было атрофировалось от неиспользования.

Als
Offline
Зарегистрирован: 17.05.2015

Я почти на 99% уверен, что большинство из тех кто тут щёки надувает не знает почему при value = eeprom_read_float(0) у ТС warning не вылазит. (подозреваю что ЕвгенийП знает, прошу сразу не подсказывать).

b707
Онлайн
Зарегистрирован: 26.05.2017

Als пишет:

Я почти на 99% уверен, что большинство из тех кто тут щёки надувает не знает почему при value = eeprom_read_float(0) у ТС warning не вылазит. (подозреваю что ЕвгенийП знает, прошу сразу не подсказывать).

потому что ноль - особое значение, соответвует пустому указателю