The firmware is split into two parts – one running on each PRU. Each PRU handles one direction of the packet flow in addition to specific tasks that are dedicate on each PRU. PRU0, for example, also implements host interface, sync managers and FMMUs. The second PRU manages distributed clocking and error handling functions. The firmware is developed and it is tested in multiple stages at TI, at EtherCAT labs as well as in EtherCAT plug-fests. It is included as a part of the industrial SDK.