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

 
 
> Поменять порядок следования переменных EEPROM
SasaVitebsk
сообщение Dec 5 2006, 22:18
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Попробовал пару способов - не пошло. Хотелось бы поменять порядок следования переменных в EEPROM. Для этого требуется что-то типа прототипа переменной объявить. Как - не знаю. Размещать вручную все переменные - нехочу.

Описываю задачу.

Имеется несколько переменных в EEPROM, один большой массив и переменная указывающая длину этого масива. По типу:

.......

uint8_t __eeprom Rollint[] = {
0xDA, 0x54, 0x00, 0x00, 0x01, 0x08, 0x07, 0x01, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x23, 0x33, 0x20, //
0xCF, 0xF0, 0xE8, 0xE2, 0xE5, 0xF2, 0x20, 0xEC, 0xE8, 0xF0, 0x20, 0xEF, 0xE0, 0xED, 0xED, 0xEE, //
0x21, 0x21, 0x21, 0x00, 0xDA, 0x45, 0x07, 0x07 //
};

uint32_t __eeprom eAdrProgEnd = sizeof(Rollint);

Так как объявлено сейчас - работает, но дело в том что этот массив может переписываться в процессе работы. По этому его надо разместить в конце EEPROM, а переменную eAdrProgEnd разместить где-нибудь перед ним. Если я механически переношу её вверх - выскакивает ошибка (оно и понятно - необъявлен Rollint). Пытался адрес закрепить типа @1, тоже ошибка, но уже линковщика.

Подскажите как это сделать правильно.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
zltigo
сообщение Dec 6 2006, 00:07
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Что-то порочное в самой постановке задачи.

0) В общем случае никто не гарантирует линковки в порядке упоминания переменных
1) Если массив постоянного размера, то зачем сдалась переменая - используйте прямо sizeof()
2) Если массив переменного размера и будет на ходу меняться, то какая разница, где находится
переменная - она ведь тоже будет меняться.
3) Если массив хрен знает какого размера (типа сколько влезет), то так программы вообще писать не стоит :-( - указывайте явно максимальный размер и явно инициализируйте начальный - все равно текущий придется инициализировать, так зачем с начальным извращаться?
4) ?


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Dec 6 2006, 01:27
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(zltigo @ Dec 6 2006, 00:07) *
Что-то порочное в самой постановке задачи.

0) В общем случае никто не гарантирует линковки в порядке упоминания переменных
1) Если массив постоянного размера, то зачем сдалась переменая - используйте прямо sizeof()
2) Если массив переменного размера и будет на ходу меняться, то какая разница, где находится
переменная - она ведь тоже будет меняться.
3) Если массив хрен знает какого размера (типа сколько влезет), то так программы вообще писать не стоит :-( - указывайте явно максимальный размер и явно инициализируйте начальный - все равно текущий придется инициализировать, так зачем с начальным извращаться?
4) ?


Скажу честно, я как то не надеялся на обсуждение идеи. Идею я привык оценивать сам. Причём привык очень давно. Бывает, и даже часто что я её меняю. Иногда по ходу проекта. Некоторые проекты переделывал по 4 раза. Причём без внешнего вмешательства. Так сказать элеменная база меняется, мы меняемся, взгляды меняются и т.д.

Но если Вам интересно, то выглядит так. Массив этот простирается (может простиратся) за пределы EEPROM во внешние EEPROM. По-скольку у меня m2560, а во внутреннем EEPROMе занято очень немного места, то я не считаю правильным выкидывать свободное место во внутреннем. Переменная eAdrProgEnd показывает ТЕКУЩИЙ занятый объём. При трансляции он совпадает с объёмом занятом в EEPROM. В процессе работы это значение может быть больше свободного места. Тогда п/п берущая значение будет добирать его с внешних источников.

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

Кстати посмотрел MAP файл (несколько насторожил и озадачил Ваш топик) переменные в EEPROM размещены в порядке их объявления.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Dec 6 2006, 03:55
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(SasaVitebsk @ Dec 6 2006, 00:27) *
Я не против если будут предложены другие способы решения задачи, но предпочтительным, на данный момент, являлось бы решение моей задачи.

Вариант 4 будет правильным. Указываете насколько простирается максимальный размер и первоначальный размер ручками а не sizeof() :-( неявно инициализированного массива.
Если "хочется" решить задачу не думая о правильности ее постановки, то заводите две переменные - одну где-то "после", вторую (обнуленную) гарантированно "до". При первом запуске инициализируете "до" первой и все - можете накрывать неиспользуемую неконтролируемо растущим массивом.
Несколько более прилично - в отдельный сегмент массив выделить и попросить линкер гарантированно его конце его размещать.

Цитата
Кстати посмотрел MAP файл (несколько насторожил и озадачил Ваш топик) переменные в EEPROM размещены в порядке их объявления.

А Вы не в map смотрите "как получилось", а в документ, где написано, что "так будет всегда".
А "всегда будет", если структуру-массив-union сделаете - для других случаев гарантий не предусмотрено.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 01:10
Рейтинг@Mail.ru


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