Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вопрос по EEPROM
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
tier
Всем Добрый день. Ребята, подскажите как мне можно поступить в этом случае:

Код
#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 закоментировали, когда постили на форум, или и в программе - так?
tier
Цитата(Палыч @ Apr 11 2012, 11:25) *
Вы второе присваивание temp закоментировали, когда постили на форум, или и в программе - так?


то я специально закоментил, потому как если раскоментировать то не скомпилится.... в этом и вопрос собственно.....
Палыч
Говорит, что тип аргумента - "не тот"? Так - приведите аргумент к нужному типу (uint16_t *): функция читает слово, и аргумент ожидает соответствующий...
tier
Цитата(Палыч @ Apr 11 2012, 12:09) *
Говорит, что тип аргумента - "не тот"? Так - приведите аргумент к нужному типу (uint16_t *): функция читает слово, и аргумент ожидает соответствующий...


так тоже нельзя, т.к. temp - это указатель типа EData_t и компилятор выдаст варнинг о несовместимости типов как минимум....
Сергей Борщ
QUOTE (tier @ Apr 11 2012, 12:23) *
так тоже нельзя, т.к. temp - это указатель типа EData_t и компилятор выдаст варнинг о несовместимости типов как минимум....
Так приводить надо не temp, а &temp->FPointerStruct. И раз уж у вас в структуре указатель на следующую структуру - так и объявите его как указатель на эту структуру. Тогда не нужны будут ручные temp=(FData_t *)&FData1:
CODE
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
}
tier
Цитата(Сергей Борщ @ Apr 11 2012, 13:15) *
Так приводить надо не temp, а &temp->FPointerStruct. И раз уж у вас в структуре указатель на следующую структуру - так и объявите его как указатель на эту структуру. Тогда не нужны будут ручные temp=(FData_t *)&FData1


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

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


и Вам тоже спасибо, сразу просто не понял....
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.