[etherlab-dev] Announcement: Userspace EtherCAT master
Ricardo Ribalda Delgado
ricardo.ribalda at gmail.com
Tue Mar 10 16:10:13 CET 2015
Hello Frank
Thank you very much for you contribution. Once I am less busy at work
I would like to repack it to openembedded (which should be really easy
due to the way you have packed it). I hope it is ok with you.
For our system it makes much more sense a user space library, because
we don't have any hard requirement to met. I hope that at some point
this is merged with the main project.
Regards!
On Tue, Mar 3, 2015 at 1:56 PM, Frank Heckenbach
<f.heckenbach at fh-soft.de> wrote:
> 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
> _______________________________________________
> etherlab-dev mailing list
> etherlab-dev at etherlab.org
> http://lists.etherlab.org/mailman/listinfo/etherlab-dev
--
Ricardo Ribalda
More information about the Etherlab-dev
mailing list