306 The EtherCAT master is integrated into the Linux 2.6 kernel. This was |
306 The EtherCAT master is integrated into the Linux 2.6 kernel. This was |
307 an early design decision, which has been made for several reasons: |
307 an early design decision, which has been made for several reasons: |
308 |
308 |
309 \begin{itemize} |
309 \begin{itemize} |
310 |
310 |
311 \item Kernel code has significantly better realtime characteristics, |
311 \item Kernel code has significantly better realtime characteristics, i.\,e.\ |
312 i.\,e.~less latency than userspace code. It was foreseeable, that a fieldbus |
312 less latency than userspace code. It was foreseeable, that a fieldbus master |
313 master has a lot of cyclic work to do. Cyclic work is usually triggered by |
313 has a lot of cyclic work to do. Cyclic work is usually triggered by timer |
314 timer interrupts inside the kernel. The execution delay of a function that |
314 interrupts inside the kernel. The execution delay of a function that processes |
315 processes timer interrupts is less, when it resides in kernelspace, because |
315 timer interrupts is less, when it resides in kernelspace, because there is no |
316 there is no need of time-consuming context switches to a userspace process. |
316 need of time-consuming context switches to a userspace process. |
317 |
317 |
318 \item It was also foreseeable, that the master code has to directly |
318 \item It was also foreseeable, that the master code has to directly |
319 communicate with the Ethernet hardware. This has to be done in the kernel |
319 communicate with the Ethernet hardware. This has to be done in the kernel |
320 anyway (through network device drivers), which is one more reason for the |
320 anyway (through network device drivers), which is one more reason for the |
321 master code being in kernelspace. |
321 master code being in kernelspace. |
363 |
363 |
364 \end{description} |
364 \end{description} |
365 |
365 |
366 %------------------------------------------------------------------------------ |
366 %------------------------------------------------------------------------------ |
367 |
367 |
368 \section{Phases} |
368 \section{Master Module} |
|
369 \label{sec:mastermod} |
|
370 \index{Master module} |
|
371 |
|
372 The EtherCAT master kernel module \textit{ec\_master} can contain multiple |
|
373 master instances. Each master waits for a certain Ethernet device identified |
|
374 by its MAC address\index{MAC address}. These addresses have to be specified on |
|
375 module loading via the \textit{main\_devices} module parameter. The number of |
|
376 master instances to initialize is taken from the number of MAC addresses |
|
377 given. |
|
378 |
|
379 The below command loads the master module with a single master instance that |
|
380 waits for the Ethernet device with the MAC address |
|
381 \lstinline+00:0E:0C:DA:A2:20+. The master will be accessible via index $0$. |
|
382 |
|
383 \begin{lstlisting} |
|
384 # `\textbf{modprobe ec\_master main\_devices=00:0E:0C:DA:A2:20}` |
|
385 \end{lstlisting} |
|
386 |
|
387 MAC addresses for multiple masters have to be separated by commas: |
|
388 |
|
389 \begin{lstlisting} |
|
390 # `\textbf{modprobe ec\_master main\_devices=00:0E:0C:DA:A2:20,00:e0:81:71:d5:1c}` |
|
391 \end{lstlisting} |
|
392 |
|
393 The two masters can be addressed by their indices 0 and 1 respectively (see |
|
394 figure~\ref{fig:masters}). The master index is needed for the |
|
395 \lstinline+ecrt_master_request()+ function of the application interface (see |
|
396 chap.~\ref{chap:api}) and the \lstinline+--master+ option of the |
|
397 \textit{ethercat} command-line tool (see sec.~\ref{sec:tool}), which defaults |
|
398 to $0$. |
|
399 |
|
400 \begin{figure}[htbp] |
|
401 \centering |
|
402 \includegraphics[width=.5\textwidth]{images/masters} |
|
403 \caption{Multiple masters in one module} |
|
404 \label{fig:masters} |
|
405 \end{figure} |
|
406 |
|
407 \paragraph{Init Script} |
|
408 \index{Init script} |
|
409 |
|
410 In most cases it is not necessary to load the master module and the Ethernet |
|
411 driver modules manually. There is an init script available, so the master can |
|
412 be started as a service (see sec.~\ref{sec:system}). |
|
413 |
|
414 \paragraph{Syslog} |
|
415 |
|
416 The master module outputs information about its state and events to the kernel |
|
417 ring buffer. These also end up in the system logs. The above module loading |
|
418 command should result in the messages below: |
|
419 |
|
420 \begin{lstlisting} |
|
421 # `\textbf{dmesg | tail -2}` |
|
422 EtherCAT: Master driver `\masterversion` |
|
423 EtherCAT: 2 masters waiting for devices. |
|
424 |
|
425 # `\textbf{tail -2 /var/log/messages}` |
|
426 Jul 4 10:22:45 ethercat kernel: EtherCAT: Master driver `\masterversion` |
|
427 Jul 4 10:22:45 ethercat kernel: EtherCAT: 2 masters waiting |
|
428 for devices. |
|
429 \end{lstlisting} |
|
430 |
|
431 All EtherCAT master output is prefixed with \lstinline+EtherCAT+ which makes |
|
432 searching the logs easier. |
|
433 |
|
434 %------------------------------------------------------------------------------ |
|
435 |
|
436 \section{Master Phases} |
369 \index{Master phases} |
437 \index{Master phases} |
370 |
438 |
371 The EtherCAT master runs through several phases (see fig.~\ref{fig:phases}): |
439 Every EtherCAT master provided by the master module (see |
|
440 sec.~\ref{sec:mastermod}) runs through several phases (see |
|
441 fig.~\ref{fig:phases}): |
372 |
442 |
373 \begin{figure}[htbp] |
443 \begin{figure}[htbp] |
374 \centering |
444 \centering |
375 \includegraphics[width=.9\textwidth]{images/phases} |
445 \includegraphics[width=.9\textwidth]{images/phases} |
376 \caption{Master phases and transitions} |
446 \caption{Master phases and transitions} |
393 |
463 |
394 \item[Operation phase]\index{Operation phase} The master is requested by an |
464 \item[Operation phase]\index{Operation phase} The master is requested by an |
395 application that can provide a bus configuration and exchange process data. |
465 application that can provide a bus configuration and exchange process data. |
396 |
466 |
397 \end{description} |
467 \end{description} |
398 |
|
399 %------------------------------------------------------------------------------ |
|
400 |
|
401 \section{General Behavior} |
|
402 \index{Master behavior} |
|
403 |
|
404 \ldots |
|
405 |
|
406 % TODO Behavior (Scanning) |
|
407 |
|
408 %------------------------------------------------------------------------------ |
|
409 |
|
410 \section{Master Module} |
|
411 \label{sec:mastermod} |
|
412 \index{Master module} |
|
413 |
|
414 The EtherCAT master kernel module \textit{ec\_master} can contain multiple |
|
415 master instances. Each master waits for a certain Ethernet device identified |
|
416 by its MAC address\index{MAC address}. These addresses have to be specified on |
|
417 module loading via the \textit{main\_devices} module parameter. The number of |
|
418 master instances to initialize is taken from the number of MAC addresses |
|
419 given. |
|
420 |
|
421 The below command loads the master module with a single master instance that |
|
422 waits for the Ethernet device with the MAC address |
|
423 \lstinline+00:0E:0C:DA:A2:20+. The master will be accessible via index $0$. |
|
424 |
|
425 \begin{lstlisting} |
|
426 # `\textbf{modprobe ec\_master main\_devices=00:0E:0C:DA:A2:20}` |
|
427 \end{lstlisting} |
|
428 |
|
429 MAC addresses for multiple masters have to be separated by commas: |
|
430 |
|
431 \begin{lstlisting} |
|
432 # `\textbf{modprobe ec\_master main\_devices=00:0E:0C:DA:A2:20,00:e0:81:71:d5:1c}` |
|
433 \end{lstlisting} |
|
434 |
|
435 The two masters can be addressed by their indices 0 and 1 respectively (see |
|
436 figure~\ref{fig:masters}). The master index is needed for the |
|
437 \lstinline+ecrt_master_request()+ function of the application interface (see |
|
438 chap.~\ref{chap:api}) and the \lstinline+--master+ option of the |
|
439 \textit{ethercat} command-line tool (see sec.~\ref{sec:tool}), which defaults |
|
440 to $0$. |
|
441 |
|
442 \begin{figure}[htbp] |
|
443 \centering |
|
444 \includegraphics[width=.5\textwidth]{images/masters} |
|
445 \caption{Multiple masters in one module} |
|
446 \label{fig:masters} |
|
447 \end{figure} |
|
448 |
|
449 \paragraph{Init Script} |
|
450 \index{Init script} |
|
451 |
|
452 In most cases it is not necessary to load the master module and the Ethernet |
|
453 driver modules manually. There is an init script available, so the master can |
|
454 be started as a service (see sec.~\ref{sec:system}). |
|
455 |
|
456 \paragraph{Syslog} |
|
457 |
|
458 The master module outputs information about its state and events to the kernel |
|
459 ring buffer. These also end up in the system logs. The above module loading |
|
460 command should result in the messages below: |
|
461 |
|
462 \begin{lstlisting} |
|
463 # `\textbf{dmesg | tail -2}` |
|
464 EtherCAT: Master driver `\masterversion` |
|
465 EtherCAT: 2 masters waiting for devices. |
|
466 |
|
467 # `\textbf{tail -2 /var/log/messages}` |
|
468 Jul 4 10:22:45 ethercat kernel: EtherCAT: Master driver `\masterversion` |
|
469 Jul 4 10:22:45 ethercat kernel: EtherCAT: 2 masters waiting |
|
470 for devices. |
|
471 \end{lstlisting} |
|
472 |
|
473 All EtherCAT master output is prefixed with \lstinline+EtherCAT+ which makes |
|
474 searching the logs easier. |
|
475 |
468 |
476 %------------------------------------------------------------------------------ |
469 %------------------------------------------------------------------------------ |
477 |
470 |
478 \section{Process Data} |
471 \section{Process Data} |
479 \label{sec:processdata} |
472 \label{sec:processdata} |
629 application. The state of a slave configuration can either be queried via the |
622 application. The state of a slave configuration can either be queried via the |
630 application interface or via the command-line tool (see |
623 application interface or via the command-line tool (see |
631 sec.~\ref{sec:ethercat-config}). |
624 sec.~\ref{sec:ethercat-config}). |
632 |
625 |
633 \paragraph{Slave Position} The slave position has to be specified as a tuple |
626 \paragraph{Slave Position} The slave position has to be specified as a tuple |
634 of ``alias`` and ``position''. This allows addressing slaves either via an |
627 of ``alias'' and ``position''. This allows addressing slaves either via an |
635 absolute bus position, or a stored identifier called ``alias'', or a mixture |
628 absolute bus position, or a stored identifier called ``alias'', or a mixture |
636 of both. The alias is a 16-bit value stored in the slave's E$^2$PROM. It can |
629 of both. The alias is a 16-bit value stored in the slave's E$^2$PROM. It can |
637 be modified via the command-line tool (see sec.~\ref{sec:ethercat-alias}). |
630 be modified via the command-line tool (see sec.~\ref{sec:ethercat-alias}). |
638 Table~\ref{tab:slaveposition} shows, how the values are interpreted. |
631 Table~\ref{tab:slaveposition} shows, how the values are interpreted. |
639 |
632 |
859 \item[\usebox\boxopen] This function is called when network communication has |
852 \item[\usebox\boxopen] This function is called when network communication has |
860 to be started, for example after a command \lstinline+ip link set ethX up+ |
853 to be started, for example after a command \lstinline+ip link set ethX up+ |
861 from userspace. Frame reception has to be enabled by the driver. |
854 from userspace. Frame reception has to be enabled by the driver. |
862 |
855 |
863 \item[\usebox\boxstop] The purpose of this callback is to ``close'' the |
856 \item[\usebox\boxstop] The purpose of this callback is to ``close'' the |
864 device, i.~e. make the hardware stop receiving frames. |
857 device, i.\,e.\ make the hardware stop receiving frames. |
865 |
858 |
866 \item[\usebox\boxxmit] This function is called for each frame that has to be |
859 \item[\usebox\boxxmit] This function is called for each frame that has to be |
867 transmitted. The network stack passes the frame as a pointer to an |
860 transmitted. The network stack passes the frame as a pointer to an |
868 \lstinline+sk_buff+ structure (``socket buffer''\index{Socket buffer}, see |
861 \lstinline+sk_buff+ structure (``socket buffer''\index{Socket buffer}, see |
869 below), which has to be freed after sending. |
862 below), which has to be freed after sending. |
1445 |
1438 |
1446 The below sections describe every state machine used in the EtherCAT master. |
1439 The below sections describe every state machine used in the EtherCAT master. |
1447 The textual descriptions of the state machines contain references to the |
1440 The textual descriptions of the state machines contain references to the |
1448 transitions in the corresponding state transition diagrams, that are marked |
1441 transitions in the corresponding state transition diagrams, that are marked |
1449 with an arrow followed by the name of the successive state. Transitions caused |
1442 with an arrow followed by the name of the successive state. Transitions caused |
1450 by trivial error cases (i.~e. no response from slave) are not described |
1443 by trivial error cases (i.\,e.\ no response from slave) are not described |
1451 explicitly. These transitions are drawn as dashed arrows in the diagrams. |
1444 explicitly. These transitions are drawn as dashed arrows in the diagrams. |
1452 |
1445 |
1453 %------------------------------------------------------------------------------ |
1446 %------------------------------------------------------------------------------ |
1454 |
1447 |
1455 \section{The Master State Machine} |
1448 \section{The Master State Machine} |
1570 |
1563 |
1571 \item[Pdo Sync Manager Configuration] If any Pdo sync managers exist, they are |
1564 \item[Pdo Sync Manager Configuration] If any Pdo sync managers exist, they are |
1572 configured. |
1565 configured. |
1573 |
1566 |
1574 \item[FMMU Configuration] If there are FMMUs configurations supplied by the |
1567 \item[FMMU Configuration] If there are FMMUs configurations supplied by the |
1575 application (i.~e. if the application registered Pdo entries), they are |
1568 application (i.\,e.\ if the application registered Pdo entries), they are |
1576 applied. |
1569 applied. |
1577 |
1570 |
1578 \item[SAFEOP] The state change FSM is used to bring the slave to SAFEOP state. |
1571 \item[SAFEOP] The state change FSM is used to bring the slave to SAFEOP state. |
1579 If this is the requested state, the state machine is finished. |
1572 If this is the requested state, the state machine is finished. |
1580 |
1573 |
1602 \end{figure} |
1595 \end{figure} |
1603 |
1596 |
1604 \begin{description} |
1597 \begin{description} |
1605 |
1598 |
1606 \item[Start] The new application-layer state is requested via the ``AL Control |
1599 \item[Start] The new application-layer state is requested via the ``AL Control |
1607 Request'' register (see ~\cite[sec. 5.3.1]{alspec}). |
1600 Request'' register (see~\cite[sec. 5.3.1]{alspec}). |
1608 |
1601 |
1609 \item[Check for Response] Some slave need some time to respond to an AL state |
1602 \item[Check for Response] Some slave need some time to respond to an AL state |
1610 change command, and do not respond for some time. For this case, the command |
1603 change command, and do not respond for some time. For this case, the command |
1611 is issued again, until it is acknowledged. |
1604 is issued again, until it is acknowledged. |
1612 |
1605 |
1753 |
1746 |
1754 \section{Ethernet-over-EtherCAT (EoE)} |
1747 \section{Ethernet-over-EtherCAT (EoE)} |
1755 \label{sec:eoe} |
1748 \label{sec:eoe} |
1756 \index{EoE} |
1749 \index{EoE} |
1757 |
1750 |
1758 The EtherCAT master implements the Ethernet-over-EtherCAT mailbox protocol to |
1751 The EtherCAT master implements the |
1759 enable the tunneling of Ethernet frames to special slaves, that can either |
1752 Ethernet-over-EtherCAT\nomenclature{EoE}{Ethernet-over-EtherCAT, Mailbox |
1760 have physical Ethernet ports to forward the frames to, or have an own IP stack |
1753 Protocol} mailbox protocol~\cite[sec.~5.7]{alspec} to enable the tunneling of |
1761 to receive the frames. |
1754 Ethernet frames to special slaves, that can either have physical Ethernet |
|
1755 ports to forward the frames to, or have an own IP stack to receive the frames. |
1762 |
1756 |
1763 \paragraph{Virtual Network Interfaces} |
1757 \paragraph{Virtual Network Interfaces} |
1764 |
1758 |
1765 The master creates a virtual EoE network interface for every EoE-capable |
1759 The master creates a virtual EoE network interface for every EoE-capable |
1766 slave. These interfaces are called either |
1760 slave. These interfaces are called either |
2356 copied (or better: linked) to the appropriate location (see |
2351 copied (or better: linked) to the appropriate location (see |
2357 sec.~\ref{sec:installation}), before the master can be inserted as a service. |
2352 sec.~\ref{sec:installation}), before the master can be inserted as a service. |
2358 Please note, that the init script depends on the sysconfig file described |
2353 Please note, that the init script depends on the sysconfig file described |
2359 below. |
2354 below. |
2360 |
2355 |
2361 To provide service dependencies (i.~e. which services have to be started before |
2356 To provide service dependencies (i.\,e.\ which services have to be started |
2362 others) inside the init script code, LSB defines a special comment block. |
2357 before others) inside the init script code, LSB defines a special comment |
2363 System tools can extract this information to insert the EtherCAT init script at |
2358 block. System tools can extract this information to insert the EtherCAT init |
2364 the correct place in the startup sequence: |
2359 script at the correct place in the startup sequence: |
2365 |
2360 |
2366 \lstinputlisting[firstline=38,lastline=48] |
2361 \lstinputlisting[firstline=38,lastline=48] |
2367 {../script/init.d/ethercat} |
2362 {../script/init.d/ethercat} |
2368 |
2363 |
2369 \subsection{Sysconfig File} |
2364 \subsection{Sysconfig File} |
2407 |
2402 |
2408 \section{Monitoring and Debugging} |
2403 \section{Monitoring and Debugging} |
2409 \label{sec:debug} |
2404 \label{sec:debug} |
2410 \index{Monitoring} |
2405 \index{Monitoring} |
2411 |
2406 |
2412 % FIXME |
2407 EtherCAT buses can always be monitored by inserting a switch between master |
2413 |
2408 and slaves. This allows to connect another PC with a network monitor like |
2414 For debugging purposes, every EtherCAT master registers a read-only network |
2409 Wireshark~\cite{wireshark}, for example. |
2415 interface \textit{ecX}, where X is a number, provided by the kernel on device |
2410 |
2416 registration. While it is ``up'', the master forwards every frame sent and |
2411 For convenience, so-called ``debug interfaces'' are supported. Debug interfaces |
2417 received to this interface. |
2412 allow to monitor EtherCAT traffic with a network monitor (like Wireshark or |
2418 |
2413 tcpdump) running on the same machine. To use this functionality, the master |
2419 This makes it possible to connect an network monitor (like Wireshark or |
2414 sources have to be configured with the \lstinline+--enable-debug-if+ switch |
2420 tcpdump) to the debug interface and monitor the EtherCAT frames. |
2415 (see sec.~\ref{sec:installation}). |
2421 |
2416 |
2422 % FIXME schedule() |
2417 Every EtherCAT master registers two read-only network interfaces. These are |
2423 It has to be considered, that can be frame rate can be very high. The master |
2418 named \textit{ecdbgmX} (main device) and \textit{ecdbgbX} (backup device for |
2424 state machine usually runs every kernel timer interrupt (usually up to |
2419 future use), where X is the master index. The debug interfaces are listed in |
2425 \unit{1}{\kilo\hertz}) and with a connected application, the rate can be even |
2420 the below output: |
2426 higher. |
2421 |
2427 |
2422 \begin{lstlisting} |
2428 \paragraph{Attention:} The socket buffers needed for the operation of |
2423 # `\textbf{ip link}` |
2429 the debugging interface have to be allocated dynamically. Some Linux |
2424 1: lo: <LOOPBACK,UP> mtu 16436 qdisc noqueue |
2430 realtime extensions do not allow this in realtime context! |
2425 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 |
|
2426 4: eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop qlen 1000 |
|
2427 link/ether 00:04:61:03:d1:01 brd ff:ff:ff:ff:ff:ff |
|
2428 8: ecdbgm0: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast |
|
2429 qlen 1000 |
|
2430 link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff |
|
2431 9: ecdbgb0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop qlen 1000 |
|
2432 link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff |
|
2433 \end{lstlisting} |
|
2434 |
|
2435 While a debug interface is enabled, the corresponding master forwards all |
|
2436 frames sent and received to or from the bus to that interface. Interfaces can |
|
2437 be enabled for example with the command: |
|
2438 |
|
2439 \begin{lstlisting} |
|
2440 # `\textbf{ip link set dev ecdbgm0 up}` |
|
2441 \end{lstlisting} |
|
2442 |
|
2443 Please note, that the frame rate can be very high. With an application |
|
2444 connected, the debug interface can produce thousands of frames per second. |
|
2445 |
|
2446 \paragraph{Attention} The socket buffers needed for the operation of the |
|
2447 debugging interface have to be allocated dynamically. Some Linux realtime |
|
2448 extensions do not allow this in realtime context! |
2431 |
2449 |
2432 %------------------------------------------------------------------------------ |
2450 %------------------------------------------------------------------------------ |
2433 |
2451 |
2434 \chapter{Timing Aspects} |
2452 \chapter{Timing Aspects} |
2435 \label{sec:timing} |
2453 \label{sec:timing} |
2787 \end{lstlisting} |
2805 \end{lstlisting} |
2788 |
2806 |
2789 Now, the \lstinline+ethercat+ tool can be used (see sec.~\ref{sec:tool}) even |
2807 Now, the \lstinline+ethercat+ tool can be used (see sec.~\ref{sec:tool}) even |
2790 as a non-root user. |
2808 as a non-root user. |
2791 |
2809 |
|
2810 If non-root users shall have writing access, the following udev rule can be |
|
2811 used instead: |
|
2812 |
|
2813 \begin{lstlisting} |
|
2814 KERNEL=="EtherCAT[0-9]*", MODE="0664", GROUP="users" |
|
2815 \end{lstlisting} |
|
2816 |
2792 %------------------------------------------------------------------------------ |
2817 %------------------------------------------------------------------------------ |
2793 |
2818 |
2794 \begin{thebibliography}{99} |
2819 \begin{thebibliography}{99} |
2795 |
2820 |
2796 \bibitem{etherlab} Ingenieurgemeinschaft IgH: EtherLab -- Open Source Toolkit |
2821 \bibitem{etherlab} Ingenieurgemeinschaft IgH: EtherLab -- Open Source Toolkit |
2809 \bibitem{lgpl} GNU Lesser General Public License, Version 2.1. |
2834 \bibitem{lgpl} GNU Lesser General Public License, Version 2.1. |
2810 \url{http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html}. October~15, |
2835 \url{http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html}. October~15, |
2811 2008. |
2836 2008. |
2812 |
2837 |
2813 \bibitem{lsb} Linux Standard Base. |
2838 \bibitem{lsb} Linux Standard Base. |
2814 \url{http://www.linuxfoundation.org/en/LSB}. August~9, 2006. |
2839 \url{http://www.linuxfoundation.org/en/LSB}. August~9, 2006. |
2815 |
2840 |
2816 \bibitem{wireshark} Wireshark. \url{http://www.wireshark.org}. 2008. |
2841 \bibitem{wireshark} Wireshark. \url{http://www.wireshark.org}. 2008. |
2817 |
2842 |
2818 \bibitem{automata} {\it Hopcroft, J.~E. / Ullman, J.~D.}: Introduction to |
2843 \bibitem{automata} {\it Hopcroft, J.\,E.\ / Ullman, J.\,D.}: Introduction to |
2819 Automata Theory, Languages and Computation. Adison-Wesley, Reading, |
2844 Automata Theory, Languages and Computation. Adison-Wesley, Reading, |
2820 Mass.~1979. |
2845 Mass.~1979. |
2821 |
2846 |
2822 \bibitem{fsmmis} {\it Wagner, F. / Wolstenholme, P.}: State machine |
2847 \bibitem{fsmmis} {\it Wagner, F.\ / Wolstenholme, P.}: State machine |
2823 misunderstandings. In: IEE journal ``Computing and Control Engineering'', |
2848 misunderstandings. In: IEE journal ``Computing and Control Engineering'', |
2824 2004. |
2849 2004. |
2825 |
2850 |
2826 \bibitem{rtai} RTAI. The RealTime Application Interface for Linux from DIAPM. |
2851 \bibitem{rtai} RTAI. The RealTime Application Interface for Linux from DIAPM. |
2827 \url{http://www.rtai.org}, 2006. |
2852 \url{http://www.rtai.org}, 2006. |