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.
| pool | bytes at default | formula | declared in |
|---|---|---|---|
LARGE_PAYLOADS | 131,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_SIZE | packages/rmw/zenoh/nros-rmw-zenoh/src/shim/subscriber.rs:205 |
SLOTS | 8,192 (builtin — an image that declares its entities derives its own) | NROS_RMW_SUBSCRIBER_SLOTS * NROS_RMW_SUBSCRIBER_SLOT_BYTES | packages/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_SIZE | packages/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_SIZE | packages/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_SIZE | packages/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_SIZE | packages/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_SIZE | packages/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.
| symbol | kind | sized by |
|---|---|---|
g_sessions | pool | NROS_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::SLOTS | pool | NROS_LOG_EARLY_RECORDS |
nros_log::pool::NAMES | pool | NROS_LOG_DYNAMIC_LOGGERS |
nros_log::pool::POOL | pool | NROS_LOG_DYNAMIC_LOGGERS |
nros_log::rosout::SLOTS | pool | NROS_LOG_ROSOUT_RECORDS |
nros_node::boot_report::NROS_BOOT_REPORT | pool | NROS_BOOT_REPORT |
nros_node::parameter_services::PARAM_INBOX | pool | NROS_PARAM_SERVICE_INBOX_BYTES, NROS_PARAM_SERVICE_INBOX_DEPTH |
nros_platform::zephyr_heap::HEAP | heap | NROS_ZEPHYR_HEAP_SIZE |
nros_rmw_cffi::MESSAGE_INFO_TABLE | pool | NROS_RMW_MESSAGE_INFO_SLOTS |
nros_rmw_cffi::NODE_TABLE | pool | NROS_RMW_MAX_NODES |
nros_rmw_cffi::REGISTRY | pool | NROS_RMW_MAX_BACKENDS |
nros_rmw_zenoh::shim::publisher::transient_local::TL_SLOTS | pool | NROS_ZENOH_MAX_TL_PUBLISHERS, NROS_ZENOH_TL_RETAIN_BYTES, NROS_ZENOH_TL_RETAIN_DEPTH |
nros_rmw_zenoh::shim::service::ACTION_INBOX | pool | NROS_ACTION_INBOX_BYTES, NROS_ACTION_INBOX_DEPTH |
nros_rmw_zenoh::shim::service::SERVICE_BUFFERS | pool | NROS_ZENOH_MAX_QUERYABLES, NROS_ZENOH_MAX_SESSIONS, NROS_ZENOH_SERVICE_BUFFER_SIZE |
nros_rmw_zenoh::shim::service::USER_SERVICE_INBOX | pool | NROS_SERVICE_INBOX_BYTES, NROS_SERVICE_INBOX_DEPTH, NROS_ZENOH_MAX_QUERYABLES, NROS_ZENOH_MAX_SESSIONS |
nros_rmw_zenoh::shim::subscriber::SMALL_PAYLOADS | pool | NROS_SUBSCRIBER_BUFFER_SIZE |
nros_rmw_zenoh::shim::subscriber::SUBSCRIBER_BUFFERS | pool | NROS_ZENOH_MAX_SUBSCRIBERS |
nros_smoltcp::bridge::SOCKET_RX_BUFFERS | pool | NROS_SMOLTCP_BUFFER_SIZE, NROS_SMOLTCP_MAX_SOCKETS |
nros_smoltcp::bridge::SOCKET_TABLE | pool | NROS_SMOLTCP_MAX_SOCKETS |
nros_smoltcp::bridge::SOCKET_TX_BUFFERS | pool | NROS_SMOLTCP_BUFFER_SIZE, NROS_SMOLTCP_MAX_SOCKETS |
nros_smoltcp::bridge::UDP_SOCKET_RX_BUFFERS | pool | NROS_SMOLTCP_BUFFER_SIZE, NROS_SMOLTCP_MAX_UDP_SOCKETS |
nros_smoltcp::bridge::UDP_SOCKET_TABLE | pool | NROS_SMOLTCP_MAX_UDP_SOCKETS |
nros_smoltcp::bridge::UDP_SOCKET_TX_BUFFERS | pool | NROS_SMOLTCP_BUFFER_SIZE, NROS_SMOLTCP_MAX_UDP_SOCKETS |
ucHeap | heap | NROS_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.
| knob | default | read by | cost |
|---|---|---|---|
NROS_ACTION_INBOX_BYTES | computed — see packages/rmw/zenoh/nros-rmw-zenoh/build.rs:160 | packages/rmw/zenoh/nros-rmw-zenoh | pool 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_DEPTH | computed — see packages/rmw/zenoh/nros-rmw-zenoh/build.rs:166 | packages/rmw/zenoh/nros-rmw-zenoh | pool nros_rmw_zenoh::shim::service::ACTION_INBOX: ring depth of each action-family inbox; same InboxStorage element |
NROS_BOOT_REPORT | computed — see packages/core/nros-node/build.rs:378 | packages/core/nros-node | pool 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_SERVICES | computed — see packages/core/nros-params/build.rs:276 | packages/core/nros-params | executor: 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_CLIENTS | computed — see packages/tooling/nros-zephyr-build/knobs.toml:73 | packages/tooling/nros-zephyr-build | executor: action-client entries the executor arena is sized for |
NROS_EXECUTOR_ARENA_SIZE | computed — see packages/core/nros-node/build.rs:1128 | packages/core/nros-node | executor: the executor arena itself; the backing is EXECUTOR_BACKING (Rust) or the entry’s __nros_executor_storage / tier table (C/C++) |
NROS_EXECUTOR_BACKING_U64S | computed — see packages/tooling/nros-zephyr-build/knobs.toml:139 | packages/tooling/nros-zephyr-build | executor: STATES the boot executor’s backing size in words; EXECUTOR_BACKING is exactly 8x this |
NROS_EXECUTOR_MAX_CBS | computed — see packages/tooling/nros-zephyr-build/src/lib.rs:692 | packages/tooling/nros-zephyr-build | executor: callback slots inside the executor |
NROS_EXECUTOR_MAX_NODES | computed — see packages/rmw/zenoh/nros-rmw-zenoh/build.rs:351 | packages/rmw/zenoh/nros-rmw-zenoh | executor: node slots inside the executor; the zenoh backend also sizes its per-node liveliness cap from it |
NROS_EXECUTOR_MAX_SC | computed — see packages/tooling/nros-zephyr-build/src/lib.rs:703 | packages/tooling/nros-zephyr-build | executor: sched-context slots inside the executor |
NROS_EXECUTOR_MAX_SHUTDOWN_CBS | 2 | packages/core/nros-node | executor: shutdown-callback slots inside the executor |
NROS_EXECUTOR_MAX_VIOLATIONS | 8 | packages/core/nros-node | executor: 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_KB | computed — see packages/tooling/nros-platform-config/src/platform_config.rs:1412 | packages/tooling/nros-platform-config | stack: 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_KB | computed — see packages/tooling/nros-platform-config/src/platform_config.rs:1411 | packages/tooling/nros-platform-config | heap ucHeap: FreeRTOS heap_4’s ucHeap[configTOTAL_HEAP_SIZE]; the symbol IS the region, measured per image |
NROS_GRAPH_MAX_ENTITIES | 0 | packages/rmw/zenoh/nros-zpico-build | input: the entity count ZPICO_GRAPH_CACHE_SIZE is derived from; storage is that knob’s |
NROS_KEYEXPR_STRING_SIZE | 256 | packages/rmw/zenoh/nros-rmw-zenoh | element: the key-expression buffer inside each subscriber/service shim entry; lands in SUBSCRIBER_BUFFERS/SERVICE_BUFFERS |
NROS_LET_BUFFER_SIZE | computed — see packages/tooling/nros-build-helpers/src/c.rs:125 | packages/tooling/nros-build-helpers | element: the per-handle LET buffer inside each C/C++ API handle, which lives in the CALLER’s storage |
NROS_LOG_BUFFER_SIZE | computed — see packages/core/nros-log/build.rs:106 | packages/core/nros-log | stack: 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_LOGGERS | computed — see packages/core/nros-log/build.rs:100 | packages/core/nros-log | pool 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_RECORDS | computed — see packages/core/nros-log/build.rs:113 | packages/core/nros-log | pool 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_LEVEL | computed — see packages/core/nros-log/build.rs:129 | packages/core/nros-log | not-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_RECORDS | computed — see packages/core/nros-log/build.rs:120 | packages/core/nros-log | pool 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_LEN | computed — see packages/tooling/nros-zephyr-build/knobs.toml:508 | packages/tooling/nros-zephyr-build | element: bounds an array parameter value; paid by every ParameterValue, i.e. every slot |
NROS_MAX_BYTE_ARRAY_LEN | computed — see packages/tooling/nros-zephyr-build/knobs.toml:526 | packages/tooling/nros-zephyr-build | element: bounds a byte-array parameter value; paid by every ParameterValue, i.e. every slot |
NROS_MAX_PARAMETERS | computed — see packages/core/nros-params/build.rs:51 | packages/core/nros-params | executor: 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_LEN | computed — see packages/core/nros-params/build.rs:131 | packages/core/nros-params | element: bounds a parameter descriptor’s constraints text inside every ParameterStorage slot |
NROS_MAX_PARAM_DESCRIPTION_LEN | computed — see packages/core/nros-params/build.rs:105 | packages/core/nros-params | element: bounds a parameter descriptor’s description inside every ParameterStorage slot |
NROS_MAX_PARAM_NAME_LEN | computed — see packages/core/nros-params/build.rs:59 | packages/core/nros-params | element: bounds a parameter NAME inside every parameter-store slot (executor storage or heap, see NROS_MAX_PARAMETERS) |
NROS_MAX_STRING_VALUE_LEN | computed — see packages/tooling/nros-zephyr-build/knobs.toml:627 | packages/tooling/nros-zephyr-build | element: bounds a string parameter VALUE — ParameterValue is sized by its largest variant, so this is paid by every slot |
NROS_MONITOR_ARM_GRACE_MS | 0 | packages/core/nros-node | not-a-size: a time: arm the contract monitors this long after the first spin (phase-474 I2) |
NROS_MONITOR_ARM_ON_CALL | computed — see packages/core/nros-node/build.rs:662 | packages/core/nros-node | not-a-size: a switch: whether contract monitors wait for the application’s arm call (phase-474 I2) |
NROS_MULTIGOAL_GOALS | computed — see packages/testing/nros-tests/bins/action-client-multigoal/src/main.rs:132 | packages/testing/nros-tests/bins/action-client-multigoal | test-only: action-client-multigoal test binary |
NROS_MULTIGOAL_SOAK_MS | 0 | packages/testing/nros-tests/bins/action-client-multigoal | test-only: action-client-multigoal test binary |
NROS_PARAM_EVENTS_DEPTH | computed — see packages/core/nros-params/build.rs:147 | packages/core/nros-params | not-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_SIZE | computed — see packages/core/nros-node/build.rs:524 | packages/core/nros-node | executor: request/reply buffers of the builtin parameter and lifecycle services, held in the executor’s value |
NROS_PARAM_SERVICE_INBOX_BYTES | 0 | packages/rmw/xrce | pool nros_node::parameter_services::PARAM_INBOX: slot bytes of the parameter-service inbox ring (CallerInboxStorage element) |
NROS_PARAM_SERVICE_INBOX_DEPTH | 1 | packages/core/nros-node | pool nros_node::parameter_services::PARAM_INBOX: ring depth of the parameter-service inbox (CallerInboxStorage element) |
NROS_PARAM_STORE | computed — see packages/core/nros-params/build.rs:277 | packages/core/nros-params | executor: 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_DEPTH | computed — see packages/core/nros-node/build.rs:925 | packages/core/nros-node | executor: the per-subscription receive queue depth the arena budgets for; derived from the declared QoS where an image states one |
NROS_RMW_MAX_BACKENDS | 8 | packages/rmw/cffi | pool nros_rmw_cffi::REGISTRY: backend slots in the RMW registry; the element is a BackendSlot struct |
NROS_RMW_MAX_NODES | 4 | packages/rmw/cffi | pool nros_rmw_cffi::NODE_TABLE: node slots in the RMW node table; the element is a NodeSlot struct |
NROS_RMW_MESSAGE_INFO_SLOTS | 64 | packages/rmw/cffi | pool 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_SLOTS | 8 | packages/rmw/cffi | prices SLOTS (8,192 B at defaults); default DERIVED per image when it declares its entities |
NROS_RMW_SUBSCRIBER_SLOT_BYTES | 1024 | packages/rmw/cffi | prices SLOTS (8,192 B at defaults) |
NROS_RUNTIME_COMPONENT_SLOT_BYTES | 512 | packages/api/nros | component: byte budget of each component slot (TypedSlot<C>) |
NROS_RUNTIME_MAX_CELL_ENTITIES | 8 | packages/api/nros | component: entity-registry slots per component cell |
NROS_RUNTIME_MAX_CLASS_INSTANCES | 2 | packages/api/nros | component: instances one component class’s macro-emitted store (__NROS_COMPONENT_<pkg>_SLOT_STORE) holds |
NROS_RUNTIME_MAX_COMPONENTS | 4 | packages/api/nros | component: component slots of the runtime’s type-erased pool |
NROS_SERVICE_INBOX_BYTES | computed — see packages/rmw/zenoh/nros-rmw-zenoh/build.rs:153 | packages/rmw/zenoh/nros-rmw-zenoh | pool 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_DEPTH | computed — see packages/rmw/zenoh/nros-rmw-zenoh/build.rs:159 | packages/rmw/zenoh/nros-rmw-zenoh | pool nros_rmw_zenoh::shim::service::USER_SERVICE_INBOX: ring depth of each user-service inbox (InboxStorage element) |
NROS_SERVICE_TIMEOUT_MS | 30000 | packages/rmw/zenoh/nros-rmw-zenoh | not-a-size: milliseconds |
NROS_SMOLTCP_BUFFER_SIZE | computed — see packages/drivers/net/nros-smoltcp/build.rs:54 | packages/drivers/net/nros-smoltcp | sizes 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_MS | computed — see packages/drivers/net/nros-smoltcp/build.rs:57 | packages/drivers/net/nros-smoltcp | not-a-size: milliseconds |
NROS_SMOLTCP_MAX_SOCKETS | computed — see packages/drivers/net/nros-smoltcp/build.rs:45 | packages/drivers/net/nros-smoltcp | sizes 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_SOCKETS | computed — see packages/drivers/net/nros-smoltcp/build.rs:51 | packages/drivers/net/nros-smoltcp | 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::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_MS | computed — see packages/drivers/net/nros-smoltcp/build.rs:60 | packages/drivers/net/nros-smoltcp | not-a-size: milliseconds |
NROS_SUBSCRIBER_BUFFER_SIZE | computed — see packages/core/nros-node/build.rs:855 | packages/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_SIZE | computed — see packages/tooling/nros-zephyr-build/knobs.toml:984 | packages/tooling/nros-zephyr-build | executor: each subscription’s receive buffer inside the executor arena (DEFAULT_RX_BUF_SIZE) |
NROS_TRACE_TAKES | computed — see packages/core/nros-node/build.rs:671 | packages/core/nros-node | not-a-size: a switch: whether the callback trace emits a take event per subscription sample (phase-474 I3) |
NROS_TRACE_TIMER_EVERY | 1 | packages/core/nros-node | not-a-size: a ratio: one timer tick in N keeps its callback-trace start/end pair (phase-474 I3) |
NROS_VIOLATION_DRAIN_REPORT | computed — see packages/core/nros-node/build.rs:653 | packages/core/nros-node | not-a-size: a switch: whether a new executor drains its violation ring every spin and logs each entry (phase-474 I1) |
NROS_XRCE_BUFFER_SIZE | 1024 | packages/rmw/xrce | heap: the default the three XRCE buffer sizes above alias to |
NROS_XRCE_CUSTOM_TRANSPORT_MTU | 4096 | packages/rmw/xrce | heap: the custom-transport twin of NROS_XRCE_TRANSPORT_MTU |
NROS_XRCE_MAX_SERVICE_CLIENTS | 4 | packages/rmw/xrce | heap: service-client slots inside xrce_session_state_t |
NROS_XRCE_MAX_SERVICE_SERVERS | 4 | packages/rmw/xrce | heap: service-server slots inside xrce_session_state_t |
NROS_XRCE_MAX_SUBSCRIBERS | 8 | packages/rmw/xrce | heap: 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_SIZE | 1024 | packages/rmw/xrce | heap: per-client reply buffer inside xrce_session_state_t |
NROS_XRCE_SERVICE_REQUEST_BUFFER_SIZE | 1024 | packages/rmw/xrce | heap: per-server request buffer inside xrce_session_state_t |
NROS_XRCE_STREAM_HISTORY | 16 | packages/rmw/xrce | heap: reliable-stream history depth; multiplies the stream buffers inside the session state |
NROS_XRCE_SUBSCRIBER_BUFFER_SIZE | 1024 | packages/rmw/xrce | heap: bytes per XRCE subscriber ring entry inside xrce_session_state_t |
NROS_XRCE_SUBSCRIBER_RING_DEPTH | 32 | packages/rmw/xrce | heap: ring depth of each XRCE subscriber slot inside xrce_session_state_t |
NROS_XRCE_TRANSPORT_MTU | 4096 | packages/rmw/xrce | heap: Micro-XRCE-DDS-Client transport MTU (UDP/TCP): sizes the transport’s buffer inside its transport struct |
NROS_ZENOH_BATCH_MULTICAST_SIZE | computed — see packages/tooling/nros-zephyr-build/knobs.toml:1295 | packages/tooling/nros-zephyr-build | heap: the multicast twin of the unicast batch buffers — heap at session open, no symbol |
NROS_ZENOH_BATCH_UNICAST_SIZE | computed — see packages/tooling/nros-zephyr-build/knobs.toml:1300 | packages/tooling/nros-zephyr-build | heap: 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_SIZE | computed — see packages/tooling/nros-zephyr-build/knobs.toml:1316 | packages/tooling/nros-zephyr-build | heap: zenoh-pico’s defragmentation buffer, _z_wbuf_make(Z_FRAG_MAX_SIZE) on first fragment — heap, no symbol |
NROS_ZENOH_GET_POLL_INTERVAL_MS | computed — see packages/tooling/nros-zephyr-build/knobs.toml:1332 | packages/tooling/nros-zephyr-build | not-a-size: milliseconds |
NROS_ZENOH_GET_REPLY_BUF_SIZE | computed — see packages/tooling/nros-zephyr-build/knobs.toml:1348 | packages/tooling/nros-zephyr-build | stack: 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_SIZE | computed — see packages/rmw/zenoh/nros-zpico-build/src/runner.rs:1304 | packages/rmw/zenoh/nros-zpico-build | pool g_sessions: the graph cache’s byte buffer, embedded in each struct zpico_session beside its mutex and subscriber handle |
NROS_ZENOH_GRAPH_DISCOVERY | computed — see packages/rmw/zenoh/nros-zpico-build/src/runner.rs:1319 | packages/rmw/zenoh/nros-zpico-build | not-a-size: switches the graph cache on; its bytes are ZPICO_GRAPH_CACHE_SIZE |
NROS_ZENOH_LEASE_PRIORITY | 16 | packages/rmw/zenoh/nros-zpico-build | not-a-size: a task priority |
NROS_ZENOH_MAX_LARGE_SUBSCRIBERS | 2 | packages/rmw/zenoh/nros-rmw-zenoh | prices LARGE_PAYLOADS (131,072 B at defaults) |
NROS_ZENOH_MAX_LIVELINESS | computed — see packages/rmw/zenoh/nros-zpico-build/src/runner.rs:1131 | packages/rmw/zenoh/nros-zpico-build | pool g_sessions: liveliness-token entries inside each struct zpico_session |
NROS_ZENOH_MAX_PENDING_GETS | 4 | packages/rmw/zenoh/nros-zpico-build | pool g_sessions: pending-get slots inside each struct zpico_session |
NROS_ZENOH_MAX_PUBLISHERS | computed — see packages/rmw/zenoh/nros-zpico-build/src/runner.rs:1118 | packages/rmw/zenoh/nros-zpico-build | pool g_sessions: publisher entries inside each struct zpico_session; default derived per image from the entity inventory |
NROS_ZENOH_MAX_QUERYABLES | computed — see packages/rmw/zenoh/nros-zpico-build/src/runner.rs:1102 | packages/rmw/zenoh/nros-zpico-build | pool 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_SESSIONS | 1 | packages/rmw/zenoh/nros-zpico-build | pool 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_SUBSCRIBERS | computed — see packages/rmw/zenoh/nros-zpico-build/src/runner.rs:1122 | packages/rmw/zenoh/nros-zpico-build | sizes 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_PUBLISHERS | computed — see packages/rmw/zenoh/nros-rmw-zenoh/build.rs:948 | packages/rmw/zenoh/nros-rmw-zenoh | pool 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_SIZE | 1024 | packages/rmw/zenoh/nros-rmw-zenoh | element: each publisher’s zero-copy lend arena (ZENOH_TX_BUF), inside the publisher entry wherever that is stored |
NROS_ZENOH_READ_PRIORITY | 16 | packages/rmw/zenoh/nros-zpico-build | not-a-size: a task priority |
NROS_ZENOH_SERVICE_BUFFER_SIZE | computed — see packages/rmw/zenoh/nros-rmw-zenoh/build.rs:128 | packages/rmw/zenoh/nros-rmw-zenoh | pool 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_SIZE | 16384 | packages/rmw/zenoh/nros-rmw-zenoh | prices LARGE_PAYLOADS (131,072 B at defaults) |
NROS_ZENOH_SUBSCRIBER_RING_DEPTH | 4 | packages/rmw/zenoh/nros-rmw-zenoh | prices 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_THRESHOLD | 2048 | packages/rmw/zenoh/nros-rmw-zenoh | not-a-size: the hint above which a subscription routes to the LARGE payload class — a routing threshold, not storage |
NROS_ZENOH_TL_RETAIN_BYTES | computed — see packages/rmw/zenoh/nros-rmw-zenoh/build.rs:373 | packages/rmw/zenoh/nros-rmw-zenoh | pool nros_rmw_zenoh::shim::publisher::transient_local::TL_SLOTS: bytes retained inside each RetainSlot |
NROS_ZENOH_TL_RETAIN_DEPTH | 1 | packages/rmw/zenoh/nros-rmw-zenoh | pool 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_BATCH | computed — see packages/tooling/nros-zephyr-build/knobs.toml:1781 | packages/tooling/nros-zephyr-build | not-a-size: a switch: whether zenoh-pico batches outgoing messages (phase-282) |
NROS_ZENOH_TX_BATCH_FLUSH_MS | computed — see packages/tooling/nros-zephyr-build/knobs.toml:1811 | packages/tooling/nros-zephyr-build | not-a-size: a time: the longest a batched message waits before it is flushed (phase-282) |
NROS_ZENOH_TX_SPLIT_LOCK | computed — see packages/tooling/nros-zephyr-build/knobs.toml:1833 | packages/tooling/nros-zephyr-build | not-a-size: a switch: whether the TX path takes its own lock instead of the session’s (phase-282) |
NROS_ZEPHYR_HEAP_SIZE | computed — see packages/platform/nros-platform/build.rs:66 | packages/platform/nros-platform | heap 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_MS | 250 | packages/testing/nros-tests/bins/rosout-talker | test-only: rosout-talker test binary |
ROSOUT_PROBE_RECORDS | 60 | packages/testing/nros-tests/bins/rosout-talker | test-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