Как передать строку для записи EEPROM для ATMega32? (в следующем коде)

Как я могу передать строку для записи EEPROM сначала и прочитать в коде как:

int main() 
{ 
    char display[30];    
    EEPROM_writedata(display); 
    LCD_senddata(0,EEPROM_print(1));//this wont work 
    LCD_senddata(0,display); //this works fine 
    return 1; 
} 

void EEPROM_writedata(char* name) 
{ 
    eeprom_update_block((const void *)name,(void*)1,20);    
}

char* EEPROM_print(int i) 
{ 
    char* send; 
    eeprom_read_block((void*)send,(const void*)1,10); 
    return send; 
} 

LCD_sendata(int, char*) 
{ 
    //codes for LCD initialize upto print 
} 

У меня может быть много ошибок здесь из-за меньшего количества знаний. Уточните, получили ли вы их. Моя проблема в основном состоит в том, чтобы передать строку в EEPROM_write() и передать ее в main из EEPROM_print(). Любая помощь приветствуется.

Что вы на самом деле получаете от печати eeprom?
Мне нужно записать строку в EEPROM и прочитать ее, чтобы распечатать на ЖК-дисплее. На самом деле мне нужно управлять небольшой базой данных внутри EEPROM.
Микроконтроллеры очень неумолимы для начинающих программистов на C. Я предлагаю вам смоделировать библиотеки AVR на ПК и протестировать там свой код. Также может быть полезно освежить свой C, c.learncodethehardway.org
Я использую AVRStudio5 для имитации avr. И да, правда! Я должен освежить мой c.
@Bishal Что именно возвращает EEPROM_print () для отображения на ЖК-дисплее? Не то, что вы хотите , чтобы оно вернуло, а то, что оно вернет? Что в нем "не работает"? Это просто пусто? Это бред? Что?
@Majenko Он должен возвращать байты, прочитанные из EEPROM.
@JobyTaffey Большое спасибо за ссылку, которую вы предоставили по другой теме: mainframe.cx/~ckuethe/avr-c-tutorial/lesson11.c Мне это очень помогло.
@bishal да, я знаю, что он должен вернуть. Но что вы испытываете, когда оно возвращается?

Ответы (2)

Переменные, хранящиеся в EEPROM на AVR на C, должны быть помещены в .eepromсекцию.

( Из http://www.nongnu.org/avr-libc/user-manual/group_avr_eeprom.html ) _

#define     EEMEM   __attribute__((section(".eeprom")))
void        eeprom_write_block (const void *__src, void *__dst, size_t __n)

Чтобы сохранить переменную в EEPROM и получить к ней доступ, вам нужно что-то вроде:

char EEMEM myVar;

void writeMyVal(char c)
{
  eeprom_write_block(&c, &myVar, sizeof(myVar));
}

void readMyVal(char *c)
{
  eeprom_read_block((void*)c, &myVar, sizeof(myVar));
}

Вот учебник.

Спасибо всем за вашу большую помощь. На самом деле я получил свое решение от:
http://mainframe.cx/~ckuethe/avr-c-tutorial/lesson11.c . Я отредактировал код как

 int main()
 {
 char display[30],write[]="write something inside EEPROM";
 EEPROM_writedata(&write); //initially, EEPROM_writedata(write);
 LCD_senddata(0,EEPROM_print(1));
 LCD_senddata(0,&display); //initially, LCD_senddata(0,display);
 return 1;
 }
У вас все еще есть ошибка, которая вернется и укусит вас в будущем, даже если сейчас она работает. В вашей подпрограмме EEPROM_print() вам необходимо инициализировать указатель отправки на адрес буфера, который был выделен таким образом, чтобы выжить после завершения функции.
Абсолютно согласен с @ChrisStratton, вам нужно выделить место для char *sendтого, что не является локальным для метода. Прочитайте вопрос и ответ здесь: stackoverflow.com/questions/6441218/…