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

 
 
> организовать сегмент во flash, читал-читал - ничего не понял...
1921
сообщение Jan 19 2011, 15:59
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 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};
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 14)
rezident
сообщение Jan 19 2011, 16:23
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Дело в том, что эта прагма действиует только на одно последующее объявление переменной или константы. Чтобы не заморачиваться с кучей строк прагмы и ручным вычислением адресов, объедините свои константы в структуру.
Go to the top of the page
 
+Quote Post
1921
сообщение Jan 20 2011, 11:20
Сообщение #3


Участник
*

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



Цитата(rezident @ Jan 19 2011, 19:23) *
Дело в том, что эта прагма действиует только на одно последующее объявление переменной или константы. Чтобы не заморачиваться с кучей строк прагмы и ручным вычислением адресов, объедините свои константы в структуру.


А прагма будет действовать на всю структуру?
Хотя не очень охота возиться с длинными записями типа "структура.элемент". Удобнее было бы организовать сегмент, указать адрес его размещения и размер (например, 512 байт, чтобы если тереть, так уж всё!), а при объявлении констант указывать, в каком сегменте их разместить. Как-то так. Может, черканёте строчки три, как это сделать? Я чего-то не нашёл примеров. В этом сегменте я буду держать переменные (параметры), которые могут иногда изменяться (настройки там всякие...).
Кстати ещё вопросик. Тут один товарисч из scanti сказал, что время непрерывной записи сегмента ограничено. Долгое стояние в этом режиме приводит к развалу начала записываемого сектора, т.к. нельзя долго держать включенным генератор напряжения записи. Я так понимаю, это определяет минимальную частоту MCLK при этой процедуре. Не подскажите, какую величину имеет это время? Он навскидку не смог сказать.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Jan 20 2011, 11:41
Сообщение #4


Беспросветный оптимист
******

Группа: Свой
Сообщений: 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 =)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 20 2011, 11:51
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (MrYuran @ Jan 20 2011, 13:41) *
Вот ещё из FAQ от Сергея Борща:
Когда это писалось, компилятор имел версию 2.хх


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Jan 20 2011, 12:00
Сообщение #6


Беспросветный оптимист
******

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



Цитата(Сергей Борщ @ Jan 20 2011, 14:51) *
Когда это писалось, компилятор имел версию 2.хх

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


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
1921
сообщение Jan 20 2011, 12:55
Сообщение #7


Участник
*

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



Видите ли, боюсь, но память info меня не устроит. "Маловато будет!" Я бы откусил пару блоков по 512 сверху где-нибудь. И дал бы понять линковщику, что туда ничего писать не надо. В пиках я просто забивал пустой буфер до границы сектора. Здесь интереснее: не используемые буфера вообще игнорируются. Не, я могу чисто символически его где-нибудь в программе дёрнуть, но это по-моему неправильно. Как бы указать линкеру явно, чтобы не лез, куда его не просят? Хедеры и прочее переписывать не хочу, хочу, чтобы из программы. У структуры длинные имена, лень каждый раз писать. Хочу чтобы без структур. В общем, буду пинать его ногами, пока не устану или он не сдастся!!!
Go to the top of the page
 
+Quote Post
rezident
сообщение Jan 20 2011, 12:59
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 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 на линкер. Ей-богу будет больше пользы, чем от примера из двух строчек. sm.gif
Цитата(1921 @ Jan 20 2011, 16:20) *
Я так понимаю, это определяет минимальную частоту MCLK при этой процедуре. Не подскажите, какую величину имеет это время?
Допустимый диапазон частот для FTG указан в datasheet конкретного кристалла, навскидку что-то около 300-400кГц. А с медленным MCLK как какая-то другая беда была. Типа когда MCLK от VLO тактируют. Подробностей уже не помню. Где-то здесь был топик на эту тему.
Go to the top of the page
 
+Quote Post
jorikdima
сообщение Jan 20 2011, 13:18
Сообщение #9


тут может быть ваша реклама
*****

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



Цитата(1921 @ Jan 20 2011, 14:20) *
Кстати ещё вопросик. Тут один товарисч из scanti сказал, что время непрерывной записи сегмента ограничено. Долгое стояние в этом режиме приводит к развалу начала записываемого сектора, т.к. нельзя долго держать включенным генератор напряжения записи. Я так понимаю, это определяет минимальную частоту MCLK при этой процедуре. Не подскажите, какую величину имеет это время? Он навскидку не смог сказать.

Читайте даташит на кристал (не юзер гид), раздел Flash. Время порядка десятка мс. К MCLK это имеет очень далекое отношение, ибо процесс записи это несколько команд. Ну не делайте MCLK менее килогерца просто sm.gif
Go to the top of the page
 
+Quote Post
1921
сообщение Jan 20 2011, 14:15
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 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};
Говорит, что такая прагма тут не применима.
Go to the top of the page
 
+Quote Post
jorikdima
сообщение Jan 20 2011, 14:20
Сообщение #11


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 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};

?
Go to the top of the page
 
+Quote Post
1921
сообщение Jan 20 2011, 14:25
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 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};

?


Неа. Нехотит.
Go to the top of the page
 
+Quote Post
rezident
сообщение Jan 20 2011, 14:27
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 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 он конечно разместит там, где вы его попросите, но извлекать значения из нее не будет, воспользовавшись теми их значениями, которыми вы проинициализировали структуру на момент компиляции программы.
Go to the top of the page
 
+Quote Post
1921
сообщение Jan 20 2011, 14:40
Сообщение #14


Участник
*

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



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

Может, ну его... переписать пару строк в линкере, организовав два сегмента под свои нужды, раз уж он так не хочет?
Go to the top of the page
 
+Quote Post
rezident
сообщение Jan 20 2011, 14:42
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



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

Код
#pragma location=0x8000
__no_init MyPar_t MyPar;
#pragma required=MyPar
Go to the top of the page
 
+Quote Post

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

 


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


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