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.
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.
If I specify a new zone for my application's global variable (_IBIT_GROUP_, _DATA_GROUP_, _IDATA_GROUP_, _XDATA_GROUP_), then I don't need to define them as reentrant? you define functions as reentrant Please read the manual as to how.
Erik
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
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.