Hello ALL! I would ask the next question... according http://www.keil.com/support/docs/2379.htm one must manually remove the reference between func2 and the ?CO?EXAMPLE1 segment and add MAIN ! FUNC2 reference between MAIN and FUNC2. But from App129 if I define code void (*func_array[])() = { func2 }; with the storing table in code space, I will get the correct call tree. Now is a question: if I would not make this overlay command like sad in the http://www.keil.com/support/docs/2379.htm bl51 EXAMPLE1.OBJ IX OVERLAY & (?CO?EXAMPLE1 ~ FUNC2, MAIN ! FUNC2) would I have any problem? How I understood it's harmless because there are no actual recursive calls in the code, just a reference from one item in the constant segment to another. Could somebody please make it a little bit more clear for me? Thank you very much, A.
ok. Thank you very much! Since I have not seen your program, I do not know if it will fail or if it will run as designed. I've just discussed the ex. code void func1 (unsigned char *msg) { ; } void func2 (void) { int b = 4; int c = 5; func1("xxxxxxxxxxxxxxx"); } code void (*func_array[])() = { func2 }; void main (void) { int a = 5; (*func_array[0])(); } I've added some variables for the test ... The map looks like OVERLAY MAP OF MODULE: HELLO (HELLO) SEGMENT DATA_GROUP +--> CALLED SEGMENT START LENGTH ---------------------------------------------- ?C_C51STARTUP ----- ----- +--> ?PR?MAIN?HELLO ?PR?MAIN?HELLO 0008H 0002H +--> ?CO?HELLO ?CO?HELLO ----- ----- +--> ?PR?FUNC2?HELLO BL51 BANKED LINKER/LOCATER V5.12 05/04/2005 08:33:13 PAGE 2 ?PR?FUNC2?HELLO 000AH 0004H +--> ?PR?_FUNC1?HELLO ?PR?_FUNC1?HELLO 000EH 0003H You see there is no any problem here(only this warning). May be this ex. http://www.keil.com/support/docs/2379.htm is not good for this sort of problems. It would be very interesting to see how this code can fail(without big changes and with function pointers table stored in the code space )... With best regards, A.
It would be very interesting to see how this code can fail(without big changes and with function pointers table stored in the code space )... Very well. The following code (which is a very slight modification of yours) generates the exact same warning and call tree.
void func1 (unsigned char *msg); void func2 (void); code void (*func_array[])() = { func2, }; void func1 (unsigned char *msg) { ; } void func2 (void) { int b = 4; int c = 5; (*func_array[0])(); func1("xxxxxxxxxxxxxxx"); } void main (void) { int a = 5; (*func_array[0])(); while (1); }
Jon, ok, but in this case you have a real recursion(the function calls itself, what I wanted avoid in case if I don't use overlay) and the only one way to make this program running is using of reentrant functions. With best regards, A.