Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 15

Тема: размещение переменных в памяти

  1. #1
    Пользователь
    Регистрация
    23.09.2008
    Адрес
    Центророссийск
    Сообщений
    2,251

    По умолчанию размещение переменных в памяти

    ........................
    Последний раз редактировалось Валенок; 09.08.2021 в 13:06.

  2. #2

    По умолчанию

    это не гарантируется. но в конкретном проекте пройдет.

  3. #3
    Пользователь
    Регистрация
    23.09.2008
    Адрес
    Центророссийск
    Сообщений
    2,251

    По умолчанию

    ...................
    Последний раз редактировалось Валенок; 09.08.2021 в 13:06.

  4. #4

    По умолчанию

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

  5. #5
    Пользователь
    Регистрация
    10.05.2011
    Адрес
    Харьков
    Сообщений
    21

    По умолчанию

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

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

    И немного оффтопа:
    Цитата Сообщение от Филоненко Владислав Посмотреть сообщение
    чтобы была гарантия - сделайте структуру, содержащую нужные члены.
    не забываем про выравнивание!
    Что значит "выравнивание"? Встретил этот совет в нескольких темах форума. А что это такое и зачем/как это делать не нашел ни в документации ни на форуме

  6. #6

    По умолчанию

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

  7. #7
    Пользователь
    Регистрация
    10.05.2011
    Адрес
    Харьков
    Сообщений
    21

    По умолчанию

    Цитата Сообщение от Игорь Петров Посмотреть сообщение
    В CoDeSys при выборе реализации решение всегда принимается в пользу быстродействия. Возьмем современный проц. 32 разряда. Машинное слово (два байта) он берет за 1 такт, а вот взять бит для него это подпрограмма - медленнее раз в 20. В таком случае, компилятор CoDeSys будет под BOOL выделять целое слово 2 байта! Байты он тоже может выравнивать по границам слов. В памяти получаются дырки, но быстродействие программы на ST получается равным приличному Си компилятору.
    При косвенном обращении к элементам ARRAY OF BYTE в 32-разрядном ПЛК (с помощью конструкции p=p+SIZEOF(p^)*n, где p - указатель на первый элемент массива, n - целое) данные элементов массива будут содержаться только при n кратном четырем?

  8. #8

    По умолчанию

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

  9. #9

    По умолчанию

    Здравствуйте
    мне надо объявить 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 ?
    заранее спасибо

  10. #10
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,249

    По умолчанию

    Цитата Сообщение от alhoresm Посмотреть сообщение
    Здравствуйте
    мне надо объявить 4 переменных типа real расположенных в памяти подряд. Обявляю так:

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

Страница 1 из 2 12 ПоследняяПоследняя

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •