|
организовать сегмент во flash, читал-читал - ничего не понял... |
|
|
|
Jan 19 2011, 15:59
|
Участник

Группа: Участник
Сообщений: 56
Регистрация: 29-09-10
Пользователь №: 59 820

|
Прочитал, как хранить данные во fash по определённому адресу с помощью директивы __location. Проблема возникла в том, что по этому адресу размещается только константа, следующая непосредственно за директивой. Остальные же линковщик распихивает по своему разумению. Можно ли и как организовать сегмент в flash по определённому адресу, чтобы в нём лежала группа переменных? Читал-читал - ничего не понял... #pragma location=0x8000 const unsigned char buf[5]={0,0,0,0,0}; - вот эта лежит на 8000 const unsigned char buf1[10]={48,49,50,51,52,53,54,55,56,57}; - а все ниже где-то в другом месте. const unsigned char buf2[8]={0,1,2,3,4,5,6,7};
|
|
|
|
|
Jan 20 2011, 11:20
|
Участник

Группа: Участник
Сообщений: 56
Регистрация: 29-09-10
Пользователь №: 59 820

|
Цитата(rezident @ Jan 19 2011, 19:23)  Дело в том, что эта прагма действиует только на одно последующее объявление переменной или константы. Чтобы не заморачиваться с кучей строк прагмы и ручным вычислением адресов, объедините свои константы в структуру. А прагма будет действовать на всю структуру? Хотя не очень охота возиться с длинными записями типа "структура.элемент". Удобнее было бы организовать сегмент, указать адрес его размещения и размер (например, 512 байт, чтобы если тереть, так уж всё!), а при объявлении констант указывать, в каком сегменте их разместить. Как-то так. Может, черканёте строчки три, как это сделать? Я чего-то не нашёл примеров. В этом сегменте я буду держать переменные (параметры), которые могут иногда изменяться (настройки там всякие...). Кстати ещё вопросик. Тут один товарисч из scanti сказал, что время непрерывной записи сегмента ограничено. Долгое стояние в этом режиме приводит к развалу начала записываемого сектора, т.к. нельзя долго держать включенным генератор напряжения записи. Я так понимаю, это определяет минимальную частоту MCLK при этой процедуре. Не подскажите, какую величину имеет это время? Он навскидку не смог сказать.
|
|
|
|
|
Jan 20 2011, 11:41
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
По-моему, есть ещё #pragma section или что-то навроде. Объявите свою секцию и пихайте туда. Хотя структура в любом случае красивее, данные связаны и сгруппированы. Вот ещё из FAQ от Сергея Борща: Цитата 14) Q: Как при написании программы разместить начальные данные в сегменте информационной памяти Flash? A: Для компилятора IAR в управляющем файле линкера MSP430xxxxxx.xcl определен сегмент INFO. Поместить в него данные можно при помощи команды компилятору #pragma memory = constseg(INFO) и атрибута const. Например: #pragma memory = constseg(INFO) const char * HelloString="Hello"; const float One = 1.0; #pragma memory = default; Эти данные попадут в сегмент INFO при программировании кристалла.
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Jan 20 2011, 12:55
|
Участник

Группа: Участник
Сообщений: 56
Регистрация: 29-09-10
Пользователь №: 59 820

