Вот с таким вопросом разбирался: в каком порядке и с какими задержками выполняются 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
Теперь поменяем порядок инициализации компонентов:
Код: Выделить всё
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-схем надо эти моменты учитывать.