Страница 1 из 1

HAL-файлы: порядок выполнения компонентов.

Добавлено: 15 фев 2015, 14:49
Сергей Саныч
Провел небольшое исследование.
Вот с таким вопросом разбирался: в каком порядке и с какими задержками выполняются hal-компоненты, то есть программные модули, изображающие, в частности, логические элементы И, ИЛИ, НЕ и прочие? Понятно, что реальные физические элементы создают задержку - сигнал на выходе появляется через определенное время после подачи входного. С этим можно бороться, это нужно учитывать. В конце концов, это можно использовать.
А как в случае их программной эмуляции в LinuxCNC? Ведь расчет в любом случае происходит последовательно с периодом тактовой частоты (base-thread или servo-thread)! Соответственно, все зависит от последовательности выполнения модулей. И если несколько модулей соединены последовательно, то результирующая задержка (в тактах используемого thread'а) будет либо "нулевая", независимо от количества элементов (если следующий элемент в цепочке будет выполняться после предыдущего), либо равна количеству элементов (если наоборот).
Поставил опыт: простейшая схема: сигнал-генератор, а к нему подключены последовательно несколько элементов-повторителей (в качестве их взяты or2). Элементы тактируются servo-thread для большей наглядности.

Код: Выделить всё

loadrt threads  name1=base-thread period1=30000 fp1=0 name3=servo-thread period3=1000000

loadrt siggen
addf siggen.0.update servo-thread
setp siggen.0.frequency 50

loadrt or2 count=4
addf or2.0 servo-thread
addf or2.1 servo-thread
addf or2.2 servo-thread
addf or2.3 servo-thread

setp or2.0.in0 false
setp or2.1.in0 false
setp or2.2.in0 false
setp or2.3.in0 false

net n0 siggen.0.clock or2.0.in1
net n1 or2.0.out or2.1.in1
net n2 or2.1.out or2.2.in1
net n3 or2.2.out or2.3.in1


start

Здесь компоненты or2 соединены в порядке их инициализации командами addf.
Снимок-HAL Осциллограф1.png (3496 просмотров) <a class='original' href='./download/file.php?id=43149&sid=2a7b64bac1cc8b9afce8bbf743143be3&mode=view' target=_blank>Загрузить оригинал (67.49 КБ)</a>
Получается, что в данном случае задержка отсутствует - сигнал на всех выходах изменяется одновременно.

Теперь поменяем порядок инициализации компонентов:

Код: Выделить всё

loadrt threads  name1=base-thread period1=30000 fp1=0 name3=servo-thread period3=1000000

loadrt siggen
addf siggen.0.update servo-thread
setp siggen.0.frequency 50

loadrt or2 count=4
addf or2.3 servo-thread
addf or2.2 servo-thread
addf or2.1 servo-thread
addf or2.0 servo-thread

setp or2.0.in0 false
setp or2.1.in0 false
setp or2.2.in0 false
setp or2.3.in0 false

net n0 siggen.0.clock or2.0.in1
net n1 or2.0.out or2.1.in1
net n2 or2.1.out or2.2.in1
net n3 or2.2.out or2.3.in1


start
Снимок-HAL Осциллограф2.png (3496 просмотров) <a class='original' href='./download/file.php?id=43148&sid=2a7b64bac1cc8b9afce8bbf743143be3&mode=view' target=_blank>Загрузить оригинал (67.92 КБ)</a>
Сразу же видим: появились задержки на период тактовой частоты, в данном случае 1 мсек.

К чему это я? К тому, что при синтезе более-менее сложных hal-схем надо эти моменты учитывать.

Re: HAL-файлы: порядок выполнения компонентов.

Добавлено: 15 фев 2015, 15:05
nkp
очень интересная тема!
но так как компоненты программные - то рассматривать их целесообразно начиная с программной реализации...
тогда выводы будут однозначны , а значит применительны на практике...

Re: HAL-файлы: порядок выполнения компонентов.

Добавлено: 15 фев 2015, 15:20
Nick
Я так как-то делал тактовый генератор not.out->not.in.

Re: HAL-файлы: порядок выполнения компонентов.

Добавлено: 15 фев 2015, 17:00
Serg
Где-то в доках рекомендовалось addf делать в порядке, совпадающем с прохождением сигнала по схеме...
Или это было в коментах в исходниках...
nkp писал(а):но так как компоненты программные - то рассматривать их целесообразно начиная с программной реализации...
тогда выводы будут однозначны , а значит применительны на практике...
Не принципиально. У каждого компонента есть функция, которая выполняется один раз за серво/базовый цикл. В каждой итерации оной сигналы читаются на входах и выставляются на выходах. Её можно рассматривать как атомарную операцию, ибо пока она выполняется ничего другого не происходит.
Желающие могут сами это проверить организовав бесконечный цикл в компоненте... Только сначала сохраните все открытые файлы... :)