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

Вопрос по EEPROM

Всем Добрый день. Ребята, подскажите как мне можно поступить в этом случае:

 

#include <avr/io.h> 
#include <avr/pgmspace.h> 

typedef struct { 
void   *FPointerStruct;      // указатель на следующую структуру 
uint8_t   FVariable; 
} FData_t; 

FData_t FData1, FData2;      // объявим структуры 

FData_t PROGMEM FData1 = {(void*)&FData2, 0xAA};   // поместим во Flash 
FData_t PROGMEM FData2 = {(void*)&FData1, 0xBB}; 

uint8_t u08_Data1, u08_Data2; 

int main(void) 
{ 
FData_t *temp; 
     
    temp=(FData_t *)&FData1;         // текущая структура FData1 
    u08_Data1=pgm_read_byte(&(temp->FVariable));    // читаем 0xAA 
     
    temp=(FData_t *)pgm_read_word(&temp->FPointerStruct);   // текущая структура FData2 
        u08_Data2=pgm_read_byte(&(temp->FVariable));    // читаем 0xBB 
}

 

а вот в EEPROM у меня так же не получается

 

  
#include <avr/io.h> 
#include <avr/eeprom.h> 

typedef struct { 
void   *EPointerStruct; 
uint8_t   EVariable; 
} EData_t; 

EData_t EData1, EData2;          // объявим структуры 

EData_t EEMEM EData1 = {(void*)&EData2, 0xAA};     // поместим в EEPROM 
EData_t EEMEM EData2 = {(void*)&EData1, 0xBB}; 

uint8_t u08_Data1, u08_Data2; 

int main(void) 
{ 
EData_t *temp; 
     
    temp=(EData_t *)&EData1;         // текущая структура EData1 
    u08_Data1=eeprom_read_byte(&(temp->EVariable));     // читаем 0xAA 
     
    //temp=(EData_t *)eeprom_read_word(&temp->EPointerStruct);  // вот здесь проблема 
    u08_Data2=eeprom_read_byte(&(temp->EVariable));        // опять читаем 0xAA 
}

 

Конечно можно просто сделать ++temp, но это не подходит, потому что перейдет на структуру после последней.... и попадем в область где уже нет ничего....

Компилятор avr-gcc. Спасибо.

 

 

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


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

    //temp=(EData_t *)eeprom_read_word(&temp->EPointerStruct);  // вот здесь проблема 
    u08_Data2=eeprom_read_byte(&(temp->EVariable));        // опять читаем 0xAA 
}

Вы второе присваивание temp закоментировали, когда постили на форум, или и в программе - так?

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


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

Вы второе присваивание temp закоментировали, когда постили на форум, или и в программе - так?

 

то я специально закоментил, потому как если раскоментировать то не скомпилится.... в этом и вопрос собственно.....

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


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

Говорит, что тип аргумента - "не тот"? Так - приведите аргумент к нужному типу (uint16_t *): функция читает слово, и аргумент ожидает соответствующий...

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


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

Говорит, что тип аргумента - "не тот"? Так - приведите аргумент к нужному типу (uint16_t *): функция читает слово, и аргумент ожидает соответствующий...

 

так тоже нельзя, т.к. temp - это указатель типа EData_t и компилятор выдаст варнинг о несовместимости типов как минимум....

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


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

так тоже нельзя, т.к. temp - это указатель типа EData_t и компилятор выдаст варнинг о несовместимости типов как минимум....
Так приводить надо не temp, а &temp->FPointerStruct. И раз уж у вас в структуре указатель на следующую структуру - так и объявите его как указатель на эту структуру. Тогда не нужны будут ручные temp=(FData_t *)&FData1:
typedef struct FData_t{ 
FData_t   *FPointerStruct;      // указатель на следующую структуру 
uint8_t   FVariable; 
} FData_t; 

FData_t FData1, FData2;      // объявим структуры 

FData_t PROGMEM FData1 = {&FData2, 0xAA};   // поместим во Flash 
FData_t PROGMEM FData2 = {&FData1, 0xBB};

int main(void) 
{ 
FData_t *temp; 
     
    temp=&FData1;         // текущая структура FData1 
    u08_Data1=pgm_read_byte(&(temp->FVariable));    // читаем 0xAA 
     
    temp=(FData_t *)pgm_read_word((uint16_t *)&temp->FPointerStruct);   // текущая структура FData2 
        u08_Data2=pgm_read_byte(&(temp->FVariable));    // читаем 0xBB 
}

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


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

Так приводить надо не temp, а &temp->FPointerStruct. И раз уж у вас в структуре указатель на следующую структуру - так и объявите его как указатель на эту структуру. Тогда не нужны будут ручные temp=(FData_t *)&FData1

 

Сергей, спасибо Вам большое.... помогли разобраться, вопрос исчерпан....

 

Говорит, что тип аргумента - "не тот"? Так - приведите аргумент к нужному типу (uint16_t *): функция читает слово, и аргумент ожидает соответствующий...

 

и Вам тоже спасибо, сразу просто не понял....

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


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

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

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

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

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

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

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

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

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

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