GCC ARM port and use of -fomit-frame-pointer
I see the GCC ARM port issue regarding thread unsafe function returns is still biting people. I find the use of -fomit-frame-pointer interferes with some debuggers’ abilities to unwind the stack. Some time ago I suggested a FreeRTOS port fix for it. I have been using the fix successfully for some time now. It seems to take care of the issue. I think it should be in the official ARM port so that the problem doesn’t keep coming back.
Here it is again (without explanation):
In the portSAVE_CONTEXT() macro of portmacro.h add the commented line in the position shown below
____/* Set R0 to point to the task stack pointer. */
________"STMDB SP,{SP}^ nt"
________"NOP nt"
________"SUB SP, SP, #4 nt"
________"LDMIA SP!,{R0} nt"
/*gb – step over possible GCC stacked items (GCC bug)*/
________"SUB R0, R0, #8 nt"
GCC ARM port and use of -fomit-frame-pointer
No response to this? Looks like a good idea.
Does this mean it uses an extra 8 bytes of RAM for each context? Should not be a problem I don’t think.
GCC ARM port and use of -fomit-frame-pointer
Yes, eight bytes of stack space are wasted for each task, except the running task (and except for those tasks that were in the non thread-safe state when their context was saved). Also, the cost of a context switch goes up by the execution of one register-to-register instruction.