1921 0 19 января, 2011 Опубликовано 19 января, 2011 · Жалоба Прочитал, как хранить данные во 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}; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 19 января, 2011 Опубликовано 19 января, 2011 · Жалоба Дело в том, что эта прагма действиует только на одно последующее объявление переменной или константы. Чтобы не заморачиваться с кучей строк прагмы и ручным вычислением адресов, объедините свои константы в структуру. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
1921 0 20 января, 2011 Опубликовано 20 января, 2011 · Жалоба Дело в том, что эта прагма действиует только на одно последующее объявление переменной или константы. Чтобы не заморачиваться с кучей строк прагмы и ручным вычислением адресов, объедините свои константы в структуру. А прагма будет действовать на всю структуру? Хотя не очень охота возиться с длинными записями типа "структура.элемент". Удобнее было бы организовать сегмент, указать адрес его размещения и размер (например, 512 байт, чтобы если тереть, так уж всё!), а при объявлении констант указывать, в каком сегменте их разместить. Как-то так. Может, черканёте строчки три, как это сделать? Я чего-то не нашёл примеров. В этом сегменте я буду держать переменные (параметры), которые могут иногда изменяться (настройки там всякие...). Кстати ещё вопросик. Тут один товарисч из scanti сказал, что время непрерывной записи сегмента ограничено. Долгое стояние в этом режиме приводит к развалу начала записываемого сектора, т.к. нельзя долго держать включенным генератор напряжения записи. Я так понимаю, это определяет минимальную частоту MCLK при этой процедуре. Не подскажите, какую величину имеет это время? Он навскидку не смог сказать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 29 20 января, 2011 Опубликовано 20 января, 2011 · Жалоба По-моему, есть ещё #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 при программировании кристалла. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 20 января, 2011 Опубликовано 20 января, 2011 · Жалоба Вот ещё из FAQ от Сергея Борща:Когда это писалось, компилятор имел версию 2.хх Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 29 20 января, 2011 Опубликовано 20 января, 2011 · Жалоба Когда это писалось, компилятор имел версию 2.хх Значит, надо взять в руки Compiler Reference и найти 10 отличий :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
1921 0 20 января, 2011 Опубликовано 20 января, 2011 · Жалоба Видите ли, боюсь, но память info меня не устроит. "Маловато будет!" Я бы откусил пару блоков по 512 сверху где-нибудь. И дал бы понять линковщику, что туда ничего писать не надо. В пиках я просто забивал пустой буфер до границы сектора. Здесь интереснее: не используемые буфера вообще игнорируются. Не, я могу чисто символически его где-нибудь в программе дёрнуть, но это по-моему неправильно. Как бы указать линкеру явно, чтобы не лез, куда его не просят? Хедеры и прочее переписывать не хочу, хочу, чтобы из программы. У структуры длинные имена, лень каждый раз писать. Хочу чтобы без структур. В общем, буду пинать его ногами, пока не устану или он не сдастся!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 20 января, 2011 Опубликовано 20 января, 2011 · Жалоба А прагма будет действовать на всю структуру?Конечно. Ведь структура это единый объект с точки зрения компиляции. Хотя не очень охота возиться с длинными записями типа "структура.элемент". Удобнее было бы организовать сегмент, указать адрес его размещения и размер (например, 512 байт, чтобы если тереть, так уж всё!), а при объявлении констант указывать, в каком сегменте их разместить. Как-то так. Может, черканёте строчки три, как это сделать? Я чего-то не нашёл примеров. В этом сегменте я буду держать переменные (параметры), которые могут иногда изменяться (настройки там всякие...).Читайте описание #pragma в разделе data alignment в User manual на компилятор, а о создании своих секций в User manual на линкер. Ей-богу будет больше пользы, чем от примера из двух строчек. :) Я так понимаю, это определяет минимальную частоту MCLK при этой процедуре. Не подскажите, какую величину имеет это время?Допустимый диапазон частот для FTG указан в datasheet конкретного кристалла, навскидку что-то около 300-400кГц. А с медленным MCLK как какая-то другая беда была. Типа когда MCLK от VLO тактируют. Подробностей уже не помню. Где-то здесь был топик на эту тему. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jorikdima 0 20 января, 2011 Опубликовано 20 января, 2011 · Жалоба Кстати ещё вопросик. Тут один товарисч из scanti сказал, что время непрерывной записи сегмента ограничено. Долгое стояние в этом режиме приводит к развалу начала записываемого сектора, т.к. нельзя долго держать включенным генератор напряжения записи. Я так понимаю, это определяет минимальную частоту MCLK при этой процедуре. Не подскажите, какую величину имеет это время? Он навскидку не смог сказать. Читайте даташит на кристал (не юзер гид), раздел Flash. Время порядка десятка мс. К MCLK это имеет очень далекое отношение, ибо процесс записи это несколько команд. Ну не делайте MCLK менее килогерца просто :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
1921 0 20 января, 2011 Опубликовано 20 января, 2011 · Жалоба Дело в том, что эта прагма действиует только на одно последующее объявление переменной или константы. Чтобы не заморачиваться с кучей строк прагмы и ручным вычислением адресов, объедините свои константы в структуру. А вот не хочет такая запись компилиться! #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}; Говорит, что такая прагма тут не применима. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jorikdima 0 20 января, 2011 Опубликовано 20 января, 2011 · Жалоба А так: 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}; ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
1921 0 20 января, 2011 Опубликовано 20 января, 2011 · Жалоба А так: 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}; ? Неа. Нехотит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 20 января, 2011 Опубликовано 20 января, 2011 · Жалоба Вот так попробуйте 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 он конечно разместит там, где вы его попросите, но извлекать значения из нее не будет, воспользовавшись теми их значениями, которыми вы проинициализировали структуру на момент компиляции программы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
1921 0 20 января, 2011 Опубликовано 20 января, 2011 · Жалоба будет warning с предупреждением о том, что вы две структуры в одно адресное пространство поместили. Но на него можно не обращать внимания. Да нет, там не вонинг, а еррор. На него нельзя не обратить. Может, ну его... переписать пару строк в линкере, организовав два сегмента под свои нужды, раз уж он так не хочет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 20 января, 2011 Опубликовано 20 января, 2011 · Жалоба А блин! там const лишний. Извиняюсь. Вот так вторую нужно. #pragma location=0x8000 __no_init MyPar_t MyPar; #pragma required=MyPar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться