csp_proc
Lightweight, programmable procedures with a libcsp- and libparam-native runtime. This provides remote control of libparam-based coordination between nodes in a CSP network, essentially exposing the network as single programmable unit.
The library has a relatively small footprint suitable for microcontrollers, requiring no external libraries other than libcsp and libparam themselves for the core of the library. As of writing, the library provides 2 default runtime implementations which depend on FreeRTOS and POSIX respectively. See also usage examples for a demonstration of the commands available in the DSL.
DSL Overview
csp_proc provides a set of slash commands that allow users to create, manage, and execute procedures on a given CSP node. The procedures facilitate control-flow and arithmetic operations while remaining small - usually on the order of hundreds of bytes! The runtime is detached from the DSL, allowing customizations, and there is support for pre-programmed, complex procedures on the native platform in reserved procedure slots. The following is a list of commands available in the DSL:
Procedure Management Commands
proc new: Creates a new procedure and sets it as the active procedure context.proc del <procedure slot> [node]: Deletes the procedure in the specified slot (0-255) on the node. Note that some slots may be reserved for predefined procedures.proc pull <procedure slot> [node]: Switches the active procedure context to the procedure pulled from the specified slot (0-255) on the node.proc push <procedure slot> [node]: Pushes the active procedure to the specified slot on the node.proc size: Returns the size (in bytes) of the active procedure.proc pop [instruction index]: Removes the instruction at the specified index (defaults to the latest instruction) in the active procedure.proc list: Lists the instructions in the active procedure.proc slots [node]: Lists the occupied procedure slots on the node.proc run <procedure slot> [node]: Executes the procedure in the specified slot.
Control-Flow and Arithmetic Operations
The following commands allow the user to program control-flow and arithmetic operations within procedures. The result is always a libparam parameter stored on the node hosting the corresponding procedure server (node 0 from its perspective) and [node] is the node on which the operands are located - Except when using the rmt unop operation, where it’s switched!
proc block <param a> <op> <param b> [node]: Blocks execution of the procedure until the specified condition is met.<op>can be one of:==,!=,<,>,<=,>=.proc ifelse <param a> <op> <param b> [node]: Skips the next instruction if the condition is not met, and the following instruction if it is met. This command cannot be nested in the default runtime - i.e. it cannot be used again within the following 2 instructions.proc noop: Performs no operation. Useful in combination withifelseinstructions.proc set <param> <value> [node]: Sets the value of a parameter. The type of value is always inferred from the libparam type of the parameter.proc unop <param> <op> <result> [node]: Applies a unary operator to a parameter and stores the result.<op>can be one of:++,--,!,-,idt,rmt.idtandrmtare both identity operators.proc binop <param a> <op> <param b> <result> [node]: Applies a binary operator to parameters<param a>and<param b>and stores the result.<op>can be one of:+,-,*,/,%,<<,>>,&,|,^.proc call <procedure slot> [node]: Inserts an instruction to run the procedure in the specified slot.