реклама на сайте
подробности

 
 
> Запись в EEPROM, пишу структуру, а попадает содержимое flash'a
GoodNews
сообщение Mar 1 2010, 20:19
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 88
Регистрация: 12-01-09
Из: Minsk (BY)
Пользователь №: 43 259



Подскажите пожалуйста, что я делаю неправильно? Имеется структура, определенная как массив из 51 элемента для хранения в eeprom. Пытаюсь записать данные в один из элементов массива, однако в итоге получаю кусок flash'a в eeprom. Почему?
CODE

typedef struct _chInMem {
uint32_t returnValue;
} chInMem;
chInMem channelMem[] EEMEM = {
{0}, {0}, {0}, {0}, {0},
{0}, {0}, {0}, {0}, {0},
{0}, {0}, {0}, {0}, {0},
{0}, {0}, {0}, {0}, {0},
{0}, {0}, {0}, {0}, {0},
{0}, {0}, {0}, {0}, {0},
{0}, {0}, {0}, {0}, {0},
{0}, {0}, {0}, {0}, {0},
{0}, {0}, {0}, {0}, {0},
{0}, {0}, {0}, {0}, {0},
{107900000}
};
...
chInMem channelInMem;
eeprom_busy_wait();
channelInMem.returnValue = channel_freq;
eeprom_write_block(&channelInMem, &channelMem, sizeof(channelMem));
...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Сергей Борщ
сообщение Mar 2 2010, 08:33
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(GoodNews @ Mar 1 2010, 22:19) *
Почему?
Код
eeprom_write_block(&channelInMem, &channelMem, sizeof(channelMem));
...
Потому что channelMem у вас - массив структур. И вы в этот массив записываете кусок памяти размером с весь массив. Т.е. кроме одной структуры channelInMem вы записываете еще и идущий следом мусор в остальные ячейки. А что вы хотели сделать на самом деле? Выглядит несколько странно - имеете массив, а при записи никак не упоминаете номер желаемого элемента массива.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
GoodNews
сообщение Mar 2 2010, 08:53
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 88
Регистрация: 12-01-09
Из: Minsk (BY)
Пользователь №: 43 259



Цитата(Сергей Борщ @ Mar 2 2010, 10:33) *
Потому что channelMem у вас - массив структур. И вы в этот массив записываете кусок памяти размером с весь массив. Т.е. кроме одной структуры channelInMem вы записываете еще и идущий следом мусор в остальные ячейки. А что вы хотели сделать на самом деле? Выглядит несколько странно - имеете массив, а при записи никак не упоминаете номер желаемого элемента массива.

Я со структурами ещё пока знакомлюсь и не умею тольком ими оперировать, хотя основную идею понимаю. Собственно и с памятью тоже только пару раз работал и то, чисто в исследовательских целях. Я хотел сделать так, чтобы можно было записать в элемент массива с индексом, который я передаю функции в качестве параметра, числовое значение. Просто не могу понять как правильно это реализовать.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 2 2010, 11:12
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(GoodNews @ Mar 2 2010, 10:53) *
Просто не могу понять как правильно это реализовать.
Код
eeprom_write_block(&channelInMem, &channelMem[index], sizeof(chInMem));


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
GoodNews
сообщение Mar 2 2010, 21:37
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 88
Регистрация: 12-01-09
Из: Minsk (BY)
Пользователь №: 43 259



Цитата(Сергей Борщ @ Mar 2 2010, 13:12) *
Код
eeprom_write_block(&channelInMem, &channelMem[index], sizeof(chInMem));

Спасибо большое! В таком виде получилось. Сделал дамп eeprom'а через avrdude - вижу, что данные попали в память. Единственное что странно, так это их расположение (это я думаю к коду не относится) - если в памяти была размещена только одна структура, то она занимала 200 байт, данные распологались подряд. Когда я разместил ещё отдельную от структуры переменную в eeprom - она попал в середину (как бы это правильно выразится - идут часть ячеек структуры, потом в середине эта переменная, потом - продолжение структуры). На функционале скорее всего никак не отразится, просто интересно почему именно так.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- GoodNews   Запись в EEPROM   Mar 1 2010, 20:19
|- - Сергей Борщ   Цитата(GoodNews @ Mar 2 2010, 23:37) Когд...   Mar 2 2010, 23:08
- - Yaumen   Задача несколько туманная, тем более что начинаете...   Mar 2 2010, 12:22
|- - Сергей Борщ   Цитата(Yaumen @ Mar 2 2010, 14:22) Задача...   Mar 2 2010, 12:43
- - GoodNews   Я посмотрел вывод. Там как ни странно всё нормальн...   Mar 3 2010, 13:58
|- - Сергей Борщ   Полагаю, ошибка здесь:Код NEXT_FREE_CHANNEL = ...   Mar 3 2010, 16:16
- - GoodNews   Большое спасибо за помощь! Я поправки внёс сог...   Mar 4 2010, 07:32
|- - Сергей Борщ   Цитата(GoodNews @ Mar 4 2010, 09:32) По п...   Mar 4 2010, 09:00
- - GoodNews   Я так понимаю, что next_free_channel = channel_num...   Mar 4 2010, 09:43
|- - Сергей Борщ   Цитата(GoodNews @ Mar 4 2010, 11:43) Я та...   Mar 4 2010, 10:52
|- - GoodNews   Цитата(Сергей Борщ @ Mar 4 2010, 12:52) Д...   Mar 4 2010, 11:20
|- - Сергей Борщ   Цитата(GoodNews @ Mar 4 2010, 13:20) А во...   Mar 4 2010, 11:44
- - GoodNews   В общем что-то получилось (всмысле компилятор пока...   Mar 4 2010, 13:09
- - Сергей Борщ   Цитата(GoodNews @ Mar 4 2010, 15:09) P.S....   Mar 4 2010, 13:37
- - Сергей Борщ   Цитата(Сергей Борщ @ Mar 4 2010, 16:37) П...   May 19 2010, 14:53


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 23:49
Рейтинг@Mail.ru


Страница сгенерированна за 0.01468 секунд с 7
ELECTRONIX ©2004-2016