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

Firmware and application cohabitation on the same device

Hello,

I would like to create a firmware and an application running on the same device.

The application needs to call some functions of the firmware. The application can be updated whereas the firmware is still the same.

Therefore, i want to have 2 projects: one for the firmware (C coded) and one for the application (C coded).

I have seen that it's possible to forbid idata, xdata and code area in order to prevent the application to overwrite the firmware and its variables, but I have no clues on how to give my firmware prototype to my application.
Of course parameters and functions' addresses must map with the firmware mapping.

Does anyone have an idea how I can do this?

Thanks for your help!
Damien.

Parents Reply Children
  • I'm sorry, I don't understand "Please read the manual as to how".

    Does it mean "Read the manual to know how reentrant function works, please"?

    Then I'm sorry to disappoint you, but I did. From this article http://www.keil.com/support/docs/1854.htm , I understand that normal function use _DATA_GROUP_ for local variables.

    From this article: http://www.keil.com/support/man/docs/c51/c51_le_reentrantfuncs.htm
    Reentrant directive inform the compiler/linker to not use _DATA_GROUP_ but a separate stack (XDATA for me, because I use LARGE model).

    So I thought that if I declare two different _DATA_GROUP_, one for my firmware, and one for my application, I don't need reentrant functions. Let me explain:

    FIRMWARE

    void BBfunc1(void)
    (
       U8 bvar1;
       U16 bvar2;
    }
    


    APPLICATION

    void main (void)
    {
       U8 var1;
       U16 var2;
    
          BBfunc1()
    }
    

    I specify the _XDATA_GROUP_ (LARGE model) for application at 0xEC00

    _XDATA_GROUP_ for the firmware is placed by the linker, I do not give any specification: 0x1800 is the address of the _XDATA_GROUP_ of the firmware.

    Once complied/linked, I'll have:
    FIRMWARE

    SEGMENT                          XDATA_GROUP
      +--> CALLED SEGMENT          START    LENGTH
    ----------------------------------------------
    ?PR?BBFUNCT1?FIRMWARE_FUNC     1808H    0006H
    
    


    APPLICATION

    SEGMENT                          XDATA_GROUP
      +--> CALLED SEGMENT          START    LENGTH
    ----------------------------------------------
    ?PR?MAIN?MAIN                  EC00H    0006H
      +--> ?PR?BBFUNCT1?FIRMWARE_FUNC
    
    


    ==> var1/var2 and bvar1/bvar2 are not located at the same address because _XDATA_GROUP_ are not located at the same address.

    ==> Do I still need reentrant functions?? I don't think so. Am I wrong?

    Damien.

  • I just read up on reentrant (which I never have or would use) and saw the thing about 'stack location'. I, incorrectly, assumed it was like it was once (passing parametres on the internal st6ack) MY BAD.

    Now, for your thingy you need contact Keil support (since you use allmost 64k, you must have a license) and find out how to avoid having separate stack pointers.

    Erik