Lightweight, programmable procedures with a libcsp- and libparam-native runtime.
csp_proc
The easiest way to integrate csp_proc
is with meson. As of writing, no other build systems are supported out-of-the-box, so you’ll have to get creative if using meson is not an option. See below for an overview of the constituent parts of csp_proc
.
The following demonstrates the outline of a meson.build
file in a parent project where libcsp
, libparam
, and csp_proc
are present in the lib
subdirectory:
project(..., subproject_dir: 'lib', default_options: [
'csp_proc:slash=false',
'csp_proc:freertos=false',
'csp_proc:posix=true',
'csp_proc:proc_runtime=true',
'csp_proc:RESERVED_PROC_SLOTS=...',
...
])
deps = []
deps += dependency('csp', fallback: ['libcsp', 'csp_dep'])
deps += dependency('param', fallback: ['libparam', 'param_dep'])
deps += dependency('csp_proc', fallback: ['csp_proc', 'csp_proc_dep']).as_link_whole()
app = executable(...
dependencies : deps,
...
)
Note that csp_proc
is not a standalone library. The core part of the library depends on libparam
and libcsp
, while optional parts depend on slash
and the FreeRTOS kernel or POSIX functionality. A reference setup can be found in the following Dockerfile, which is the environment that’s used to run the automated tests in the CI pipeline.
The library has the following components:
The core part of the library consists of the following files:
proc_analyze.(h|c)
: Functions for analyzing procedures (Will automatically be included if runtime is enabled)proc_client.(h|c)
: Client-side functions, e.g. request to push procedure over CSP network.proc_memory.h
: Platform-agnostic memory management functions interface (malloc, free, etc.).
platform/proc_memory_FreeRTOS.c
: FreeRTOS-specific memory management.platform/proc_memory_POSIX.c
: POSIX-specific memory management.proc_mutex.h
: Mutex for controlling access to relevant data structures.
platform/proc_mutex_FreeRTOS.c
: FreeRTOS-specific mutex implementation.platform/proc_mutex_POSIX.c
: POSIX-specific mutex implementation.proc_pack.(h|c)
: Functions for packing and unpacking procedures into CSP packets.proc_runtime.h
: Runtime interface as expected by the core library.proc_server.(h|c)
: Server-side functions, e.g. handling incoming procedure requests (Will automatically be included if procedure storage is enabled)proc_store.h
: Functions for storing and retrieving procedures in a local procedure table.proc_types.h
: Procedure data type, including the procedure structure and the instruction structure.proc_store_dynamic.h
: Procedure storage using dynamic memory allocation.proc_store_static.h
: Procedure storage using static memory allocation.runtime/proc_runtime_FreeRTOS.c
: FreeRTOS-based runtime for csp_proc
.runtime/proc_runtime_instructions_FreeRTOS.c
: FreeRTOS-specific instruction handlers.runtime/proc_runtime_POSIX.c
: POSIX-based runtime for csp_proc
.runtime/proc_runtime_instructions_POSIX.c
: POSIX-specific instruction handlers.runtime/proc_runtime_instructions.c
: Default platform-agnostic instruction handlers.slash/slash_csp_proc.c
: A series of slash commands for interacting with csp_proc
.The following options can be configured at compile-time:
RESERVED_PROC_SLOTS
: This option defines the number of reserved procedure slots.MAX_PROC_BLOCK_TIMEOUT_MS
: This option sets the maximum time (in milliseconds) that block instructions will wait before timing out.MIN_PROC_BLOCK_PERIOD_MS
: This option sets the minimum time (in milliseconds) between evaluations of a block instruction’s condition.MAX_PROC_RECURSION_DEPTH
: This option sets the maximum recursion depth of a procedure.MAX_PROC_CONCURRENT
: This option sets the maximum number of procedure runtimes that can run concurrently.MAX_INSTRUCTIONS
: This option sets the maximum number of instructions in a procedure.MAX_PROC_SLOT
: This option sets the maximum procedure slot number (i.e. number of procedures - 1).In addition to the above, the default runtime implementations have their own set of configuration options:
PARAM_REMOTE_TIMEOUT_MS
: This option sets the timeout (in milliseconds) for a remote call via libparam.PARAM_ACK_ON_PUSH
: This option toggles whether to expect an acknowledgment from the remote node when pushing a parameter.PROC_FLOAT_EPSILON
: This option sets the epsilon value for floating-point comparisons.And the FreeRTOS-based runtime has the following additional options:
PROC_RUNTIME_TASK_SIZE
: This option sets the stack size of a runtime task.PROC_RUNTIME_TASK_PRIORITY
: This option sets the FreeRTOS task priority of a runtime task.TASK_STORAGE_RECURSION_DEPTH_INDEX
: This option sets the index of the thread-local storage pointer for recursion depth tracking.Please note that the FreeRTOS-based runtime requires a FreeRTOSConfig.h
file in the parent project. This configuration file should define configNUM_THREAD_LOCAL_STORAGE_POINTER
to a value greater than 0, as the tracking of recursion depth is done using thread-local storage.
Lastly, the library has the following meson build options:
slash
(boolean, default: false
): Build slash.freertos
(boolean, default: false
): Build for FreeRTOS system.posix
(boolean, default: true
): Build for POSIX system.proc_runtime
(boolean, default: false
): Build the runtime module.proc_analysis
(boolean, default: false
): Build the analysis module.proc_store_static
(boolean, default: false
): Build the proc store with static memory allocation.proc_store_dynamic
(boolean, default: true
): Build the proc store with dynamic memory allocation.