roboforum.ru

Технический форум по робототехнике.

Хранение в флеш (Си)

Хранение в флеш (Си)

executer » 11 июл 2009, 21:52

Всем здравствовать!

Назрел вопрос сохранения нескольких параметров программы между включениями МК. Как писать в флеш на асме знаю, а что на Си делать? просто обьявить переменную
flash uint8_t var;
достаточно? как задать исходное значение параметра (которое сразу после перепрошивки будет)?
if(var==0) var=33;
Чтото может красивше есть?
Писать в эту переменную также как и в обычную, значение автоматически в память прошьется и восстановится после рестарта?

Re: Хранение в флеш (Си)

ALHIMIK » 11 июл 2009, 22:13

эта переменная будет константой...

Re: Хранение в флеш (Си)

MiBBiM » 11 июл 2009, 22:15

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

Re: Хранение в флеш (Си)

avr123.nm.ru » 11 июл 2009, 22:18

executer писал(а): как задать исходное значение параметра (которое сразу после перепрошивки будет)?

flash uint8_t var = 33;

executer писал(а): Писать в эту переменную также как и в обычную


Эта var будет константой и будет в памяти программ лежать.

Переменные можно в EEPROM хранить. в CVAVR модификатор

eeprom

"Язык Си для микроконтроллеров" - http://avr123.nm.ru/05.htm

Re: Хранение в флеш (Си)

ALHIMIK » 11 июл 2009, 22:19

если нужно изменять можно использовать EEPROM
блин авр апередил

Re: Хранение в флеш (Си)

executer » 11 июл 2009, 22:44

Спасибо за советы. Я думал что flash и eeprom - одно и тоже :pardon: . Теперь есть что искать.
А для WinAVR не подскажете?
Последний раз редактировалось executer 11 июл 2009, 22:59, всего редактировалось 1 раз.

Re: Хранение в флеш (Си)

avr123.nm.ru » 11 июл 2009, 22:49

Я думал что flash и eeprom - одно и тоже


На самом деле обе эти памяти являются EEPROM - просто есть некоторые нюансы и потому так называют, т.е. в МК это разные памяти.

Re: Хранение в флеш (Си)

ALHIMIK » 11 июл 2009, 23:12

если хочется можно и flah оставить только придётся использовать функцию самопрограмирования...

Re: Хранение в флеш (Си)

executer » 11 июл 2009, 23:15

вот тут нашел решение. всем сэнкс :good:
http://www.scienceprog.com/easy-start-w ... ng-winavr/

Добавлено спустя 1 минуту 8 секунд:
ALHIMIK писал(а):если хочется можно и flah оставить только придётся использовать функцию самопрограмирования...


Это типа как бутлоадер сам инфу с COM порта в память шьет?

Re: Хранение в флеш (Си)

MiBBiM » 11 июл 2009, 23:24

угу. 3-е сообщение темы :D

Re: Хранение в флеш (Си)

Duhas » 12 июл 2009, 08:40

avr123.nm.ru писал(а):
Я думал что flash и eeprom - одно и тоже

На самом деле обе эти памяти являются EEPROM - просто есть некоторые нюансы


подобные нюансы разделают человека и обезъяну (утрированно)

флеша может и родом с того же семейства но вперед шагнула...

Re: Хранение в флеш (Си)

avr123.nm.ru » 12 июл 2009, 12:37

Кудаб она ни шагнула она EEPROM и есть. Т.е. дословно - электрически стираемая перманентная ( не забывающая без питания ) ROM.

Re: Хранение в флеш (Си)

contr » 12 июл 2009, 14:09

однако обе памяти действительно одинаковы и могут считаться EEPROM. Просто кусочек именуемый "EEPROM" спецом предназначен для длительного хранения констант и чтения/записи их из другой части - flash, где находится сама программа.
как задать исходное значение параметра (которое сразу после перепрошивки будет)?

просто
var=33;
это пропишется в flash и будет стартовым значением переменной. А если это значение изменилось и его нужно сохранить и использовать при новом старте программы, то понадобится хранение в EEPROM.

Re: Хранение в флеш (Си)

executer » 12 июл 2009, 14:31

Для потомков:
(код из статьи по ссылке)
Код: Выделить всёРазвернуть
#include <inttypes.h>
#include <avr/io.h>
#include <avr/eeprom.h>

//store initial byte to eeprom
uint8_t EEMEM eeprombyte=0x10;
//store initial word to eeprom
uint16_t EEMEM eepromword=0x5555;
//store string to eeprom
uint8_t EEMEM eepromstring[5]={"Test\0"};
int main(void)
{
   
//RAM byte variable
uint8_t RAMbyte;
//RAM word variable
uint16_t RAMword;
//RAM array of bytes
uint8_t RAMstring[5];
//read byte from EEPROm and store to RAM
RAMbyte = eeprom_read_byte(&eeprombyte); // обратная функция - запись eeprom_write_byte (uint8_t *__p, uint8_t __value)
//read word from EEPROM and store to RAM
RAMword = eeprom_read_word(&eepromword); // подробная инфа в хелпе к ВинАВР "file://localhost/C:/Program%20Files/WinAVR/doc/avr-libc/avr-libc-user-manual/group__avr__eeprom.html" (без кавычек)
//copy string fro mEEPROM to RAM
eeprom_read_block ((void *)&RAMstring, (const void *)&eepromstring,5);
return (0);
}

Re: Хранение в флеш (Си)

avr123.nm.ru » 12 июл 2009, 14:48

contr писал(а):однако обе памяти действительно одинаковы


тому кто читал обложку даташит очевидно что эти памяти далеко не одинаковы.


Rambler\'s Top100 Mail.ru counter