Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Static pool inventory

Every build-time sizing knob nano-ros reads, with the default it uses when you do not set it. Set them as environment variables at BUILD time.

This page exists because knowing a knob exists is the hard part. Issue 0271 audited a 256 KB image that already tuned nine of these and still carried ~145 KB of defaults it did not know to change — every knob it needed was already there. Four separate features had each added a static pool with a knob, silently.

Pools with a computed size

Bytes are at the DEFAULTS below, computed from the pool’s own declared arithmetic (// nros-pool: in the source). Change a knob and the figure moves with it.

poolbytes at defaultformuladeclared in
LARGE_PAYLOADS131,072 (builtin — an image that declares its entities derives its own)NROS_ZENOH_MAX_LARGE_SUBSCRIBERS * NROS_ZENOH_SUBSCRIBER_RING_DEPTH * NROS_ZENOH_SUBSCRIBER_LARGE_SIZEpackages/rmw/zenoh/nros-rmw-zenoh/src/shim/subscriber.rs:205
SLOTS8,192 (builtin — an image that declares its entities derives its own)NROS_RMW_SUBSCRIBER_SLOTS * NROS_RMW_SUBSCRIBER_SLOT_BYTESpackages/rmw/cffi/src/rust_adapter.rs:127
SMALL_PAYLOADS— (knob NROS_ZENOH_MAX_SUBSCRIBERS has a computed default)NROS_ZENOH_MAX_SUBSCRIBERS * NROS_ZENOH_SUBSCRIBER_RING_DEPTH * NROS_SUBSCRIBER_BUFFER_SIZEpackages/rmw/zenoh/nros-rmw-zenoh/src/shim/subscriber.rs:204
SOCKET_RX_BUFFERS— (knob NROS_SMOLTCP_MAX_SOCKETS has a computed default)NROS_SMOLTCP_MAX_SOCKETS * NROS_SMOLTCP_BUFFER_SIZEpackages/drivers/net/nros-smoltcp/src/bridge.rs:260
SOCKET_TX_BUFFERS— (knob NROS_SMOLTCP_MAX_SOCKETS has a computed default)NROS_SMOLTCP_MAX_SOCKETS * NROS_SMOLTCP_BUFFER_SIZEpackages/drivers/net/nros-smoltcp/src/bridge.rs:261
UDP_SOCKET_RX_BUFFERS— (knob NROS_SMOLTCP_MAX_UDP_SOCKETS has a computed default)NROS_SMOLTCP_MAX_UDP_SOCKETS * NROS_SMOLTCP_BUFFER_SIZEpackages/drivers/net/nros-smoltcp/src/bridge.rs:317
UDP_SOCKET_TX_BUFFERS— (knob NROS_SMOLTCP_MAX_UDP_SOCKETS has a computed default)NROS_SMOLTCP_MAX_UDP_SOCKETS * NROS_SMOLTCP_BUFFER_SIZEpackages/drivers/net/nros-smoltcp/src/bridge.rs:318

Pools sized by a knob, measured per image

These statics move with the knobs beside them, but their element is a struct (or the region is a heap), so no formula over defaults can state their size exactly — and a guessed multiplier is the defect this page exists to avoid. just mem-report <image> reports each one’s exact bytes in the image you built, beside the knobs listed here.

symbolkindsized by
g_sessionspoolNROS_ZENOH_GRAPH_CACHE_SIZE, NROS_ZENOH_MAX_LIVELINESS, NROS_ZENOH_MAX_PENDING_GETS, NROS_ZENOH_MAX_PUBLISHERS, NROS_ZENOH_MAX_QUERYABLES, NROS_ZENOH_MAX_SESSIONS, NROS_ZENOH_MAX_SUBSCRIBERS
nros_log::early::SLOTSpoolNROS_LOG_EARLY_RECORDS
nros_log::pool::NAMESpoolNROS_LOG_DYNAMIC_LOGGERS
nros_log::pool::POOLpoolNROS_LOG_DYNAMIC_LOGGERS
nros_log::rosout::SLOTSpoolNROS_LOG_ROSOUT_RECORDS
nros_node::boot_report::NROS_BOOT_REPORTpoolNROS_BOOT_REPORT
nros_node::parameter_services::PARAM_INBOXpoolNROS_PARAM_SERVICE_INBOX_BYTES, NROS_PARAM_SERVICE_INBOX_DEPTH
nros_platform::zephyr_heap::HEAPheapNROS_ZEPHYR_HEAP_SIZE
nros_rmw_cffi::MESSAGE_INFO_TABLEpoolNROS_RMW_MESSAGE_INFO_SLOTS
nros_rmw_cffi::NODE_TABLEpoolNROS_RMW_MAX_NODES
nros_rmw_cffi::REGISTRYpoolNROS_RMW_MAX_BACKENDS
nros_rmw_zenoh::shim::publisher::transient_local::TL_SLOTSpoolNROS_ZENOH_MAX_TL_PUBLISHERS, NROS_ZENOH_TL_RETAIN_BYTES, NROS_ZENOH_TL_RETAIN_DEPTH
nros_rmw_zenoh::shim::service::ACTION_INBOXpoolNROS_ACTION_INBOX_BYTES, NROS_ACTION_INBOX_DEPTH
nros_rmw_zenoh::shim::service::SERVICE_BUFFERSpoolNROS_ZENOH_MAX_QUERYABLES, NROS_ZENOH_MAX_SESSIONS, NROS_ZENOH_SERVICE_BUFFER_SIZE
nros_rmw_zenoh::shim::service::USER_SERVICE_INBOXpoolNROS_SERVICE_INBOX_BYTES, NROS_SERVICE_INBOX_DEPTH, NROS_ZENOH_MAX_QUERYABLES, NROS_ZENOH_MAX_SESSIONS
nros_rmw_zenoh::shim::subscriber::SMALL_PAYLOADSpoolNROS_SUBSCRIBER_BUFFER_SIZE
nros_rmw_zenoh::shim::subscriber::SUBSCRIBER_BUFFERSpoolNROS_ZENOH_MAX_SUBSCRIBERS
nros_smoltcp::bridge::SOCKET_RX_BUFFERSpoolNROS_SMOLTCP_BUFFER_SIZE, NROS_SMOLTCP_MAX_SOCKETS
nros_smoltcp::bridge::SOCKET_TABLEpoolNROS_SMOLTCP_MAX_SOCKETS
nros_smoltcp::bridge::SOCKET_TX_BUFFERSpoolNROS_SMOLTCP_BUFFER_SIZE, NROS_SMOLTCP_MAX_SOCKETS
nros_smoltcp::bridge::UDP_SOCKET_RX_BUFFERSpoolNROS_SMOLTCP_BUFFER_SIZE, NROS_SMOLTCP_MAX_UDP_SOCKETS
nros_smoltcp::bridge::UDP_SOCKET_TABLEpoolNROS_SMOLTCP_MAX_UDP_SOCKETS
nros_smoltcp::bridge::UDP_SOCKET_TX_BUFFERSpoolNROS_SMOLTCP_BUFFER_SIZE, NROS_SMOLTCP_MAX_UDP_SOCKETS
ucHeapheapNROS_FREERTOS_HEAP_KB

Every sizing knob

Every knob says what it costs: a byte figure where a formula prices it, otherwise WHERE its bytes go and why no static figure exists. Nothing in this column is blank, and nothing here is free unless it says so.

knobdefaultread bycost
NROS_ACTION_INBOX_BYTEScomputed — see packages/rmw/zenoh/nros-rmw-zenoh/build.rs:160packages/rmw/zenoh/nros-rmw-zenohpool nros_rmw_zenoh::shim::service::ACTION_INBOX: slot bytes of each action-family inbox ring; the element is an InboxStorage struct (ring header + slots), so only the compiler knows the product
NROS_ACTION_INBOX_DEPTHcomputed — see packages/rmw/zenoh/nros-rmw-zenoh/build.rs:166packages/rmw/zenoh/nros-rmw-zenohpool nros_rmw_zenoh::shim::service::ACTION_INBOX: ring depth of each action-family inbox; same InboxStorage element
NROS_BOOT_REPORTcomputed — see packages/core/nros-node/build.rs:378packages/core/nros-nodepool nros_node::boot_report::NROS_BOOT_REPORT: a switch, not a count: on (the native_sim default since issue 1424, and wherever CONFIG_NROS_BOOT_REPORT=y) it links the one boot-record static, measured per image by mem-report; off, it links nothing
NROS_CAPABILITY_PARAM_SERVICEScomputed — see packages/core/nros-params/build.rs:276packages/core/nros-paramsexecutor: a switch: the bringup declares param_services (Zephyr Kconfig); like NROS_PARAM_STORE it makes the executor’s storage carve the parameter store (phase-382 W3’); whether the six services’ sets and request/reply pair are carved too is the param-services cargo feature (issue 1897; a STATED 0 here did it until then, issue 1856)
NROS_EXECUTOR_ACTION_CLIENTScomputed — see packages/tooling/nros-zephyr-build/knobs.toml:73packages/tooling/nros-zephyr-buildexecutor: action-client entries the executor arena is sized for
NROS_EXECUTOR_ARENA_SIZEcomputed — see packages/core/nros-node/build.rs:1128packages/core/nros-nodeexecutor: the executor arena itself; the backing is EXECUTOR_BACKING (Rust) or the entry’s __nros_executor_storage / tier table (C/C++)
NROS_EXECUTOR_BACKING_U64Scomputed — see packages/tooling/nros-zephyr-build/knobs.toml:139packages/tooling/nros-zephyr-buildexecutor: STATES the boot executor’s backing size in words; EXECUTOR_BACKING is exactly 8x this
NROS_EXECUTOR_MAX_CBScomputed — see packages/tooling/nros-zephyr-build/src/lib.rs:692packages/tooling/nros-zephyr-buildexecutor: callback slots inside the executor
NROS_EXECUTOR_MAX_NODEScomputed — see packages/rmw/zenoh/nros-rmw-zenoh/build.rs:351packages/rmw/zenoh/nros-rmw-zenohexecutor: node slots inside the executor; the zenoh backend also sizes its per-node liveliness cap from it
NROS_EXECUTOR_MAX_SCcomputed — see packages/tooling/nros-zephyr-build/src/lib.rs:703packages/tooling/nros-zephyr-buildexecutor: sched-context slots inside the executor
NROS_EXECUTOR_MAX_SHUTDOWN_CBS2packages/core/nros-nodeexecutor: shutdown-callback slots inside the executor
NROS_EXECUTOR_MAX_VIOLATIONS8packages/core/nros-nodeexecutor: violation-ring slots carved from the executor backing (24 B each on a 32-bit target); with the boot report it also sizes the NROS_VIOLATION_RECORD static (40 B + 28 B a slot), measured per image by mem-report (phase-474 I1)
NROS_FREERTOS_APP_STACK_KBcomputed — see packages/tooling/nros-platform-config/src/platform_config.rs:1412packages/tooling/nros-platform-configstack: the application task’s stack, which FreeRTOS allocates out of ucHeap — it is inside that heap’s figure, never a symbol of its own
NROS_FREERTOS_HEAP_KBcomputed — see packages/tooling/nros-platform-config/src/platform_config.rs:1411packages/tooling/nros-platform-configheap ucHeap: FreeRTOS heap_4’s ucHeap[configTOTAL_HEAP_SIZE]; the symbol IS the region, measured per image
NROS_GRAPH_MAX_ENTITIES0packages/rmw/zenoh/nros-zpico-buildinput: the entity count ZPICO_GRAPH_CACHE_SIZE is derived from; storage is that knob’s
NROS_KEYEXPR_STRING_SIZE256packages/rmw/zenoh/nros-rmw-zenohelement: the key-expression buffer inside each subscriber/service shim entry; lands in SUBSCRIBER_BUFFERS/SERVICE_BUFFERS
NROS_LET_BUFFER_SIZEcomputed — see packages/tooling/nros-build-helpers/src/c.rs:125packages/tooling/nros-build-helperselement: the per-handle LET buffer inside each C/C++ API handle, which lives in the CALLER’s storage
NROS_LOG_BUFFER_SIZEcomputed — see packages/core/nros-log/build.rs:106packages/core/nros-logstack: the per-call Rust FormatBuffer is a stack frame in the logging caller (issue 1037); it is also the message element of nros_log::early::SLOTS and nros_log::rosout::SLOTS
NROS_LOG_DYNAMIC_LOGGERScomputed — see packages/core/nros-log/build.rs:100packages/core/nros-logpool nros_log::pool::POOL, nros_log::pool::NAMES: runtime-logger slots (phase-479 W5): POOL holds a Logger per slot, a struct whose size moves with its fields; NAMES is exactly 24 bytes per slot, so mem-report reads the image’s CAPACITY back out of its size
NROS_LOG_EARLY_RECORDScomputed — see packages/core/nros-log/build.rs:113packages/core/nros-logpool nros_log::early::SLOTS: records held before init (issue 1037): each slot holds a formatted message of NROS_LOG_BUFFER_SIZE bytes plus a logger name, so SLOTS moves with both knobs; 0 declines the ring
NROS_LOG_MAX_LEVELcomputed — see packages/core/nros-log/build.rs:129packages/core/nros-lognot-a-size: the compile-time severity CEILING (issue 1037): a threshold, not a count; a lower ceiling can only REMOVE code (Rust call sites below it fold away), never add storage
NROS_LOG_ROSOUT_RECORDScomputed — see packages/core/nros-log/build.rs:120packages/core/nros-logpool nros_log::rosout::SLOTS: the /rosout queue (issue 1037), linked only with nros-node/rosout: each slot holds a message of NROS_LOG_BUFFER_SIZE bytes plus a logger name
NROS_MAX_ARRAY_LENcomputed — see packages/tooling/nros-zephyr-build/knobs.toml:508packages/tooling/nros-zephyr-buildelement: bounds an array parameter value; paid by every ParameterValue, i.e. every slot
NROS_MAX_BYTE_ARRAY_LENcomputed — see packages/tooling/nros-zephyr-build/knobs.toml:526packages/tooling/nros-zephyr-buildelement: bounds a byte-array parameter value; paid by every ParameterValue, i.e. every slot
NROS_MAX_PARAMETERScomputed — see packages/core/nros-params/build.rs:51packages/core/nros-paramsexecutor: slots of the parameter store. CARVED into the executor’s storage when the build implies a store (NROS_PARAM_STORE / NROS_CAPABILITY_PARAM_SERVICES / a contract params:, phase-382 W3’), so mem-report’s [executor storage] prices it; otherwise boxed on the heap once per executor that declares (issue 0756)
NROS_MAX_PARAM_CONSTRAINTS_LENcomputed — see packages/core/nros-params/build.rs:131packages/core/nros-paramselement: bounds a parameter descriptor’s constraints text inside every ParameterStorage slot
NROS_MAX_PARAM_DESCRIPTION_LENcomputed — see packages/core/nros-params/build.rs:105packages/core/nros-paramselement: bounds a parameter descriptor’s description inside every ParameterStorage slot
NROS_MAX_PARAM_NAME_LENcomputed — see packages/core/nros-params/build.rs:59packages/core/nros-paramselement: bounds a parameter NAME inside every parameter-store slot (executor storage or heap, see NROS_MAX_PARAMETERS)
NROS_MAX_STRING_VALUE_LENcomputed — see packages/tooling/nros-zephyr-build/knobs.toml:627packages/tooling/nros-zephyr-buildelement: bounds a string parameter VALUE — ParameterValue is sized by its largest variant, so this is paid by every slot
NROS_MONITOR_ARM_GRACE_MS0packages/core/nros-nodenot-a-size: a time: arm the contract monitors this long after the first spin (phase-474 I2)
NROS_MONITOR_ARM_ON_CALLcomputed — see packages/core/nros-node/build.rs:662packages/core/nros-nodenot-a-size: a switch: whether contract monitors wait for the application’s arm call (phase-474 I2)
NROS_MULTIGOAL_GOALScomputed — see packages/testing/nros-tests/bins/action-client-multigoal/src/main.rs:132packages/testing/nros-tests/bins/action-client-multigoaltest-only: action-client-multigoal test binary
NROS_MULTIGOAL_SOAK_MS0packages/testing/nros-tests/bins/action-client-multigoaltest-only: action-client-multigoal test binary
NROS_PARAM_EVENTS_DEPTHcomputed — see packages/core/nros-params/build.rs:147packages/core/nros-paramsnot-a-size: a QoS history depth handed to the RMW when the /parameter_events publisher is created; what it costs is the backend’s (a reliable DDS writer’s history), not a nano-ros pool
NROS_PARAM_SERVICE_BUFFER_SIZEcomputed — see packages/core/nros-node/build.rs:524packages/core/nros-nodeexecutor: request/reply buffers of the builtin parameter and lifecycle services, held in the executor’s value
NROS_PARAM_SERVICE_INBOX_BYTES0packages/rmw/xrcepool nros_node::parameter_services::PARAM_INBOX: slot bytes of the parameter-service inbox ring (CallerInboxStorage element)
NROS_PARAM_SERVICE_INBOX_DEPTH1packages/core/nros-nodepool nros_node::parameter_services::PARAM_INBOX: ring depth of the parameter-service inbox (CallerInboxStorage element)
NROS_PARAM_STOREcomputed — see packages/core/nros-params/build.rs:277packages/core/nros-paramsexecutor: a switch: the image builds a parameter store, so the executor’s storage carves NROS_MAX_PARAMETERS slots of it (phase-382 W3’); off, the store costs the backing nothing
NROS_PUBSUB_QOS_DEPTHcomputed — see packages/core/nros-node/build.rs:925packages/core/nros-nodeexecutor: the per-subscription receive queue depth the arena budgets for; derived from the declared QoS where an image states one
NROS_RMW_MAX_BACKENDS8packages/rmw/cffipool nros_rmw_cffi::REGISTRY: backend slots in the RMW registry; the element is a BackendSlot struct
NROS_RMW_MAX_NODES4packages/rmw/cffipool nros_rmw_cffi::NODE_TABLE: node slots in the RMW node table; the element is a NodeSlot struct
NROS_RMW_MESSAGE_INFO_SLOTS64packages/rmw/cffipool nros_rmw_cffi::MESSAGE_INFO_TABLE: message-info slots; the MessageInfoSlot element gains fields under alloc + safety-e2e, so a constant would be right for one build (issue 0739)
NROS_RMW_SUBSCRIBER_SLOTS8packages/rmw/cffiprices SLOTS (8,192 B at defaults); default DERIVED per image when it declares its entities
NROS_RMW_SUBSCRIBER_SLOT_BYTES1024packages/rmw/cffiprices SLOTS (8,192 B at defaults)
NROS_RUNTIME_COMPONENT_SLOT_BYTES512packages/api/nroscomponent: byte budget of each component slot (TypedSlot<C>)
NROS_RUNTIME_MAX_CELL_ENTITIES8packages/api/nroscomponent: entity-registry slots per component cell
NROS_RUNTIME_MAX_CLASS_INSTANCES2packages/api/nroscomponent: instances one component class’s macro-emitted store (__NROS_COMPONENT_<pkg>_SLOT_STORE) holds
NROS_RUNTIME_MAX_COMPONENTS4packages/api/nroscomponent: component slots of the runtime’s type-erased pool
NROS_SERVICE_INBOX_BYTEScomputed — see packages/rmw/zenoh/nros-rmw-zenoh/build.rs:153packages/rmw/zenoh/nros-rmw-zenohpool nros_rmw_zenoh::shim::service::USER_SERVICE_INBOX: slot bytes of each user-service inbox ring (InboxStorage element); its default is DERIVED from the declared request types, so no static figure exists either
NROS_SERVICE_INBOX_DEPTHcomputed — see packages/rmw/zenoh/nros-rmw-zenoh/build.rs:159packages/rmw/zenoh/nros-rmw-zenohpool nros_rmw_zenoh::shim::service::USER_SERVICE_INBOX: ring depth of each user-service inbox (InboxStorage element)
NROS_SERVICE_TIMEOUT_MS30000packages/rmw/zenoh/nros-rmw-zenohnot-a-size: milliseconds
NROS_SMOLTCP_BUFFER_SIZEcomputed — see packages/drivers/net/nros-smoltcp/build.rs:54packages/drivers/net/nros-smoltcpsizes SOCKET_RX_BUFFERS — not priceable at defaults (knob NROS_SMOLTCP_MAX_SOCKETS has a computed default); sizes SOCKET_TX_BUFFERS — not priceable at defaults (knob NROS_SMOLTCP_MAX_SOCKETS has a computed default); sizes UDP_SOCKET_RX_BUFFERS — not priceable at defaults (knob NROS_SMOLTCP_MAX_UDP_SOCKETS has a computed default); sizes UDP_SOCKET_TX_BUFFERS — not priceable at defaults (knob NROS_SMOLTCP_MAX_UDP_SOCKETS has a computed default); pool nros_smoltcp::bridge::SOCKET_RX_BUFFERS, nros_smoltcp::bridge::SOCKET_TX_BUFFERS, nros_smoltcp::bridge::UDP_SOCKET_RX_BUFFERS, nros_smoltcp::bridge::UDP_SOCKET_TX_BUFFERS: per-socket buffer bytes; formula-priced, but the default is computed per platform
NROS_SMOLTCP_CONNECT_TIMEOUT_MScomputed — see packages/drivers/net/nros-smoltcp/build.rs:57packages/drivers/net/nros-smoltcpnot-a-size: milliseconds
NROS_SMOLTCP_MAX_SOCKETScomputed — see packages/drivers/net/nros-smoltcp/build.rs:45packages/drivers/net/nros-smoltcpsizes SOCKET_RX_BUFFERS — not priceable at defaults (knob NROS_SMOLTCP_MAX_SOCKETS has a computed default); sizes SOCKET_TX_BUFFERS — not priceable at defaults (knob NROS_SMOLTCP_MAX_SOCKETS has a computed default); pool nros_smoltcp::bridge::SOCKET_RX_BUFFERS, nros_smoltcp::bridge::SOCKET_TX_BUFFERS, nros_smoltcp::bridge::SOCKET_TABLE: TCP socket count; the byte buffers carry nros-pool: formulas, the socket table’s element is a struct
NROS_SMOLTCP_MAX_UDP_SOCKETScomputed — see packages/drivers/net/nros-smoltcp/build.rs:51packages/drivers/net/nros-smoltcpsizes UDP_SOCKET_RX_BUFFERS — not priceable at defaults (knob NROS_SMOLTCP_MAX_UDP_SOCKETS has a computed default); sizes UDP_SOCKET_TX_BUFFERS — not priceable at defaults (knob NROS_SMOLTCP_MAX_UDP_SOCKETS has a computed default); pool nros_smoltcp::bridge::UDP_SOCKET_RX_BUFFERS, nros_smoltcp::bridge::UDP_SOCKET_TX_BUFFERS, nros_smoltcp::bridge::UDP_SOCKET_TABLE: UDP socket count; byte buffers formula-priced, the table’s element is a struct
NROS_SMOLTCP_SOCKET_TIMEOUT_MScomputed — see packages/drivers/net/nros-smoltcp/build.rs:60packages/drivers/net/nros-smoltcpnot-a-size: milliseconds
NROS_SUBSCRIBER_BUFFER_SIZEcomputed — see packages/core/nros-node/build.rs:855packages/core/nros-node (conflicting defaults — see below)sizes SMALL_PAYLOADS — not priceable at defaults (knob NROS_ZENOH_MAX_SUBSCRIBERS has a computed default); pool nros_rmw_zenoh::shim::subscriber::SMALL_PAYLOADS: the small payload class (formula-priced); read by two crates with two defaults — the page flags that; default DERIVED per image when it declares its entities
NROS_SUBSCRIPTION_BUFFER_SIZEcomputed — see packages/tooling/nros-zephyr-build/knobs.toml:984packages/tooling/nros-zephyr-buildexecutor: each subscription’s receive buffer inside the executor arena (DEFAULT_RX_BUF_SIZE)
NROS_TRACE_TAKEScomputed — see packages/core/nros-node/build.rs:671packages/core/nros-nodenot-a-size: a switch: whether the callback trace emits a take event per subscription sample (phase-474 I3)
NROS_TRACE_TIMER_EVERY1packages/core/nros-nodenot-a-size: a ratio: one timer tick in N keeps its callback-trace start/end pair (phase-474 I3)
NROS_VIOLATION_DRAIN_REPORTcomputed — see packages/core/nros-node/build.rs:653packages/core/nros-nodenot-a-size: a switch: whether a new executor drains its violation ring every spin and logs each entry (phase-474 I1)
NROS_XRCE_BUFFER_SIZE1024packages/rmw/xrceheap: the default the three XRCE buffer sizes above alias to
NROS_XRCE_CUSTOM_TRANSPORT_MTU4096packages/rmw/xrceheap: the custom-transport twin of NROS_XRCE_TRANSPORT_MTU
NROS_XRCE_MAX_SERVICE_CLIENTS4packages/rmw/xrceheap: service-client slots inside xrce_session_state_t
NROS_XRCE_MAX_SERVICE_SERVERS4packages/rmw/xrceheap: service-server slots inside xrce_session_state_t
NROS_XRCE_MAX_SUBSCRIBERS8packages/rmw/xrceheap: subscriber slots inside xrce_session_state_t, which the XRCE backend allocates from the platform heap (nros_xrce_calloc) when a session opens — no named static, so mem-report cannot see it
NROS_XRCE_SERVICE_REPLY_BUFFER_SIZE1024packages/rmw/xrceheap: per-client reply buffer inside xrce_session_state_t
NROS_XRCE_SERVICE_REQUEST_BUFFER_SIZE1024packages/rmw/xrceheap: per-server request buffer inside xrce_session_state_t
NROS_XRCE_STREAM_HISTORY16packages/rmw/xrceheap: reliable-stream history depth; multiplies the stream buffers inside the session state
NROS_XRCE_SUBSCRIBER_BUFFER_SIZE1024packages/rmw/xrceheap: bytes per XRCE subscriber ring entry inside xrce_session_state_t
NROS_XRCE_SUBSCRIBER_RING_DEPTH32packages/rmw/xrceheap: ring depth of each XRCE subscriber slot inside xrce_session_state_t
NROS_XRCE_TRANSPORT_MTU4096packages/rmw/xrceheap: Micro-XRCE-DDS-Client transport MTU (UDP/TCP): sizes the transport’s buffer inside its transport struct
NROS_ZENOH_BATCH_MULTICAST_SIZEcomputed — see packages/tooling/nros-zephyr-build/knobs.toml:1295packages/tooling/nros-zephyr-buildheap: the multicast twin of the unicast batch buffers — heap at session open, no symbol
NROS_ZENOH_BATCH_UNICAST_SIZEcomputed — see packages/tooling/nros-zephyr-build/knobs.toml:1300packages/tooling/nros-zephyr-buildheap: zenoh-pico allocates its unicast TX/RX batch buffers (_z_wbuf_make/_z_zbuf_make) when a session opens — heap bytes, no symbol
NROS_ZENOH_FRAG_MAX_SIZEcomputed — see packages/tooling/nros-zephyr-build/knobs.toml:1316packages/tooling/nros-zephyr-buildheap: zenoh-pico’s defragmentation buffer, _z_wbuf_make(Z_FRAG_MAX_SIZE) on first fragment — heap, no symbol
NROS_ZENOH_GET_POLL_INTERVAL_MScomputed — see packages/tooling/nros-zephyr-build/knobs.toml:1332packages/tooling/nros-zephyr-buildnot-a-size: milliseconds
NROS_ZENOH_GET_REPLY_BUF_SIZEcomputed — see packages/tooling/nros-zephyr-build/knobs.toml:1348packages/tooling/nros-zephyr-buildstack: the blocking z_get reply context is stack-allocated per call (zpico.c), so it costs stack in the caller, never static RAM
NROS_ZENOH_GRAPH_CACHE_SIZEcomputed — see packages/rmw/zenoh/nros-zpico-build/src/runner.rs:1304packages/rmw/zenoh/nros-zpico-buildpool g_sessions: the graph cache’s byte buffer, embedded in each struct zpico_session beside its mutex and subscriber handle
NROS_ZENOH_GRAPH_DISCOVERYcomputed — see packages/rmw/zenoh/nros-zpico-build/src/runner.rs:1319packages/rmw/zenoh/nros-zpico-buildnot-a-size: switches the graph cache on; its bytes are ZPICO_GRAPH_CACHE_SIZE
NROS_ZENOH_LEASE_PRIORITY16packages/rmw/zenoh/nros-zpico-buildnot-a-size: a task priority
NROS_ZENOH_MAX_LARGE_SUBSCRIBERS2packages/rmw/zenoh/nros-rmw-zenohprices LARGE_PAYLOADS (131,072 B at defaults)
NROS_ZENOH_MAX_LIVELINESScomputed — see packages/rmw/zenoh/nros-zpico-build/src/runner.rs:1131packages/rmw/zenoh/nros-zpico-buildpool g_sessions: liveliness-token entries inside each struct zpico_session
NROS_ZENOH_MAX_PENDING_GETS4packages/rmw/zenoh/nros-zpico-buildpool g_sessions: pending-get slots inside each struct zpico_session
NROS_ZENOH_MAX_PUBLISHERScomputed — see packages/rmw/zenoh/nros-zpico-build/src/runner.rs:1118packages/rmw/zenoh/nros-zpico-buildpool g_sessions: publisher entries inside each struct zpico_session; default derived per image from the entity inventory
NROS_ZENOH_MAX_QUERYABLEScomputed — see packages/rmw/zenoh/nros-zpico-build/src/runner.rs:1102packages/rmw/zenoh/nros-zpico-buildpool g_sessions, nros_rmw_zenoh::shim::service::SERVICE_BUFFERS, nros_rmw_zenoh::shim::service::USER_SERVICE_INBOX: queryable entries inside each struct zpico_session and the per-queryable shim pools; default derived per image (a service server, a TRANSIENT_LOCAL publisher and the builtin param/lifecycle services each take one)
NROS_ZENOH_MAX_SESSIONS1packages/rmw/zenoh/nros-zpico-buildpool g_sessions, nros_rmw_zenoh::shim::service::SERVICE_BUFFERS, nros_rmw_zenoh::shim::service::USER_SERVICE_INBOX: session count: the outer dimension of the zpico session table and of every per-session shim pool; the session element is the struct zpico_session C struct
NROS_ZENOH_MAX_SUBSCRIBERScomputed — see packages/rmw/zenoh/nros-zpico-build/src/runner.rs:1122packages/rmw/zenoh/nros-zpico-buildsizes SMALL_PAYLOADS — not priceable at defaults (knob NROS_ZENOH_MAX_SUBSCRIBERS has a computed default); pool g_sessions, nros_rmw_zenoh::shim::subscriber::SUBSCRIBER_BUFFERS: subscriber entries inside each struct zpico_session and the shim’s SubscriberBuffer table (also priced through SMALL_PAYLOADS); default derived per image
NROS_ZENOH_MAX_TL_PUBLISHERScomputed — see packages/rmw/zenoh/nros-rmw-zenoh/build.rs:948packages/rmw/zenoh/nros-rmw-zenohpool nros_rmw_zenoh::shim::publisher::transient_local::TL_SLOTS: retention slots for TRANSIENT_LOCAL publishers; the element is a RetainSlot struct and the count is derived per image
NROS_ZENOH_PUBLISHER_TX_BUFFER_SIZE1024packages/rmw/zenoh/nros-rmw-zenohelement: each publisher’s zero-copy lend arena (ZENOH_TX_BUF), inside the publisher entry wherever that is stored
NROS_ZENOH_READ_PRIORITY16packages/rmw/zenoh/nros-zpico-buildnot-a-size: a task priority
NROS_ZENOH_SERVICE_BUFFER_SIZEcomputed — see packages/rmw/zenoh/nros-rmw-zenoh/build.rs:128packages/rmw/zenoh/nros-rmw-zenohpool nros_rmw_zenoh::shim::service::SERVICE_BUFFERS: payload bytes inside each ServiceBuffer struct; also the default for the two inbox slot sizes above
NROS_ZENOH_SUBSCRIBER_LARGE_SIZE16384packages/rmw/zenoh/nros-rmw-zenohprices LARGE_PAYLOADS (131,072 B at defaults)
NROS_ZENOH_SUBSCRIBER_RING_DEPTH4packages/rmw/zenoh/nros-rmw-zenohprices LARGE_PAYLOADS (131,072 B at defaults); sizes SMALL_PAYLOADS — not priceable at defaults (knob NROS_ZENOH_MAX_SUBSCRIBERS has a computed default); default DERIVED per image when it declares its entities
NROS_ZENOH_SUBSCRIBER_SIZE_THRESHOLD2048packages/rmw/zenoh/nros-rmw-zenohnot-a-size: the hint above which a subscription routes to the LARGE payload class — a routing threshold, not storage
NROS_ZENOH_TL_RETAIN_BYTEScomputed — see packages/rmw/zenoh/nros-rmw-zenoh/build.rs:373packages/rmw/zenoh/nros-rmw-zenohpool nros_rmw_zenoh::shim::publisher::transient_local::TL_SLOTS: bytes retained inside each RetainSlot
NROS_ZENOH_TL_RETAIN_DEPTH1packages/rmw/zenoh/nros-rmw-zenohpool nros_rmw_zenoh::shim::publisher::transient_local::TL_SLOTS: samples each RetainSlot retains (issue 1709): multiplies the slot’s retained bytes and attachment, derived per image from the deepest declared transient-local KEEP_LAST; default DERIVED per image when it declares its entities
NROS_ZENOH_TX_BATCHcomputed — see packages/tooling/nros-zephyr-build/knobs.toml:1781packages/tooling/nros-zephyr-buildnot-a-size: a switch: whether zenoh-pico batches outgoing messages (phase-282)
NROS_ZENOH_TX_BATCH_FLUSH_MScomputed — see packages/tooling/nros-zephyr-build/knobs.toml:1811packages/tooling/nros-zephyr-buildnot-a-size: a time: the longest a batched message waits before it is flushed (phase-282)
NROS_ZENOH_TX_SPLIT_LOCKcomputed — see packages/tooling/nros-zephyr-build/knobs.toml:1833packages/tooling/nros-zephyr-buildnot-a-size: a switch: whether the TX path takes its own lock instead of the session’s (phase-282)
NROS_ZEPHYR_HEAP_SIZEcomputed — see packages/platform/nros-platform/build.rs:66packages/platform/nros-platformheap nros_platform::zephyr_heap::HEAP: the rlsf arena both zenoh-pico’s z_malloc and Rust’s allocator draw from on Zephyr; the symbol IS the region, measured per image
ROSOUT_PROBE_PERIOD_MS250packages/testing/nros-tests/bins/rosout-talkertest-only: rosout-talker test binary
ROSOUT_PROBE_RECORDS60packages/testing/nros-tests/bins/rosout-talkertest-only: rosout-talker test binary

Conflicting defaults

These knobs are read in more than one place with DIFFERENT defaults, so setting one moves only part of the tree — the issue-0135 split-brain shape one layer up.

  • NROS_SUBSCRIBER_BUFFER_SIZE