what: add an opt-in flag to probe-run that: fills the stack with a known bit pattern and then reports the "watermark level" of stack usage after the program exits
how:
after reset halt and before flashing, fill the whole RAM region that contains the SP with a known 32-bit pattern
once the program exits and there wasn't a stack overflow, scan the RAM from the lowest address to its highest address for the first non-occurrence of the 32-bit pattern. tip: do a binary search
subtract this value from 'initial SP value' and report this as the observed max stack usage in bytes
good to know:
(iirc) the ARM ABI says that the stack pointer must always be 8 byte aligned on function entry and from looking at machine code the stack pointer is always kept at a multiple of 4, hence the 32-bit pattern above
to paint the stack you want to do a memset operation at the SWD level to avoid moving, e.g. 256KB of repeated data, from the host to the target which is bound to be slow due to USB 2.0 FS bandwidth. It's unclear whether probe-rs exposes this operation in its API; it certainly implements the host to target memcpy operation.
make it better:
a smarter way to do the 'paint the stack' part is to check if the stack was painted before (check lowest RAM address first? if it was, check for first non-occurrence of bit pattern) and then only paint the unpainted part
what: add an opt-in flag to
probe-run
that: fills the stack with a known bit pattern and then reports the "watermark level" of stack usage after the program exitshow:
good to know:
memset
operation at the SWD level to avoid moving, e.g. 256KB of repeated data, from the host to the target which is bound to be slow due to USB 2.0 FS bandwidth. It's unclear whetherprobe-rs
exposes this operation in its API; it certainly implements the host to targetmemcpy
operation.make it better: