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

Тема: Программирование ПЛК110 [М02] для задач реального времени

Древовидный режим

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

    По умолчанию

    Цитата Сообщение от Владимир Ситников Посмотреть сообщение
    В чём проблема на этот раз?
    linker_and_limitation.png
    Забавы ради сделал такую же программу в черепахе.
    Выглядит, конечно, не супер, но я сделал так, чтобы было сравнение 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
    Тут вообще ни одного дополнительного регистра не понадобилось. Просто кучка условных переходов.

    Ценность вышеобозначенных примеров, конечно, невелика, но если компилятор без проблем работает с "упоротым" кодом, то и нормально написанный он нормально будет компилировать.
    Последний раз редактировалось Владимир Ситников; 21.10.2016 в 10:16. Причина: добавил ссылку на hardella

Похожие темы

  1. Ответов: 38
    Последнее сообщение: 24.01.2022, 11:56
  2. Ответов: 10
    Последнее сообщение: 11.06.2021, 14:55
  3. часы реального времени
    от vetaly в разделе ПЛК1хх
    Ответов: 4
    Последнее сообщение: 28.08.2015, 16:21
  4. Таймер реального времени УТ1-РiС
    от ser10 в разделе Трёп (Курилка)
    Ответов: 0
    Последнее сообщение: 16.09.2010, 11:24

Ваши права

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