|
Видите ли, боюсь, но память info меня не устроит. "Маловато будет!" Я бы откусил пару блоков по 512 сверху где-нибудь. И дал бы понять линковщику, что туда ничего писать не надо. В пиках я просто забивал пустой буфер до границы сектора. Здесь интереснее: не используемые буфера вообще игнорируются. Не, я могу чисто символически его где-нибудь в программе дёрнуть, но это по-моему неправильно. Как бы указать линкеру явно, чтобы не лез, куда его не просят? Хедеры и прочее переписывать не хочу, хочу, чтобы из программы. У структуры длинные имена, лень каждый раз писать. Хочу чтобы без структур. В общем, буду пинать его ногами, пока не устану или он не сдастся!!!
|
|
|
|
|
Jan 20 2011, 12:59
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(1921 @ Jan 20 2011, 16:20)  А прагма будет действовать на всю структуру? Конечно. Ведь структура это единый объект с точки зрения компиляции. Цитата(1921 @ Jan 20 2011, 16:20)  Хотя не очень охота возиться с длинными записями типа "структура.элемент". Удобнее было бы организовать сегмент, указать адрес его размещения и размер (например, 512 байт, чтобы если тереть, так уж всё!), а при объявлении констант указывать, в каком сегменте их разместить. Как-то так. Может, черканёте строчки три, как это сделать? Я чего-то не нашёл примеров. В этом сегменте я буду держать переменные (параметры), которые могут иногда изменяться (настройки там всякие...). Читайте описание #pragma в разделе data alignment в User manual на компилятор, а о создании своих секций в User manual на линкер. Ей-богу будет больше пользы, чем от примера из двух строчек.  Цитата(1921 @ Jan 20 2011, 16:20)  Я так понимаю, это определяет минимальную частоту MCLK при этой процедуре. Не подскажите, какую величину имеет это время? Допустимый диапазон частот для FTG указан в datasheet конкретного кристалла, навскидку что-то около 300-400кГц. А с медленным MCLK как какая-то другая беда была. Типа когда MCLK от VLO тактируют. Подробностей уже не помню. Где-то здесь был топик на эту тему.
|
|
|
|
|
Jan 20 2011, 14:15
|
Участник

Группа: Участник
Сообщений: 56
Регистрация: 29-09-10
Пользователь №: 59 820

|
Цитата(rezident @ Jan 19 2011, 19:23)  Дело в том, что эта прагма действиует только на одно последующее объявление переменной или константы. Чтобы не заморачиваться с кучей строк прагмы и ручным вычислением адресов, объедините свои константы в структуру. А вот не хочет такая запись компилиться! #pragma location=0x8000 struct { const unsigned char buf[5]; const unsigned char buf1[10]; const unsigned char buf2[8]; } MyPar ={0,0,0,0,0,48,49,50,51,52,53,54,55,56,57,0,1,2,3,4,5,6,7}; Говорит, что такая прагма тут не применима.
|
|
|
|
|
Jan 20 2011, 14:20
|

тут может быть ваша реклама
    
Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280

|
А так: Код typedef struct { unsigned char buf[5]; unsigned char buf1[10]; unsigned char buf2[8]; } MyPar;
#pragma location=0x8000 const MyPar par ={0,0,0,0,0,48,49,50,51,52,53,54,55,56,57,0,1,2,3,4,5,6,7}; ?
|
|
|
|
|
Jan 20 2011, 14:25
|
Участник

Группа: Участник
Сообщений: 56
Регистрация: 29-09-10
Пользователь №: 59 820

|
Цитата(jorikdima @ Jan 20 2011, 17:20)  А так: Код typedef struct { unsigned char buf[5]; unsigned char buf1[10]; unsigned char buf2[8]; } MyPar;
#pragma location=0x8000 const MyPar par ={0,0,0,0,0,48,49,50,51,52,53,54,55,56,57,0,1,2,3,4,5,6,7}; ? Неа. Нехотит.
|
|
|
|
|
Jan 20 2011, 14:27
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Вот так попробуйте Код typedef struct MyPar_t { unsigned char buf[5]; unsigned char buf1[10]; unsigned char buf2[8]; } MyPar_t;
#pragma location=0x8000 const MyPar_t MyParInit = {0,0,0,0,0,48,49,50,51,52,53,54,55,56,57,0,1,2,3,4,5,6,7}; #pragma required=MyParInit
#pragma location=0x8000 __no_init const MyPar_t MyPar; #pragma required=MyPar будет warning с предупреждением о том, что вы две структуры в одно адресное пространство поместили. Но на него можно не обращать внимания. В самой программе следует работать со структурой MyPar. Именно с ней потому, что IAR оптимизирует обращение к константам, подставляя их значение по месту использования. В результате MyParInit он конечно разместит там, где вы его попросите, но извлекать значения из нее не будет, воспользовавшись теми их значениями, которыми вы проинициализировали структуру на момент компиляции программы.
|
|
|
|
|
Jan 20 2011, 14:40
|
Участник

Группа: Участник
Сообщений: 56
Регистрация: 29-09-10
Пользователь №: 59 820

|
будет warning с предупреждением о том, что вы две структуры в одно адресное пространство поместили. Но на него можно не обращать внимания. Да нет, там не вонинг, а еррор. На него нельзя не обратить.
Может, ну его... переписать пару строк в линкере, организовав два сегмента под свои нужды, раз уж он так не хочет?
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|