This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Mixed mode programming

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 ?

Parents
  • "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

Reply
  • "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

Children
No data