|
Запись в EEPROM, пишу структуру, а попадает содержимое flash'a |
|
|
|
Mar 1 2010, 20:19
|

Частый гость
 
Группа: Участник
Сообщений: 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)); ...
|
|
|
|
|
 |
Ответов
|
Mar 3 2010, 13:58
|

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

|
Я посмотрел вывод. Там как ни странно всё нормально. Т.е. в .eep вначале идёт большая структура, а потом моя переменная. То, что попало в eeprom таким образом очень странно. Тем не менее - во вложении всё необходимое. Компилятор - AVR-GCC.
Прикрепленные файлы
mem.rar ( 19.77 килобайт )
Кол-во скачиваний: 13
|
|
|
|
|
Mar 3 2010, 16:16
|

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

|
Полагаю, ошибка здесь: Код NEXT_FREE_CHANNEL = channel_number; eeprom_write_block(&NEXT_FREE_CHANNEL, &channel_number, sizeof(uint8_t)); В первой строке вы пишете channel number в ОЗУ по тому же адресу, по которому в eeprom расположен NEXT_FREE_CHANNEL. Куда он попадает и что при этом рушит - не берусь судить. Больше криминала на первый взгляд не видно. Несколько замечайнний: Код static uint8_t NEXT_FREE_CHANNEL EEMEM = 1; //Тут будет храниться номер следующего свободного канала Принято заглавными буквами обозначать макроопределения и константные литералы. У вас же NEXT_FREE_CHANNEL - переменная. Код const uint8_t USER_CHANNELS_AVAILABLE = 50; //Всего доступно ячеек Эта константа в общем случае будет занимать память - компилятор предполагает, что к этой константе могут быть обращения из других единиц компиляции. Поскольку она не нужна вам в других единицах компиляции - объявите ее как static const uint8_t. Это позволит компилятору подставить в код сразу ее значение. Ваша запись была бы корректной в C++. Поведение C++ в этом моменте отличается, там константы по умолчанию имеют локальное связывание. В C++ для получения доступа к константе из других файлов ее надо объявлять extern const uint8_t USER_CHANNELS_AVAILABLE = 50. Но у вас файлы имеют расширение .c, а значит, компилируются в режиме C. Добавьте static, код может стать оптимальнее. Код eeprom_busy_wait(); можно не вызывать - такая проверка выполняется внутри функций чтения-записи. Код eeprom_write_block(&channelInMem, &channelMem[channel_number - 1], sizeof(chInMem)); write_channel_eeprom(channel_number, 0, 1); break; case 1: //Пишем номер следующего доступного канала Здесь можно убрать Код write_channel_eeprom(channel_number, 0, 1); break; Выполнится то же самое, но без рекурсии. Для совсем красивости можно массив ваших каналов и номер свободного канала объединить в структуру.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
Сообщений в этой теме
GoodNews Запись в EEPROM Mar 1 2010, 20:19 Сергей Борщ Цитата(GoodNews @ Mar 1 2010, 22:19) Поче... Mar 2 2010, 08:33 GoodNews Цитата(Сергей Борщ @ Mar 2 2010, 10:33) П... Mar 2 2010, 08:53  Сергей Борщ Цитата(GoodNews @ Mar 2 2010, 10:53) Прос... Mar 2 2010, 11:12   GoodNews Цитата(Сергей Борщ @ Mar 2 2010, 13:12) К... Mar 2 2010, 21:37    Сергей Борщ Цитата(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 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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|