eeros_architecture:control_system:executor
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
eeros_architecture:control_system:executor [2016/10/19 14:06] – graf | eeros_architecture:control_system:executor [2021/02/10 15:28] (current) – [Using 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. | ||
+ | <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.1476878782.txt.gz · Last modified: 2016/10/19 14:06 by graf