[etherlab-dev] Announcement: Userspace EtherCAT master
Frank Heckenbach
f.heckenbach at fh-soft.de
Tue Mar 3 13:56:55 CET 2015
Hi,
this is the announcement of my userspace master code, according to
my plans explained in
http://lists.etherlab.org/pipermail/etherlab-dev/2014/000437.html
Download, installation and usage instructions can be found on my web
site at http://fh-soft.de/src/ethercat-userspace.html
I hope you don't mind me sending my announcement to this list.
But it also contains some patches that may be interesting for the
original IgH master code (see below). Further discusssion which is
not related to the IgH master code should be continued by private
mail.
The whole porting was almost easier than I had anticipated. I could
follow my roadmap (as detailed in the mail above) 100%. Almost the
only unexpected problem (aside from some minor issues mostly found
by compiler warnings, see e30-cleanup.patch) was that I had to
increase EC_IO_TIMEOUT from 500 to 2000 (microseconds). And even
that shouldn't have been unexpected since this is exactly the timing
I had planned and tested for anyway (for PDOs); I just hadn't been
aware of this hard timeout for SDOs. So increasing it was no
problem.
With our application at 500Hz we did not observe any packet loss
(including timeouts) over the course of several hours. On a faster
development machine (8*i7), we could even increase the frequency to
2kHz without packet loss during a test of several minutes, and 4kHz
with only sporadic packet loss. (But this won't be our production
machine, unfortunately. ;) This was all done on a standard Debian
wheezy kernel, without CONFIG_PREEMPT set, but of course using soft
realtime and CPU affinity.
As planned, I replaced the cdev ioctl with a simple TCP protocol
that encapsulates the former ioctl data. This makes it possible
(in fact almost trivial) to access it from a remote host. Therefore
I added a new option "--host" to the "ethercat" tool.
One could do the same to lib easily, but I didn't do it yet, since
the value of running an application remotely seems questionable.
(In fact I don't use lib myself, and with the userspace master,
there might be little purpose to it at all, since the main
application runs in userspace already, with less communication
overhead. lib would be useful to run several applications on the
same master simultaneously. Whether or not that's useful to someone,
I kept lib because it was almost trivial to do.)
I built the code as a deb package, because Debian is the system I
use, and because the preferred way for source deb packages is to
have unmodified original sources plus a set of patches which are
applied during the build process. This matches exactly what I had
done before anyway. However, this doesn't mean the code will only
work on Debian; my web site contains build instructions for other
Linux systems.
So all changes I made to the sources are contained in the
debian/patches directory of
http://fh-soft.de/deb/ethercat-userspace_1.5.0-1.debian.tar.gz
(The remaining files in this archive, as well as
ethercat-userspace_1.5.0-1.dsc, are rather standard deb packaging
stuff, not needed unless you want to build deb packages.
ethercat-userspace_1.5.0.orig.tar.bz2 is exactly the original IgH
EtherCAT-Master 1.5.0 release as downloaded from
http://etherlab.org/download/ethercat/ethercat-1.5.0.tar.bz2
just renamed as required by deb package requirements).
The first few patches (starting with "e") should be generally useful
for the kernel master code as well, and you can apply them whether
or not you care about the userspace master:
- e02-*.patch .. e29-*.patch
These are exactly my previous patches (from the attachment in
http://lists.etherlab.org/pipermail/etherlab-dev/2014/000404.html),
though renamed from NN-ethercat-1.5-DESC.patch to eNN-DESC.patch
- e30-cleanup.patch
Some bug fixes (e.g. type errors) and cleanup (e.g. removal of
unused variables) that I encountered while building on a 64 bit
system and with higher warning options. It seems Knud's patches
contain some of the same; well, that's the price of forked
development.
- e31-open-master.patch
Make the ecrt_open_master() function also available for the (so
far kernel) master application (not only for the lib). It's useful
to access the master to wait for the bus scan to complete and the
SDO dictionaries to be fetched, before calling
ecrt_request_master() which already starts the operation thread.
Before, I had used an external script which used the ethercat tool
to do the waiting, but it was already a bit awkward, and would
become even more so when the application runs with the user space
master. I see no reason not to make this function available, so I
did it instead of writing a cumbersome workaround.
- e32-request-master-check-device.patch
In ecrt_request_master(), verify that the master actually has a
device attached, just like ecrt_open_master() does.
- e33-errno.patch
struct ec_sdo_request contains a field called errno which is a bit
unfortunate since system headers may define errno as a macro (for
thread support). Of course, this doesn't matter in kernel code
which doesn't use those headers, but I'd still suggest to change
it. I simply renamed it to "errno_" here. Of course, any other
name would be fine, too.
- e34-manpage.patch
Add a man page (as required by deb packages) for the ethercat
tool, auto-generated with the "help2man" tool. Add a "--version"
option (required by help2man) to the tool.
Note: Applying this patch will add a dependency on help2man which
is widely available. But if this seems like a problem, it could be
checked for by configure (there are examples to do this out
there).
- e35-pkg-config.patch
Add a .pc file for libethercat, so it can be used with pkg-config.
Note: pkg-config is not required for building (the file is
generated with simple variable subtitutions), and using it for the
installed library is entirely optional, so applying this patch
doesn't add any dependencies.
The following patches contain changes specifially for userspace
master support, though they don't actually change the behaviour yet.
If you care about userspace support, you could apply them without
breaking the kernel master (though they provide no benefit to it
either):
- u01-ioctl.patch
Split the ioctl calls from lib and tool into three groups
(ioctl_noarg (no argument), ioctl_value (just a single integer
argument), and ioctl_typed (integer argument and some data
structure)), as will be required by the emulation below.
This is a boring patch that just replaces ioctl() with 3 other
names and in the end #defines them all back to ioctl(), so it
doesn't change the behaviour yet.
- u02-emulation.patch
Emulation for the kernel headers used by the master code. These
are partly dummy headers, partly copied from actual kernel headers
(where there are no actual kernel dependencides, especially
list.h) and partly replacement functions written for this purpose.
This patch just adds some files in a new directory
emulation/linux/ which is not referenced from anywhere, so it
doesn't change the behaviour yet.
- u03-master-in-userspace.patch
This patch contains the actual changes necessary for the userspace
master (in master/ and devices/generic.c). As stated in my
announcement, I tried to put most of them in the emulation (see
previous patch), but a few changes were still necessary.
It also adds the new ecrt_init() and ecrt_done() functions as well
as ethercat_master.c (see "Usage" for all of them) and, in cdev.c,
a thread (per master) to provide a TCP based emulation for the
ioctl calls.
The patch also contains changes to lib/ and tool/ to use the
emulation to access the master. (The actual emulation code is in
master/ioctl.h, together with the master-side code for easier
maintenance.)
All relevant changes are #ifdef'ed EC_MASTER_IN_USERSPACE which is
not defined anywhere, so it doesn't change the behaviour yet.
The last patch finally changes the behaviour:
- build-userspace.patch
This patch only contains changes to Makefiles and configure to
avoid building kernel code, as well as examples/ and script/,
and instead build the userspace master, using -Iemulation/ and
defining EC_MASTER_IN_USERSPACE as required.
Someone who is better versed in autotools than I am might even be
able to arrange things so both versions can be built together.
This would require building the master twice, of course, but also
lib/ and tool/ (once with ioctl and once with the TCP emulation),
or else add a runtime switch to them so the same code will work
with both versions of the master (which actually shouldn't be so
hard). Though I don't know if anyone has any use for this -- you
probably want to use either the kernel or the userspace master,
not both at the same time ...
Regards,
Frank
--
Dipl.-Math. Frank Heckenbach <f.heckenbach at fh-soft.de>
Stubenlohstr. 6, 91052 Erlangen, Germany, +49-9131-21359
Systems Programming, Software Development, IT Consulting
More information about the Etherlab-dev
mailing list