We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
Hi Ken, I understand that the 8051 has 256 bytes of internal data. Well, after declaring variables and array's, I get the error
*** ERROR 107: ADDRESS SPACE OVERFLOW SPACE: DATA SEGMENT: _DATA_GROUP_ LENGTH: 0062H Target not created
GetMACInput(strSrcDest); printf("MAC Address......... "); printf("%02X:", strSrcDest->SrcMAC1 >> 8); printf("%02X:", strSrcDest->SrcMAC1 & 0x00FF); printf("%02X:", strSrcDest->SrcMAC2 >> 8); printf("%02X:", strSrcDest->SrcMAC2 & 0x00FF); printf("%02X:", strSrcDest->SrcMAC3 >> 8); printf("%02X", strSrcDest->SrcMAC3 & 0x00FF); printf("\r\n");
"Am I to understand that I don't necessarily have access to the entire 256 bytes, but less than 256 bytes due to Stack Size/ Nesting and interrupt context saving?" Yes, at a minimum, a single register bank is used consuming 8 bytes (addresses 0x00-0x07) out of the 256, your "data" consumes whatever it does out of the address range 0x08-0x7F, your "idata" consumes whatever it does out of the address range 0x08-0xFF (starting where "data" ends), and finally the stack gets any bytes remaining from the end of "idata" up to 0x100 (assuming you have not specified any functions to be reentrant). "I am not sure what you mean by after idata? I suspect the Stack is being saved in Ram, limiting the size of ram." Yes, see above. By convention, C runtime startup initializes the stack pointer with the address of the last byte of "data", or in your case "idata", memory used. "I guess what you mean by Function returns and stack size is something like this... Function0(){ Function1() } Function1(){ Function2() } Function3(){ Function4() } Function5(){ Function6() } Function7(){ Function8() } I am curious about Function calls and the space required. Do the nested Functions require Ram Space?" A function call pushes a 2-byte return address on the stack. Using your example, the last function is nested 10 function calls deep = 10 PC saves = 20 bytes of stack used. Plus any additional stack used by library calls in Function8(). Plus any processor context saved when that library routine gets interrupted... You get the idea. You've got to account for the stack space required for the worst case. "Is there a difference between void Func1() and int Func1()?" Not as far as the stack is concerned (assuming a non-reentrant model). "I'm not exactly sure what interrupt context means." Sorry, I probably should have said processor context saved (and restored) by the interrupt service routine. The 8051 hardware itself pushes the program counter on the stack during the ISR "call" process. ISR prolog (context save) and epilog (context restore) code handles safely saving and restoring the processor context to the state it was before the interrupt for those processor resources that the ISR uses (e.g., usually ACC and PSW, possibly some of R0-7, etc., depending on your ISR). This processor context is saved on the stack in addition to the PC. "I wish the compiler would have complained." The compiler/linker does not necessarily know how much stack you'll need. As a side note, you would be well-advised to better understand the 8051 architecture, since the architecture plays a big part in the effective use of C on this microcontroller that was never designed with C in mind.
Function0(){ Function1() } Function1(){ Function2() } Function3(){ Function4() } Function5(){ Function6() } Function7(){ Function8() }