Real-Time meets High-Delay: A hybrid scheduling and dataflow framework for DSP applications, developed at ELTE University, Budapest.
High performance:
Easy to use:
Versatile:
Measurable (coming soon):
The scheduler manages a pool of worker threads to complete work in user-defined nodes on user-defined processing functions. Initially, when the scheduler is instantiated, it enters the setup phase. In this phase, channels should be created that represent the data processing stages in the pipeline using packet processing functions defined in the user's nodes. There can be two types of channels, scheduled or polled. The former channel type's packets are automatically scheduled to be processed by the worker pool, and the latter type's packets can be received manually be the user's own threads. This can be useful when the use case requires a dedicated thread for certain actions, such as when you need to process data using non-thread-safe librares, or when you need to make an exit point from the DSP pipeline to transmit some results out. When all channels are created, the scheduler can be started, at which point packets can start entering the pipeline.
The processing functions defined in the user's nodes accept a packet to be processed as a parameter. After they are done processing a packet, packets can be sent onto the next channel (one that the user node has knowledge of) in the pipeline by acquiring a packet to be filled from that channel and filling it with the processed data. The filled packet is automatically queued for processing in the next channel upon the destruction of the stub belonging to the filled packet. The space in memory belonging to the processed packet is freed up for reuse automatically upon the destruction of the stub belonging to the packet.
At any point after the scheduler was started, it may be stopped, which means it will instruct all worker threads to finish their processing, wait for them to complete their current tasks, and re-enter the setup/preparation phase.
For a more detailed description on how each component in the system works, please check out our documentation.
You need the following packages installed on your system to build the library:
git for downloading this repocmake and ninja-build to make and use the build systemgcc, g++ for compiling with GCC ORclang, clang++ and llvm for compiling with Clangdoxygen to generate HTML documentationSteps to build:
git clone https://github.com/gerazo/pipert.git./build.sh to build the static and dynamic library in release modeinclude folderbuild/libpipert.so ORbuild/libpipert_static.aYou can find the documentation under build/docs/index.html.
Besides everything under Normal Build, you may also want the following packages:
clang-format to keep our code formatting conventionsgcovr to generate text and HTML coverage reportsSteps for development build:
./devbuild.sh or choose a generator for your IDE by using ./devbuild.sh -G "<yourIDE> - Ninja" (see cmake -h)build_debug and the release build under build_release foldersninja and ninja test targets from the command linebuild_debug/coverage/coverage.html and can be regenerated by issuing ninja coverage at the command linebuild_release/docs/index.html, but generation can be forced by issuing ninja docs at the command lineTo only build in debug or release mode, you should specify both the build directory and the build mode by running ./devbuild.sh -dir <build_debug|build_release> -mode <Debug|Release>.
Soon, we will have some tests that also show simple examples of usage.
The project is currently developed on *nix machines. Development on Windows or OS X systems is not supported as of yet, but execution on Windows machines is currently being looked into.
Have fun!