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

 
 
> Распределить память во внешней serial-FLASH, IAR MSP430
k155la3
сообщение Jan 14 2015, 14:48
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Есть необходимость работы со структурно-организованными блоками данных во внешней флеш-памяти AT45DB081 мегабайтного порядка.
Т.е. адреса находятся не в области адресов контроллера. Инф. достаточно разношерстная, и регулярная (массивы структур), и нерегулярная (различные структуры).
------------
(?) Можно ли задать распределение памяти для этой области адресов в xxxxx.xcl файле ( выделив какой-либо "фиктивный" сегмент ).
------------
Сейчас задача решается вычитыванием из адреса FLASH_ADRESS ( FLASH_ADRESS - макро-переменная, считаются макросами IAR) блока данных в
RAM контроллера и работа с этим блоком через указатель нужного типа.
Из-за чего собственно.
- отказаться от счета адресов внешней флеш макросами. Вместо этого использовать распределение памяти через xcl-файл и математику указателей.
- получить на "выходе" загрузочную прошивку для внешней флеш.

Вопрос возомжно и обсуждался, но не знаю как правильно сформулировать "ключевые фразы".

Сообщение отредактировал k155la3 - Jan 14 2015, 14:49
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
scifi
сообщение Jan 14 2015, 15:52
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Хочется заполнять внешнюю флешку данными из сишных исходников?
Go to the top of the page
 
+Quote Post
k155la3
сообщение Jan 14 2015, 15:58
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(scifi @ Jan 14 2015, 19:52) *
Хочется заполнять внешнюю флешку данными из сишных исходников?


Это не основное, хотоя тоже хотелосьбы.
Основное - распределять память указательной математикой.
( В проекте, который мне дали, пришлось проверять все макросные расчеты вручную. Эти плюхи трудно искать.
И это приходится делать в век нано-технологий sm.gif


Сообщение отредактировал k155la3 - Jan 14 2015, 16:00
Go to the top of the page
 
+Quote Post
scifi
сообщение Jan 14 2015, 16:25
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(k155la3 @ Jan 14 2015, 18:58) *
Основное - распределять память указательной математикой.

Для этого не нужен никакой линкер. Достаточно объявить указатели __data20 и делать арифметику с ними, а дальше оно само.
Go to the top of the page
 
+Quote Post
k155la3
сообщение Jan 15 2015, 12:45
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(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) <<<< это гуманитарная ошибка sm.gif
#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
Go to the top of the page
 
+Quote Post



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

 


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


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