https://hardella.com/docs/pru/featur...9A110-%D0%9C02
Объём регистровой памяти: около 30 DWORD регистров (около 120 байт)
https://hardella.com/docs/pru/featur...9A110-%D0%9C02
Объём регистровой памяти: около 30 DWORD регистров (около 120 байт)
Зря они не пропадут.
В ошибке "нехватки регистров" на самом деле есть полная распечатка того, какие переменные и в каких регистрах хранились.
Если вы скопируете в буфер обмена строку с ошибкой "RegAlloc", и вставите её, например, в блокнот, то увидите, что там довольно много текста.
Владимир, у PRU кроме регистровой памяти есть оперативная память (ОЗУ). Значит есть возможность сохранять регистровую память в ОЗУ. Это надо делать после отработки каждого ФБ, т.е. перед началом выполнения ФБ читаем ОЗУ в регистры, а после выполнения ФБ сохраняем регистры в ОЗУ. В этом случае будет возможность выполнять в программе PRU разные ФБ и не будет никакой каши в регистровой памяти. Каждый ФБ сможет использовать для своих нужд до 30 регистров. Время выполнения программы PRU увеличиться, зато можно будет писать более сложные программы.
Еще лучше вместо ОЗУ использовать стековую память, если она имеется.
Последний раз редактировалось IVM; 19.01.2018 в 14:18.
Отличная новость. Ждемс.
А стековая память у PRU есть ? Вот такая: https://studfiles.net/preview/4339738/page:16/). Очень удобно прятать в ней регистры.
Последний раз редактировалось IVM; 21.01.2018 в 20:06.
Вы хотите запитать 2 ШД?
Пробовали один в PRU0, второй в PRU1?
Один блок PRU_STEPPER без проблем помещается в одно ядро, поэтому непонятно зачем вы пытаетесь "поместить два блока в одно ядро".
Т.е. берите стандартный пример "step motors", там программа, которая управляет двумя ШД. Чем она не подошла?
Сделал использование вспомогательной памяти, регистры теперь не заканчиваются, но это всё равно не решает проблему "размещения двух ШД блоков в одном ядре".
Если размещать 2 блока в одном ядре, то примерно 12-15 переменных не помещаются в регистры, и размер кода получается 1060 команд т.к. добавляется довольно много команд по передаче данных между регистрами и памятью. А памяти у каждого ядра всего на 1024 команды.
Да, 1060 и 1024 это не так далеко, и, возможно, если объединить какие-нибудь переменные (например, сделать accel_ramp всегда равным decel_ramp), то может и получиться ужать два блока в 1024 команды. Но какой смысл? Можно же просто выполнять один ШД в одном ядре, а второй во втором.
Команд работы со стеком нет, но, "прятать" регистры -- не проблема. Проблема, что кода получается много. Например, если объявить (и вызвать) два ФБ PRU_STEPPER, то размер программы увеличивается более чем в два раза (по отношению к одному блоку).
Компилировать блок 1 раз и переиспользовать, конечно, можно, но:
1) Два ШД можно сделать и на существующем механизме
2) Подобная доработка компилятора может занять сравнимое время с разработкой механизма, когда часть программы выполняется в PRU, а часть в основной программе. При этом, у варианта "часть программы в основной КДС" преимущество в том, что в КДС программе более точные вычисления (FLOAT/REAL и т.п.), а в PRU только целочисленная арифметика.