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.
Hello Jon, thanks for your reply. It's everything ok what you wrote. But.. The only "problem" what we have here is just a warning. The reason for it you've just described. The call tree after storing of function pointers table in code space is completely ok. I could see it in the map file. Without overlay the program will be executed correct. And using of overlay would just lead to the clean compilation without any warning L13. May be, it's not a fine way to handle it, but in this case, I don't see any reason that the program will fail. With regards, A.
I don't see any reason that the program will fail. Most developers don't include problems in their code that they KNOW will cause the application to fail. Besides, if they did, and they KNEW that the program would fail, then they are just being irresponsible. Since I have not seen your program, I do not know if it will fail or if it will run as designed. However, I know from experience that failing to make this simple change COULD cause you unexplained problems later (when you are not focused on this issue). And, since you are building in a requirement that a warning is to be ignored you may very well be training your staff to ignore a warning that, while innocuous at this time, may not be later. So, if you don't see any benefit in removing the questionable link in the call analysis, then don't. However, that's not what Keil Software recommends. Jon
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.