numbers from the author's benches

Measured

Three benches on the host, and the things that only silicon will tell you. Your silicon will differ; these are the numbers from this bench.

1.0

Host and silicon

Three benches on the host, and the things that only silicon will tell you.

1.1  Cross-core transport — host, 2 pinned cores, 64-byte non-scalar record, 1 s per side
transportSRAMreadsns / optornnote
saturating writer — the worst case
seqlock1×216 2004 625.350safe, but the reader spins on retries
double2×6 404 140156.15612 686writer laps the reader — tears
triple3×6 701 371149.220wait-free and always safe
paced writer @ 100 µs — signals at realistic intervals
seqlock1×30 073 52933.250at interval rates all three are tear-free and equally fast — don't triple your SRAM by default
double2×28 127 86335.550
triple3×29 659 30733.720
1.2  Whole-system load — 4 cores, 8 CAN buses, 200 function blocks, 10 ms rate
corerolemicro-modelreal generated stack
08 buses + 50 blocks1.89 %~3.8 %
150 blocks1.32 %~1.5 %
250 blocks1.22 %~1.4 %
350 blocks1.23 %~1.5 %
—footprint—448 KB binary · ~0.7 MB Pss

The right-hand column is the same load through the actual generated stack on real SocketCAN interfaces — config and blocks generated, eight bus-bridge threads polling for real. The IO core costs about 2.5× an application core, and the system sits at roughly fifty times headroom. Scheduling is not where the time goes: a handler dispatch is under a nanosecond, so a 32-handler tick is about 22 ns of Loom.

1.3  What silicon adds — the STM32H7 bench: H755 with Cortex-M7 + M4 in AMP over shared SRAM, and a single-core H735
findingmeasurementconsequence
exclusives don't arbitrate 162 torn / 200 000 the exchange-based triple buffer is not safe on this fabric; cross-core signals use plain stores with sequence stamps instead
cross-core bulk stream ~33 MB/s @ 256 B the M4's uncached store bandwidth is the wall, not the ring
two independent clocks ±608 µs bound each core stamps its own timer; the dump carries a measured offset so both cores land on one timeline
instruction cache off 18k … 183k iters/ms the same loop, swinging tenfold between builds: an M7 fetching from 3-wait-state flash makes throughput a link-address lottery — until the I-cache is switched on

The last two are the reason the project exists in hardware and not only in a simulator. Neither is visible on a host: on Linux the transports all behave, and the numbers in §1.1 would have been the whole story.