PDA

Просмотр полной версии : размещение переменных в памяти



Валенок
25.05.2010, 20:48
........................

Филоненко Владислав
25.05.2010, 23:03
это не гарантируется. но в конкретном проекте пройдет.

Валенок
25.05.2010, 23:18
...................

Филоненко Владислав
26.05.2010, 11:21
чтобы была гарантия - сделайте структуру, содержащую нужные члены.
не забываем про выравнивание!

Serge_UA
18.05.2011, 00:33
Подниму тему.
Насколько я понял из ответа Филоненко Владислава, члены структуры располагаются в памяти непрерывным блоком строго в том порядке, в котором они перечислены при объявлении структуры. Это верно?

И аналогичный вопрос по массивам. Элементы массива (пусть для определенности это будет ARRAY OF BYTE) расположены в памяти непрерывным блоком строго в порядке возрастания индекса. Это так?

И немного оффтопа:

чтобы была гарантия - сделайте структуру, содержащую нужные члены.
не забываем про выравнивание!

Что значит "выравнивание"? Встретил этот совет в нескольких темах форума. А что это такое и зачем/как это делать не нашел ни в документации ни на форуме :D

Игорь Петров
18.05.2011, 09:40
В CoDeSys при выборе реализации решение всегда принимается в пользу быстродействия. Возьмем современный проц. 32 разряда. Машинное слово (два байта) он берет за 1 такт, а вот взять бит для него это подпрограмма - медленнее раз в 20. В таком случае, компилятор CoDeSys будет под BOOL выделять целое слово 2 байта! Байты он тоже может выравнивать по границам слов. В памяти получаются дырки, но быстродействие программы на ST получается равным приличному Си компилятору.

Serge_UA
18.05.2011, 10:24
В CoDeSys при выборе реализации решение всегда принимается в пользу быстродействия. Возьмем современный проц. 32 разряда. Машинное слово (два байта) он берет за 1 такт, а вот взять бит для него это подпрограмма - медленнее раз в 20. В таком случае, компилятор CoDeSys будет под BOOL выделять целое слово 2 байта! Байты он тоже может выравнивать по границам слов. В памяти получаются дырки, но быстродействие программы на ST получается равным приличному Си компилятору.

При косвенном обращении к элементам ARRAY OF BYTE в 32-разрядном ПЛК (с помощью конструкции p=p+SIZEOF(p^)*n, где p - указатель на первый элемент массива, n - целое) данные элементов массива будут содержаться только при n кратном четырем?

Игорь Петров
18.05.2011, 13:58
При косвенном обращении к элементам ARRAY OF BYTE в 32-разрядном ПЛК (с помощью конструкции p=p+SIZEOF(p^)*n, где p - указатель на первый элемент массива, n - целое) данные элементов массива будут содержаться только при n кратном четырем?
Будут идти подряд при всех n. Начало массива будет выровнено на слово.

alhoresm
27.04.2012, 12:38
Здравствуйте
мне надо объявить 4 переменных типа real расположенных в памяти подряд. Обявляю так:


VAR_GLOBAL
realBuf1 AT %MD0:REAL;
realBuf2 AT %MD1:REAL;
realBuf3 AT %MD2:REAL;
realBuf4 AT %MD3:REAL;
...
END_VAR

ругается:
"... Invalid type real at address %MD2"
"... Invalid type real at address %MD3"
вопрос:
как узнать по каким адресам можно разместить такие переменные?
или как освободить ячейки %MD2 и %MD3 чтобы объявить в них переменные real ?
заранее спасибо

capzap
27.04.2012, 13:18
Здравствуйте
мне надо объявить 4 переменных типа real расположенных в памяти подряд. Обявляю так:

ругается:
"... Invalid type real at address %MD2"
"... Invalid type real at address %MD3"
вопрос:
как узнать по каким адресам можно разместить такие переменные?
или как освободить ячейки %MD2 и %MD3 чтобы объявить в них переменные real ?
заранее спасибо

То что Вы приводите в качестве примера, это глобальное сделать глобальным. Оно Вам надо? Используйте их непосредственно в поу или давайте им "красивые" имена локально

alhoresm
28.04.2012, 06:35
Дак ведь на %MD0 и %MD1 не ругается.
Пробовал так же объявить в поле переменных главного ПОУ, эффект тот же.
Пробовал объявить по другим адресам - вообще на все адреса ругается.
Не знаю как определить свободную область, по каким адресам можно объявлять переменные, намекните хотябы где можно почитать про это

Филоненко Владислав
28.04.2012, 06:54
1. При размещении переменных порядок обычно правильный, но самым верным было бы создать массив требуемой суммарной длины, а затем указателям на переменные задать адреса в этом массиве - так гарантированно переменные будут подряд.
2. Память типа %M в ПЛК не используется - вот компилятор и ругается. Первые 2 элемента оставлены для совместимости. НЕ используйте их.

alhoresm
28.04.2012, 07:52
Понял, спасибо,
если кому из новичков понадобится, код:


VAR
...
byteBuf:ARRAY [1..16] OF BYTE;
realBuf1,
realBuf2,
realBuf3,
realBuf4:POINTER TO REAL;
...
END_VAR
...
realbuf1:=ADR(bytebuf[1]);
realbuf2:=ADR(bytebuf[5]);
realbuf3:=ADR(bytebuf[9]);
realbuf4:=ADR(bytebuf[13]);

индексация немного кривая.
с самого начала так хотел сделать, но не нашел указатели и подумал что это делается через явное размещение переменных %M
:)

alhoresm
28.04.2012, 07:54
:) да ладно

и так вплоть до %MD249

у меня ПЛК 150 I L
из тех, что я перебирал, компилятор разрешил объявить только в %MD0 и %MD1

capzap
28.04.2012, 08:01
букву L то я и не заметил :)