eeros_architecture:control_system:executor
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revisionLast revisionBoth sides next revision | ||
eeros_architecture:control_system:executor [2016/10/19 14:06] – graf | eeros_architecture:control_system:executor [2021/02/10 15:28] – [Initialize the Executor] ursgraf | ||
---|---|---|---|
Line 1: | Line 1: | ||
====== Executor ====== | ====== Executor ====== | ||
- | The executor is responsible to run various different time domains in separated threads of execution. The execution periods of different time domains are generally in a harmonic relationship | + | The executor is responsible to run various different time domains in separated threads of execution. The execution periods of different time domains are generally in a harmonic relationship |
+ | |||
+ | ===== Harmonic Tasks ===== | ||
+ | As the following figure shows each harmonic is run by its own thread of execution. | ||
+ | {{ : | ||
+ | In this example we have the safety system as the main task. It has the fastest execution period together with the time domain 1. The time domain 2 runs with the same period but only after time domain 1 has finished. Time domain 3 has a harmonic relationship to the main task with a ratio of 2. | ||
+ | |||
+ | ===== Using the Executor | ||
+ | First you have to define the executor. | ||
+ | <code cpp> | ||
+ | eeros:: | ||
+ | </ | ||
+ | |||
+ | Next we have to define the main task. In general the main task will be the safety system. To make matters simple we omit the definition of the safety system. Please check for this in [[getting_started: | ||
+ | <code cpp> | ||
+ | SafetySystem ss(properties, | ||
+ | executor.setMainTask(ss); | ||
+ | </ | ||
+ | |||
+ | Now we create time domains and add it to the executor. | ||
+ | <code cpp> | ||
+ | eeros:: | ||
+ | executor.add(td1); | ||
+ | </ | ||
+ | |||
+ | This creates a time domain which should run in real-time with a period of 1 millisecond. Obviously the time domain has no blocks yet and therefore doesn' | ||
+ | |||
+ | You could also create a periodic task as a separate object and assign it a time domain as follows. | ||
+ | <code cpp> | ||
+ | eeros:: | ||
+ | eeros:: | ||
+ | executor.add(per1); | ||
+ | </ | ||
+ | |||
+ | Finally you have to start the executor with: | ||
+ | <code cpp> | ||
+ | executor.run(); | ||
+ | </ | ||
+ | |||
+ | This call does not complete until you stop the main task with a special signal. | ||
+ | |||
+ | IMPORTANT Please make sure to run an application using the executor with root privileges. This is necessary for the executor to be able to create threads with realtime priorities. | ||
+ | |||
+ | ===== Add More Time Domains ====== | ||
+ | The picture at the top of this page shows another two time domains. Time domain 2 runs after time domain 1. It can be created and added to time domain 1 as follows | ||
+ | <code cpp> | ||
+ | eeros:: | ||
+ | eeros:: | ||
+ | eeros:: | ||
+ | eeros:: | ||
+ | per1.after.push_back(per2); | ||
+ | executor.add(per1); | ||
+ | </ | ||
+ | Time domain 3 runs concurrently to time domain 1. It can therefore be created simply with | ||
+ | <code cpp> | ||
+ | eeros:: | ||
+ | executor.add(td3); | ||
+ | </ |
eeros_architecture/control_system/executor.txt · Last modified: 2021/02/10 15:28 by ursgraf