I have developed a small Single Board computer, with a few customizations..
I am well versed in Assembly programming for 8052, but not for C. I have written driver functions for the devices on the board in assembly and this "BIOS" will be burned in the on-chip 20KB (89c55) eeprom as a simple monitor program. Upon startup, it will initialize some variables, a custom protocol stack and then jump to user program rom (at 8000h) address.
I want to write user codes in C, but in SMALL and / or COMPACT modes, since C uses the internal data ram for stack and other variables, this might clash with the BIOS variables that are at fixed internal-ram addresses.
Secondly, the BIOS program will initialize stack to reside in the extra 128-bytes ram (80h and above) while it is not certain where C will put the stack to start at.
Can anyone guide me as to how this situation can be avoided ?
"the custom protocol stack wont be called by the User C code... it would send teh packet data to the BIOS functions by wrapper functions, which would actually do the transmitting."
Do you mean that some interrupt summons up your BIOS from the user's C code, and just the variables are exposed to the user's code as the common resource?
Then provide a library, in which the common variables are declared on absolute address using _at_ keyword.
If you don't like to expose some variables, but ensure the address, declare it as static variables in the library file.
For example,
volatile unsigned char idata bios_flag _at_ 0x80; // exposed to users static unsigned char idata reserved_area[15] _at_ 0x81; // not exposed
Absolute Variable Location http://www.keil.com/support/man/docs/c51/c51_le_absvarloc.htm
In this way, you can ensure the BIOS variables without any linker directive, like IDATA.
Tsuneo