Managing the lifecycle of components
Previous: Building and Running Unit Tests
Using the BSW module lifecycle, it is easy to divide an application’s functionality into components
to be brought up / down in a specific order at different “run levels”.
See lifecycle - App Lifecycle Management for a generic description of lifecycle,
whereas its specific usage in this project is discussed below.
Firstly, note that this project uses FreeRTOS ported to each supported platform.
The BSW module async defines a generic interface for executing code in “contexts”
and the BSW module asyncFreeRtos implements the async interface for FreeRTOS,
mapping each async “context” to a FreeRTOS “task”.
The BSW module lifecycle defines the abstract class LifecycleComponent to represent each functional area.
Each instance of LifecycleComponent can be added to a single instance of LifecycleManager at a “run level”
to control when it is brought up / down in the application’s lifecycle.
AsyncLifecycleComponent and SingleContextLifecycleComponent are implementations of LifecycleComponent
which allows the user to specify the async context in which to run.
Thus we can centrally organise both the order in which to bring up / down components and the contexts in which they run.
The convention followed in most projects using BSW is to define classes named “XyzSystem” for each functional area.
Each of these “System” classes implement LifecycleComponent and can thus be added to an instance of LifecycleManager.
Below are examples of such “Systems”…
Class Name |
Platforms |
LifecycleComponent type |
Code location |
|---|---|---|---|
BspSystem |
S32K148 |
SingleContextLifecycleComponent |
platforms/s32k1xx/main/include/systems/BspSystem.h platforms/s32k1xx/main/src/systems/BspSystem.cpp |
RuntimeSystem |
All |
AsyncLifecycleComponent |
executables/referenceApp/application/include/systems/RuntimeSystem.h executables/referenceApp/application/src/systems/RuntimeSystem.cpp |
CanSystem |
POSIX |
AsyncLifecycleComponent |
executables/referenceApp/platforms/posix/main/include/systems/CanSystem.h executables/referenceApp/platforms/posix/main/src/systems/CanSystem.cpp |
CanSystem |
S32K148 |
SingleContextLifecycleComponent |
executables/referenceApp/platforms/s32k1xx/main/include/systems/CanSystem.h executables/referenceApp/platforms/s32k1xx/main/src/systems/CanSystem.cpp |
TransportSystem |
All |
AsyncLifecycleComponent |
executables/referenceApp/application/include/systems/TransportSystem.h executables/referenceApp/application/src/systems/TransportSystem.cpp |
DoCanSystem |
All |
AsyncLifecycleComponent |
executables/referenceApp/application/include/systems/DoCanSystem.h executables/referenceApp/application/src/systems/DoCanSystem.cpp |
UdsSystem |
All |
AsyncLifecycleComponent |
executables/referenceApp/application/include/systems/UdsSystem.h executables/referenceApp/application/src/systems/UdsSystem.cpp |
SysAdminSystem |
All |
AsyncLifecycleComponent |
executables/referenceApp/application/include/systems/SysAdminSystem.h executables/referenceApp/application/src/systems/SysAdminSystem.cpp |
DemoSystem |
All |
AsyncLifecycleComponent |
executables/referenceApp/application/include/systems/DemoSystem.h executables/referenceApp/application/src/systems/DemoSystem.cpp |
The function ::app::run() found in the file executables/referenceApp/application/src/app/app.cpp
adds components to the lifecycleManager at each run level.
Note that by using the function platformLifecycleAdd()
(which has a different implementation on each platform)
each supported platform can flexibly include or exclude “Systems”.
For example, the lifecycle on the POSIX platform is set up as follows…
Run Level |
Component |
Contexts |
where it is added to lifecycleManager |
|---|---|---|---|
1 |
RuntimeSystem |
TASK_BACKGROUND |
executables/referenceApp/application/src/app/app.cpp |
2 |
CanSystem |
TASK_CAN |
executables/referenceApp/platforms/posix/main/src/main.cpp |
3 |
None |
||
4 |
TransportSystem |
TASK_UDS |
executables/referenceApp/application/src/app/app.cpp |
5 |
DoCanSystem |
TASK_CAN |
executables/referenceApp/application/src/app/app.cpp |
6 |
UdsSystem |
TASK_UDS |
executables/referenceApp/application/src/app/app.cpp |
7 |
SysAdminSystem |
TASK_SYSADMIN |
executables/referenceApp/application/src/app/app.cpp |
8 |
DemoSystem |
TASK_DEMO |
executables/referenceApp/application/src/app/app.cpp |
Explore the console lifecycle command lc to set different levels interactively.
Take time to study these classes and in particular the dependencies between them
for a better appreciation of how applications are organised.
Next: Logging to the console