Jump to content

    
Sign in to follow this  
tier

Вопрос по EEPROM

Recommended Posts

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

 

#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. Спасибо.

 

 

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites
Вы второе присваивание temp закоментировали, когда постили на форум, или и в программе - так?

 

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

Share this post


Link to post
Share on other sites

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

Share this post


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

 

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

Share this post


Link to post
Share on other sites
так тоже нельзя, т.к. 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 
}

Share this post


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

 

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

 

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

 

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

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