Alright, for a little more exposition, the error can be captured in a simple printf of the address before and after the function call.
e.g.:
printf("addr = %p\n", &myvar);
Looking at the disassembly, this compiles to:
0801 8A78 ADD.W R3, R7, #0x10
0801 8A7C MOV R1, R3
0801 8A7E LDR R0, =0x080B0070 ;[0x08018BBC]
0801 8A80 BL printf ; 0x080A4640
Where 0x080B0070 is the address of the const string.
So it looks like R7+0x10 = 0x2001C090 is storing the address of the variable.
In the suspicious function, R7 is getting stacked, but then the incorrect value in unstacked, ergo my suspicious function must be clobbering my stack frame (or the RTOS is corrupting something).
Upon function return, R7 is reloaded with the corrupted value, so R7+0x10 is now pointing to the wrong place.
I guess this comes down to how the debugger has to try and make a fake "symbol" or expression to represent the local stack variable, since it is not a proper object symbol after compilation. So it is really only an inferred location, and I suppose it can only ever infer it when loading the ELF.
(Also ... couldn't the Jlink itself enforce a check that detects or instruments a C function entry and checks for C stack corruption on return? That would be pretty great ... )