<div dir="ltr"><div>I'm in the process of studying the ec_master code in order to better understand how a slave needs to be constructed. From what I learnt until know, I believe it works like this:</div><div><br></div>
1. First, you need to insmod ec_master with the option 'main_devices=<MAC addresses>'. Then you have 2 options.<div><br></div><div>a) You load one of the EtherCAT enabled NIC drivers (ec_e1000.ko), which will register itself for every NIC instance to the running ec_master. If there's a match of MAC address, the master will immediately start using it in idle mode and it lets the driver know that it has to do EtherCAT specific things and not become a Linux eth<x> device. If there is no match, the driver continues to register with Linux and becomes an eth<x> device as usual. Beware that if a driver is already loaded for a NIC type (e.g. e1000), the ec_... drivers will load but will not be 'attached' to the device until the original driver is unloaded first (rmmod e1000) and then the ec_ driver is reloaded. It's how the Linux PCI subsystem works.</div>
<div><br></div><div>b) You can use ec_generic.ko. It similarly registers the MAC addresses of any eth<x> adapter in the Linux system and if the adapter MAC matches and it is in the down state, the master will start using it.</div>
<div><br></div><div>For the up- and downsides, see my answer to your second question:</div><div><br></div><div>2. After moving from the INIT state, your application is solely responsible for calling ec_master functions. It is then no more than a library with functions like ecrt_master_send that in turn eventually end up in calling the NIC driver. This is where a) and b) above fundamentally differ. In the case of a), the code flow through the NIC send function never blocks, since it has been designed that way. If you were running in a RT (primary mode) Xenomai thread, that very thread would run without interruptions through the ec_master functions, the driver code and return to your application. In the case of b) however, the original Linux driver is called. It may contain code that blocks and would cause a Xenomai thread to switch to secondary mode. That could be e.g. due to the need to allocate socket buffers. It breaks hard real-time. As an example of how the ec_ drivers avoid blocking: they preallocate these buffers once and recycle them perpetually.</div>
<div><br></div><div>Also, it seems that, using RT-PREEMPT w/o anything like Xenomai, already does a very good job of meeting deadlines. So ec_generic definitely has its purposes.</div><div><br></div><div>If you want to run using native Xenomai API, be sure to link against ethercat_rtdm and check /proc/xenomai/stat that no mode switches are occurring.</div>
<div><br></div><div><br></div><div>J.</div><div><br></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">2013/9/17 Engel, Franz <span dir="ltr"><<a href="mailto:Franz.Engel@eads.net" target="_blank">Franz.Engel@eads.net</a>></span><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi everybody,<br>
<br>
I have the following system configuration: Ubuntu 10.04, Kernel 2.6.38, I-Pipe and Xenomai 2.6.2.1,  the developer version of etherlab from the mercurial repo<br>
<br>
I have two simple question:<br>
1. How can I be sure if I installed the ethercatmaster with realtime capabilities. After the start of the master (with "./ethercat start") I get the following entries in my lsmod: ec_rtdm, ec_master, e1000. Is it correct that there is still the e1000 module?<br>

2. Or is RTDM using the ethernet module (e1000). Is this realy realtime? Or should I replace the module with an realtime module from the rtnet-Project?<br>
<br>
Thanks and regards,<br>
      Franz<br>
_______________________________________________<br>
etherlab-users mailing list<br>
<a href="mailto:etherlab-users@etherlab.org">etherlab-users@etherlab.org</a><br>
<a href="http://lists.etherlab.org/mailman/listinfo/etherlab-users" target="_blank">http://lists.etherlab.org/mailman/listinfo/etherlab-users</a><br>
</blockquote></div><br></div>