Показано с 1 по 10 из 1349

Тема: Hardella IDE

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    По умолчанию

    Цитата Сообщение от IVM Посмотреть сообщение
    Владимир, сколько у PRU регистров и сколько байт в регистре ?
    https://hardella.com/docs/pru/featur...9A110-%D0%9C02

    Объём регистровой памяти: около 30 DWORD регистров (около 120 байт)

  2. #2

    По умолчанию

    Цитата Сообщение от Владимир Ситников Посмотреть сообщение
    А если переменная объявлена как WORD, то она займет полрегистра, а вторые полрегистра будут не использованы и пропадут зря ?

  3. #3

    По умолчанию

    Цитата Сообщение от IVM Посмотреть сообщение
    А если переменная объявлена как WORD, то она займет полрегистра, а вторые полрегистра будут не использованы и пропадут зря ?
    Зря они не пропадут.

    В ошибке "нехватки регистров" на самом деле есть полная распечатка того, какие переменные и в каких регистрах хранились.
    Если вы скопируете в буфер обмена строку с ошибкой "RegAlloc", и вставите её, например, в блокнот, то увидите, что там довольно много текста.

  4. #4

    По умолчанию

    Владимир, у PRU кроме регистровой памяти есть оперативная память (ОЗУ). Значит есть возможность сохранять регистровую память в ОЗУ. Это надо делать после отработки каждого ФБ, т.е. перед началом выполнения ФБ читаем ОЗУ в регистры, а после выполнения ФБ сохраняем регистры в ОЗУ. В этом случае будет возможность выполнять в программе PRU разные ФБ и не будет никакой каши в регистровой памяти. Каждый ФБ сможет использовать для своих нужд до 30 регистров. Время выполнения программы PRU увеличиться, зато можно будет писать более сложные программы.

    Еще лучше вместо ОЗУ использовать стековую память, если она имеется.
    Последний раз редактировалось IVM; 19.01.2018 в 14:18.

  5. #5

    По умолчанию

    Цитата Сообщение от IVM Посмотреть сообщение
    Владимир, у PRU кроме регистровой памяти есть оперативная память (ОЗУ). Значит есть возможность сохранять регистровую память в ОЗУ.
    Мыслите правильно.
    Я об этом же говорил:
    Цитата Сообщение от Владимир Ситников Посмотреть сообщение
    прохоже, стоит научить компилятор сохранять регистры в память.
    Скоро сделаю задействование ОЗУ, и с нехваткой регистров проблемы уйдут.

  6. #6

    По умолчанию

    Цитата Сообщение от Владимир Ситников Посмотреть сообщение
    Скоро сделаю задействование ОЗУ, и с нехваткой регистров проблемы уйдут.
    Отличная новость. Ждемс.

    А стековая память у PRU есть ? Вот такая: https://studfiles.net/preview/4339738/page:16/). Очень удобно прятать в ней регистры.
    Последний раз редактировалось IVM; 21.01.2018 в 20:06.

  7. #7

    По умолчанию

    Цитата Сообщение от IVM Посмотреть сообщение
    Отличная новость. Ждемс.
    Вы хотите запитать 2 ШД?
    Пробовали один в PRU0, второй в PRU1?
    Один блок PRU_STEPPER без проблем помещается в одно ядро, поэтому непонятно зачем вы пытаетесь "поместить два блока в одно ядро".

    Т.е. берите стандартный пример "step motors", там программа, которая управляет двумя ШД. Чем она не подошла?

    Цитата Сообщение от IVM Посмотреть сообщение
    Отличная новость. Ждемс.
    Сделал использование вспомогательной памяти, регистры теперь не заканчиваются, но это всё равно не решает проблему "размещения двух ШД блоков в одном ядре".
    Если размещать 2 блока в одном ядре, то примерно 12-15 переменных не помещаются в регистры, и размер кода получается 1060 команд т.к. добавляется довольно много команд по передаче данных между регистрами и памятью. А памяти у каждого ядра всего на 1024 команды.

    Да, 1060 и 1024 это не так далеко, и, возможно, если объединить какие-нибудь переменные (например, сделать accel_ramp всегда равным decel_ramp), то может и получиться ужать два блока в 1024 команды. Но какой смысл? Можно же просто выполнять один ШД в одном ядре, а второй во втором.

    Цитата Сообщение от IVM Посмотреть сообщение
    А стековая память у PRU есть ? Вот такая: https://studfiles.net/preview/4339738/page:16/). Очень удобно прятать в ней регистры.
    Команд работы со стеком нет, но, "прятать" регистры -- не проблема. Проблема, что кода получается много. Например, если объявить (и вызвать) два ФБ PRU_STEPPER, то размер программы увеличивается более чем в два раза (по отношению к одному блоку).

    Компилировать блок 1 раз и переиспользовать, конечно, можно, но:
    1) Два ШД можно сделать и на существующем механизме
    2) Подобная доработка компилятора может занять сравнимое время с разработкой механизма, когда часть программы выполняется в PRU, а часть в основной программе. При этом, у варианта "часть программы в основной КДС" преимущество в том, что в КДС программе более точные вычисления (FLOAT/REAL и т.п.), а в PRU только целочисленная арифметика.

Ваши права

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