Работа с EEPROM - почему в ардуино механизм хуже чем в AVR?

axill
Offline
Зарегистрирован: 05.09.2011

обычно со всеми библиотеками ситуация такая, что в ардуино библиотеки удобнее чем в AVR, не обязательно потимальнее (скорее наоборот), но зато удобнее

а вот с EEPROM получается все наоборот - и не удобнее и "кривее". Может я что-то не так понимаю?

в AVR если включить <avr/eeprom.h> то кроме простых макросов для записи и чтения любых типов переменных есть еще очень удобный атрибут -   EEMEM. Если в ардуино предлагается самому выбирать начальный адрес расположения переменной в EEPROM то в AVR это можно отдать компиляторы. Более того, если где-то внутри библиотеки тоже используют EEPROM то в ардуино сложно избежать конфдикта, а в AVR это автоматом. Например если так обхявить переменные:

uint16_t var1 EEMEM = 5;
uint8_t var2 EEMEM = 2;

то &var1 автоматически получит 0 для расположения в EEPROM, а &var2 - 2. Если где-то ранее в библиотеках или приложении были определены другие eeprom переменные, то &var1 и &var2 автоматом получат смещение в EEPROM. Так же AVR формирует файл .eep  и если его записать в EEPROM - автоматом будет инициализация EEPROM

carduino.ru
Offline
Зарегистрирован: 06.12.2011

У компилятора  ардуино можно сказать что нет своей библиотеки, он использует библиотеку avr/eeprom.h

Тупо переадресует вызов фунции

 

Вот исходник  EEPROM.cpp



#include <avr/eeprom.h>
#include "WConstants.h"
#include "EEPROM.h"

/******************************************************************************
* Definitions
******************************************************************************/

/******************************************************************************
* Constructors
******************************************************************************/

/******************************************************************************
* User API
******************************************************************************/

uint8_t EEPROMClass::read(int address)
{
return eeprom_read_byte((unsigned char *) address);
}

void EEPROMClass::write(int address, uint8_t value)
{
eeprom_write_byte((unsigned char *) address, value);
}

EEPROMClass EEPROM;

А что Вам мешает использоввать в своем коде библиотеку <avr/eeprom.h> ?

axill
Offline
Зарегистрирован: 05.09.2011

Что то мне идея не пришла в голову внутрь посмотреть) спасибо

получается красивая обертка и все при этом в AVR функций готовых намного больше чем те на которые ардуино ссылается

я собственно и хочу понять - ардуино отработает корректно атрибут EEMEM? Это не вопрос библиотеки, а вопрос компоновщика, который эти данные должен разместить в области именно EEPROM и проставить в коде верные адреса

есть у кого опыт?

carduino.ru
Offline
Зарегистрирован: 06.12.2011

Я думаю что проще будет попробовать и тем самым проверить

Компилятор который использует Arduino, WinAvr

 

step962
Offline
Зарегистрирован: 23.05.2011

carduino.ru пишет:

Компилятор который использует Arduino, WinAvr

В Arduino используется компилятор GCC.

В WinAVR - тоже.

carduino.ru
Offline
Зарегистрирован: 06.12.2011

Я в курсе. Можно еще перечислить 1000 процов у которых компилятор GCC

Только у GCC нет графической оболочки, это консольное приложение

Зачем так углублятся, это только запутает пользователя Поэтому Ардуино я привел в качестве примера

axill
Offline
Зарегистрирован: 05.09.2011

да нет это как раз важно что gcc, значит и toolchain должен быть один. есть такой замечательный большой документ avr-libc-user-manual.pdf - в нем как раз toolchain и описан со всеми примудростями. Если он один то и EMEM в ардуино работать будет

Клапауций
Offline
Зарегистрирован: 10.02.2013

axill пишет:
Если он один то и EMEM в ардуино работать будет

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

axill
Offline
Зарегистрирован: 05.09.2011

к чему это? Мне важен был опыт, его ни у кго нет, есть понимание, что должно работать. Ну и хорошо.

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