|
|
  |
Как "раскидать" структуры по EEPROM? |
|
|
|
Jul 20 2007, 14:25
|
Знающий
   
Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847

|
Цитата(Idle @ Jul 20 2007, 17:18)  Все настройки представляют собой только одну cтруктуру, располагаемую в eeprom. Внутри этой структуры есть переменные с глобальными настройками и массив структур с настройками профилей. Задача в том, чтобы разместить структуры с настройками профилей с отступом друг от друга и отступом от настроек глобальных. Нужно это для того, чтобы при увеличении количества настроек как глобальных, так и настроек профилей, они не затирали уже существующие данные. Пишу на C, ARM SDT 2.51.
Кроме ручной вставки больших paddingo-в и последующего пересчета размеров оных при изменении структур, ничего не придумывается. Выделить в отдельную секцию и в скрипте линкера прописать адреса для каждой структуры/группы структур. Организация секций и скрипт линкера зависят от компилятора/линкера, который Вы используете.
--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть. © Lewis Carroll. Alice's adventures in wonderland.
|
|
|
|
|
Jul 20 2007, 14:41
|

Профессионал
    
Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555

|
Цитата(Idle @ Jul 20 2007, 18:18)  Все настройки представляют собой только одну cтруктуру, располагаемую в eeprom. Внутри этой структуры есть переменные с глобальными настройками и массив структур с настройками профилей. Задача в том, чтобы разместить структуры с настройками профилей с отступом друг от друга и отступом от настроек глобальных. Нужно это для того, чтобы при увеличении количества настроек как глобальных, так и настроек профилей, они не затирали уже существующие данные. Пишу на C, ARM SDT 2.51.
Кроме ручной вставки больших paddingo-в и последующего пересчета размеров оных при изменении структур, ничего не придумывается. Отделить структуру global_data от profile_data и пользоваться указателями Код #define PROFILE_CNT 64 #define PROFILE_SIZE 128
typedef struct { int g1; //..... uint8_t profiles[PROFILE_CNT * PROFILE_SIZE]; }global_data_t;
global_data_t global_data; typedef struct { int p1; int p2; //.... }profile_data_t;
profile_data_t* get_profile(unsigned num) { return (profile_data_t*)(global_data.profiles+num*PROFILE_SIZE); } Цитата(Idle @ Jul 20 2007, 18:18)  Все настройки представляют собой только одну cтруктуру, располагаемую в eeprom. Внутри этой структуры есть переменные с глобальными настройками и массив структур с настройками профилей. Задача в том, чтобы разместить структуры с настройками профилей с отступом друг от друга и отступом от настроек глобальных. Нужно это для того, чтобы при увеличении количества настроек как глобальных, так и настроек профилей, они не затирали уже существующие данные. Пишу на C, ARM SDT 2.51.
Кроме ручной вставки больших paddingo-в и последующего пересчета размеров оных при изменении структур, ничего не придумывается. Отделить структуру global_data от profile_data и пользоваться указателями Код #define PROFILE_CNT 64 #define PROFILE_SIZE 128
typedef struct { int g1; //..... uint8_t profiles[PROFILE_CNT * PROFILE_SIZE]; }global_data_t;
global_data_t global_data; typedef struct { int p1; int p2; //.... }profile_data_t;
profile_data_t* get_profile(unsigned num) { return (profile_data_t*)(global_data.profiles+num*PROFILE_SIZE); }
|
|
|
|
|
Jul 20 2007, 17:53
|

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

|
Цитата(Idle @ Jul 20 2007, 17:18)  Кроме ручной вставки больших paddingo-в и последующего пересчета размеров оных при изменении структур, ничего не придумывается. Думаю, можно попробовать использовать неименованные union внутри структуры, примерно так: Код struct config_t { union { uint32_t dummy1[SIZE]; struct profile1_t { ........... } profile1; }; union { uint32_t dummy2[SIZE]; struct profile2_t { ........... } profile2; }; ......... }; #if sizeof(config_t) > зарезервированный размер #error Какая-то из структур заняла больше, чем зарезервировано #endif
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jul 21 2007, 18:50
|
Местный
  
Группа: Участник
Сообщений: 351
Регистрация: 5-04-05
Пользователь №: 3 874

|
Идеальным вариантом, действительно, было бы использование "anonymous unions", стандартных для C++, но, к сожалению, для C этого нет ни в С89, ни в С99; мой компилятор также, увы, не поддерживает фичу в качестве расширения. Т.е. простым изменением определения структур видимо не обойтись, и придется-таки перелопачивать все исходники и изменять(так или иначе) мульён строк. Эх, не подумали люди в свое время.  Хотя вариант с ручным паддингом все же остается. Про секции и линковку посмотрю, смутно представляю как это, честно говоря. Спасибо всем.
|
|
|
|
|
Jul 22 2007, 09:10
|
Местный
  
Группа: Участник
Сообщений: 351
Регистрация: 5-04-05
Пользователь №: 3 874

|
Переместить - не проблема. Но мне поставлена именно такая "боевая задача"  . Раньше, при upgrad-е, все пользовательские настройки стирались и записывались дефолтные с измененной структурой(если изменялась), а сейчас вдруг выяснилось, что это неприемлемо. Сижу вот, сравниваю разные версии: где что изменилось - переписываю, новые добиваю дефолтные. Людям бы в конце структур новые члены добалять - нет, лепят в середине. Оставлю "снизу" свободное место, напишу крупными буквами, что new members в конец only и успокоюсь  . Такие вот дела.
|
|
|
|
|
Jul 22 2007, 11:17
|
Местный
  
Группа: Участник
Сообщений: 351
Регистрация: 5-04-05
Пользователь №: 3 874

|
Такое поле есть. Конвертацией, которой раньше не было, я пока и занимаюсь. А поскольку пользователь может залить новую прошивку вместо той, что у него в наличии(т.е. сколь угодно старой), то надо для каждой старой версии (в зависимости от этого поля) сделать свой конвертер, т.е. сидеть-сравнивать: что было добавлено, что было удалено, что перешло из глобальных в локальные и т.д. Вот на будущее, чтобы не добавлять конвертацию, вопрос и был поднят.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|