Цитата(scifi @ Jan 14 2015, 20:25)

Для этого не нужен никакой линкер. Достаточно объявить указатели __data20 и делать арифметику с ними, а дальше оно само.
Понял. будем попробовать.
Цитата(jcxz @ Jan 15 2015, 09:04)

Конечно это дебилизм так делать. Сам с таким сталкивался (понаписанным предыдущими "писателями").
Небольшое изменение структуры хранения - и сиди час пересчитывай все смещения заданные #define. А потом ещё три часа ищи где ошибся.
Не очень хорошо знаю семейство MSP430, но если там позволяет размер адресного пространства вместить всю ёмкость флешки, то конечно - объявляйте виртуальный сегмент и линкуйте в него переменные.
А можно и без линкера обойтись: объявляете структуру, которая у Вас и будет представлять образ памяти флешки. В неё размещаете переменные, находящиеся в SPI-флешь:
Код
struct FlashMap {
struct Var1 var10, var11;
struct Var2 var20, var21;
u32 a, b, c;
...
};
А потом используете смещения членов от начала виртуального образа:
Код
#define PtrFlashMap ((FlashMap *)NULL)
#define OffsetMemberFlashMap(member) ((char *)&PtrFlashMap->member - (char *)PtrFlashMap)
#define SizeMemberFlashMap(member) sizeof(PtrFlashMap->member)
Func1(OffsetMemberFlashMap(var21), SizeMemberFlashMap(var21));
...
У меня так во многих проектах с SPI-флешь сделано. Правда под 32-битные CPU.
Спасибо за примеры.
зы - за макросы и IAR. Наряду с человеческими ошибками был еще труднонаходимый глюк самого IAR - из-за большой вложенности макросов, вычисление адреса слетало, хотя по синтаксису все было правильно.
#define pH1 (pB4 + _floatCRC)
#define pH2 (pH1 + _floatCRC)
#define pQ1 (pH1 + _floatCRC) <<<< это гуманитарная ошибка

#define pQ2 (pQ1 + _floatCRC)
#define pQ3 (pQ2 + _floatCRC)
#define pKQN1 (pQ3 + _floatCRC)
#define pKQN2 (pKQN1 + _floatCRC)
#define pKQN3 (pKQN2 + _floatCRC)
итд
Цитата(ViKo @ Jan 15 2015, 10:03)

А если flash-память должна стираться страницами, секторами? Как это учесть при распределении?
Как-то, представлять каждую независимую переменную в виде объединения с массивом, длиной в страницу. Моя флэш имеет страницы по 256 байтов.
это проблема драйверного (для конкретной мс флеш) модуля.
Адресации в линейном простр-ве адресов - это одна задача.
Логика управления режимом записи/стирания - это вторая задача. К распределению адресов оно как-бы отношения не имеет.
(разве что выравнивание на границы страниц/блоков).
----
Это все IMHO.
Цитата(scifi @ Jan 15 2015, 11:13)

Зачем изобретать свой велосипед? Есть же православный offsetof().
я его тоже использую. В частности для отладочных утилит на PC под VisualStud.
В IAR (MSP430) можно и указатели повычитать, а в PC вычитать адреса форменный идиотизм.
Цитата(jcxz @ Jan 15 2015, 12:04)

. . .
не знал. Буду иметь в виду. Спасибо!
Хотя - это то же самое.
насчет тогожесамого. Адресное простр-во может быть сегментировано.
Думаю все-таки offsetof более феншуй.
т.е. смотря какой процессор-компилятор.
Спасибо за ответы. попробуем
Цитата(scifi @ Jan 14 2015, 20:25) *
Для этого не нужен никакой линкер. Достаточно объявить указатели __data20 и делать арифметику с ними, а дальше оно само.
Сообщение отредактировал k155la3 - Jan 15 2015, 12:27