The debugger doesn't halt here, I'm not sure if I'm being explicit enough but the uC is the one who just stops responding in the UART comm, the debuger helps not much here since when it goes to that line it enters an assembler routine and just loops the crap out of it for who knows how long..
What is the code address of the loop? What did the linker put there? You need the linker produced map and, if possible, a complete assembly code listing.
If you wipe out the stack by bumping into something, some return address is likely to get hosed. The uC will then return to some arbitrary place that may not even exist.
Speed of execution doesn't favor floating point by at least an order of magnitude in execution time. Maybe you app won't be impacted.
I almost never use floats and I try to avoid GCCs printf() because it brings along a requirement for a heap and I want to avoid malloc() at all possible costs. I copy my conversion routines from Kernighan & Ritchie "The C Programming Language" and avoid using library functions.
The memory is usually laid out from low to higher addresses as initialized variables, followed by allocated non-initialized variables, followed by the heap (grows toward high memory) and finally, the stack (grows from high memory toward low memory. You don't use the heap directly but there is a bunch of library code that does. Function arguments, function return values, function local variables and return addresses are kept on the stack. You don't have much to do with stack growth.
I would take every opportunity to get rid of the floating point. It will reduce your code size substantially and probably help with stack and heap usage. Besides, integer arithmetic is faster by an order of magnitude (just guessing).
If x is a float, you can't get an exact comparison as in 'if (x == 3.0) { }' because the computer can't represent 3.0 perfectly. Sometimes you have to do something like 'if (abs(x - 3.0) < epsilon) {}' where epsilon is some small value like 1.0e-6 (varies depending on how many significant digits your floating point library carries). It's a 'close enough' approximation that x is equal to 3.0.