Files
2026-07-21 19:14:19 +02:00

1.7 KiB

K10 — Queue and StaticQueue<T, N>

K10 adds a typed C++ boundary over FreeRTOS byte-copy queues. Both wrappers unconditionally require T to be trivially copyable, pass sizeof(T) to the kernel and expose bounded send/receive calls whose default timeout is zero.

  • Queue<T> owns a dynamically created queue and deletes it in its destructor;
  • StaticQueue<T,N> references caller-owned StaticQueueStorage<T,N> in .bss and creates no heap allocation;
  • neither wrapper can be copied or moved.

Hazard3 evidence

dynamic queue cost       = 0x80 = 128 bytes
Sample item size         = 0x0c = 12 bytes
received copied value    = 0x1111 (source mutated to 0xDEAD)
full send timeout        = 2 ticks
second FIFO value        = 0x3333

Static creation leaves the heap unchanged. Its native handle equals the caller-supplied control block, and both control/storage addresses lie outside ucHeap. Destruction restores the exact dynamic baseline.

Build

make check

The host suite also compiles a trivial Sample and requires compilation of a minimal owning VectorV1 message to fail with:

Queue<T> requires T to be trivially copyable

Debug

b queue_debug_checkpoint
p g_dynamic_queue_cost
p g_static_control_address
p g_static_bytes_address
p g_static_first_item_bytes
p g_copy_source_after_mutation
p g_copy_received_value
p g_full_count
p g_timeout_ticks
p g_fifo_values
p g_queue_pass

Scope boundary

FreeRTOS queues copy bytes, not object lifetime. Owning objects must not cross this boundary by value. A pointer may be trivially copyable but then lifetime and ownership remain an explicit application contract. No wrapper silently uses portMAX_DELAY.