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