i am not sure if the stack is overflow in my project. thank a lot!
Even if you don't notice problems you always should have an idea about stack usage, it is the only way to rely on your program. The used stack is a dynamic characteristic so you only get this information at execution time. I will assume large memory model... The first step is determine the maximum available stack, you can get this value from map file, look for STACK keyword, for example: IDATA 0030H 0001H UNIT STACK The space between 30H and the end of internal memory (128 or 256 bytes)will be your available stack. 1/ Firts option is manual calculation: determine the function call tree and add 2 bytes per call (5 bytes if you use interbank function call). In addition add the stack usage of ISR (more calls and push/pop instructions) 2/Other option is directly read the SP value at the deepest points of your call function tree. You can estimate the risks. 3/ A third option, that a friend touch, me is very interesting. You have to initialise the IDATA with a known value "0x55". Later, at any point of ccall function tree, you can scan the idata and determine where the 0x55 appears and so the unused stack. This method even determine the stack usage of ISR (typically more complicate) This last method is still more powerfull... If you get a crash or a reset (perhaps you have a watchdog) and in systems where there is no RAM initialisation you can at start up take the "photo" of the crash and determine the stack usage. I hope all this useful for you. Thanks
Thanks very much, but why keil c51 don't check the overflow of stack(or i don't find it)? Any difficult there to realize this point? thanks again!
why keil c51 don't check the overflow of stack And, what exactly should the compiler do if there IS a stack overflow? Jon
I think keil c should give us a warnning at least. because: 1. it can locate the start address of stack; 2. it can output the call tree( in *.m51); 3. the compiler certainly knows operations of push and pop instructions(except programmer's assemble code). so, keil c51 can get the deepest(include interrupt routine) stack length and should warn us the risk of stack overflow. welcome to give advice or comments. thanx!
I agree. If the compiler/linker could work together to print out a max known stack usage for each branch of the overlay map, I would know the exact amout of bytes I could throw over to my communication buffers.
View all questions in Keil forum