Забавы ради сделал такую же программу в черепахе.
Выглядит, конечно, не супер, но я сделал так, чтобы было сравнение 1 в 1. Точно такой же ФБ PRU_AND.
Если кратко, то черепахе оказалось достаточно 4 байт для "FROM HOST" и 5 временных байт (т.е. хватило всего 9 байт регистровой памяти)
"линкер от ОВЕН" не смог скомпилировать эту программу и с помощью 20-и байт регистровой памяти.
Само по себе использование ФБ для компилятора сложнее (чем "встроенные" функции AND), т.к. у ФБ значения выходов нельзя терять. Например, если они на каком-то цикле значения не передавались (а был просто вызов ФБ), то нужно использовать "прошлые" значения входов.
Т.е. самый простой вариант -- всегда выделять отдельные регистры для каждого входа и выхода, но это порождает "потенциально лишнее копирование из одной переменной в другую" и потенциальный перерасход регистров. Я так понял, Владислав пропагандирует именно такой способ.
Как видим, 15 AND'ов скомпилировать таким подходом уже проблема. По-моему, это слишком высокая плата за мнимую "надёжность".
Снимок экрана 2016-10-04 в 18.28.36.png
Я сделал PRU_AND2 как "полноценный блок".
Блок-то он отдельный, но компилятор "видит его насквозь" и понимает суть происходящего. Мой компилятор понимает, что ассемблерная инструкция AND всегда записывает выходную переменную, т.е. компилятор догадывается, что для этого блока статичный выходной регистр не нужен.
Результирующий код использует следующие регистры:
R1 -- 4 байта для PRU_FROM_HOST
R2 и R3.b0 -- 5 временных байт.
Да, сама программа получилась не супер -- 31 инструкция (если отбросить HOST/OUT и т.п. обёртку), т.к. осталась часть команд "присвоения входов-выходов" для блоков PRU_AND2.
Снимок экрана 2016-10-04 в 18.33.24.png
Под конец только AND'ы идут, т.е. прямо "идеальный код":
Снимок экрана 2016-10-04 в 19.07.09.png
Но мы же на ST пишем?
Что мешает сделать IF (AND AND) THEN?
Ничего. Немного копипасты и получается такое:
Снимок экрана 2016-10-04 в 19.11.58.png
Тут ассемблерный код получается куда лаконичнее. Компилятор просто использует "условные переходы" и прерывает выполнение на первом же FALSE.
Снимок экрана 2016-10-04 в 19.13.28.png
Тут вообще ни одного дополнительного регистра не понадобилось. Просто кучка условных переходов.
Ценность вышеобозначенных примеров, конечно, невелика, но если компилятор без проблем работает с "упоротым" кодом, то и нормально написанный он нормально будет компилировать.