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.heckenb...@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.heckenb...@fh-soft.de> > Stubenlohstr. 6, 91052 Erlangen, Germany, +49-9131-21359 > Systems Programming, Software Development, IT Consulting > _______________________________________________ > etherlab-dev mailing list > etherlab-dev@etherlab.org > http://lists.etherlab.org/mailman/listinfo/etherlab-dev -- Ricardo Ribalda _______________________________________________ etherlab-dev mailing list etherlab-dev@etherlab.org http://lists.etherlab.org/mailman/listinfo/etherlab-dev