Перейти к содержанию
    

организовать сегмент во flash

Прочитал, как хранить данные во 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};

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Дело в том, что эта прагма действиует только на одно последующее объявление переменной или константы. Чтобы не заморачиваться с кучей строк прагмы и ручным вычислением адресов, объедините свои константы в структуру.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Дело в том, что эта прагма действиует только на одно последующее объявление переменной или константы. Чтобы не заморачиваться с кучей строк прагмы и ручным вычислением адресов, объедините свои константы в структуру.

 

А прагма будет действовать на всю структуру?

Хотя не очень охота возиться с длинными записями типа "структура.элемент". Удобнее было бы организовать сегмент, указать адрес его размещения и размер (например, 512 байт, чтобы если тереть, так уж всё!), а при объявлении констант указывать, в каком сегменте их разместить. Как-то так. Может, черканёте строчки три, как это сделать? Я чего-то не нашёл примеров. В этом сегменте я буду держать переменные (параметры), которые могут иногда изменяться (настройки там всякие...).

Кстати ещё вопросик. Тут один товарисч из scanti сказал, что время непрерывной записи сегмента ограничено. Долгое стояние в этом режиме приводит к развалу начала записываемого сектора, т.к. нельзя долго держать включенным генератор напряжения записи. Я так понимаю, это определяет минимальную частоту MCLK при этой процедуре. Не подскажите, какую величину имеет это время? Он навскидку не смог сказать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По-моему, есть ещё #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 при программировании кристалла.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот ещё из FAQ от Сергея Борща:
Когда это писалось, компилятор имел версию 2.хх

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Когда это писалось, компилятор имел версию 2.хх

Значит, надо взять в руки Compiler Reference и найти 10 отличий :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Видите ли, боюсь, но память info меня не устроит. "Маловато будет!" Я бы откусил пару блоков по 512 сверху где-нибудь. И дал бы понять линковщику, что туда ничего писать не надо. В пиках я просто забивал пустой буфер до границы сектора. Здесь интереснее: не используемые буфера вообще игнорируются. Не, я могу чисто символически его где-нибудь в программе дёрнуть, но это по-моему неправильно. Как бы указать линкеру явно, чтобы не лез, куда его не просят? Хедеры и прочее переписывать не хочу, хочу, чтобы из программы. У структуры длинные имена, лень каждый раз писать. Хочу чтобы без структур. В общем, буду пинать его ногами, пока не устану или он не сдастся!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А прагма будет действовать на всю структуру?
Конечно. Ведь структура это единый объект с точки зрения компиляции.

Хотя не очень охота возиться с длинными записями типа "структура.элемент". Удобнее было бы организовать сегмент, указать адрес его размещения и размер (например, 512 байт, чтобы если тереть, так уж всё!), а при объявлении констант указывать, в каком сегменте их разместить. Как-то так. Может, черканёте строчки три, как это сделать? Я чего-то не нашёл примеров. В этом сегменте я буду держать переменные (параметры), которые могут иногда изменяться (настройки там всякие...).
Читайте описание #pragma в разделе data alignment в User manual на компилятор, а о создании своих секций в User manual на линкер. Ей-богу будет больше пользы, чем от примера из двух строчек. :)

Я так понимаю, это определяет минимальную частоту MCLK при этой процедуре. Не подскажите, какую величину имеет это время?
Допустимый диапазон частот для FTG указан в datasheet конкретного кристалла, навскидку что-то около 300-400кГц. А с медленным MCLK как какая-то другая беда была. Типа когда MCLK от VLO тактируют. Подробностей уже не помню. Где-то здесь был топик на эту тему.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кстати ещё вопросик. Тут один товарисч из scanti сказал, что время непрерывной записи сегмента ограничено. Долгое стояние в этом режиме приводит к развалу начала записываемого сектора, т.к. нельзя долго держать включенным генератор напряжения записи. Я так понимаю, это определяет минимальную частоту MCLK при этой процедуре. Не подскажите, какую величину имеет это время? Он навскидку не смог сказать.

Читайте даташит на кристал (не юзер гид), раздел Flash. Время порядка десятка мс. К MCLK это имеет очень далекое отношение, ибо процесс записи это несколько команд. Ну не делайте MCLK менее килогерца просто :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Дело в том, что эта прагма действиует только на одно последующее объявление переменной или константы. Чтобы не заморачиваться с кучей строк прагмы и ручным вычислением адресов, объедините свои константы в структуру.

А вот не хочет такая запись компилиться!

 

#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};

Говорит, что такая прагма тут не применима.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А так:

 

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};

?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А так:

 

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};

?

 

Неа. Нехотит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот так попробуйте

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 он конечно разместит там, где вы его попросите, но извлекать значения из нее не будет, воспользовавшись теми их значениями, которыми вы проинициализировали структуру на момент компиляции программы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

будет warning с предупреждением о том, что вы две структуры в одно адресное пространство поместили. Но на него можно не обращать внимания.

Да нет, там не вонинг, а еррор. На него нельзя не обратить.

 

Может, ну его... переписать пару строк в линкере, организовав два сегмента под свои нужды, раз уж он так не хочет?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А блин! там const лишний. Извиняюсь. Вот так вторую нужно.

 

#pragma location=0x8000
__no_init MyPar_t MyPar;
#pragma required=MyPar

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...