| ||||||||
Technical Support On-Line Manuals BL51 User's Guide | The Call TreeThe best way to demonstrate how the call tree is generates is with an example. Based on the following program flowchart, the startup code calls the main C function which subsequently calls func_a, func_b, and func_c sequentially. The functions call no other routines in our program.
The arguments and local variables of func_a, func_b, and func_c meet the rules listed in the Theory of Operation and, therefore, may be overlaid. The source code for this flowchart is as follows:
char func_a (char arg1, char arg2, char arg3)
{
return (arg1+arg2+arg3);
}
int func_b (int arg1, int arg2, int arg3)
{
return (arg1+arg2+arg3);
}
long func_c (long arg1, long arg2, long arg3)
{
return (arg1+arg2+arg3);
}
void main (void)
{
char var_a;
int var_b;
long var_c;
var_a = func_a(1,2,3);
var_b = func_b(1,2,3);
var_c = func_c(1,2,3);
while (1);
}
When the program is linked, the linker generates a call tree which it outputs to the map file. FUNCTION/MODULE BIT_GROUP DATA_GROUP --> CALLED FUNCTION/MODULE START STOP START STOP ==================================================== ?C_C51STARTUP ----- ----- ----- ----- +--> ?PR?MAIN?MAIN MAIN/MAIN ----- ----- 0008H 000EH +--> ?PR?FUNC_A?MAIN +--> ?PR?FUNC_B?MAIN +--> ?PR?FUNC_C?MAIN FUNC_A/MAIN ----- ----- 000FH 0011H FUNC_B/MAIN ----- ----- 000FH 0014H FUNC_C/MAIN ----- ----- 000FH 001AH Based on the call tree, the linker reserves the memory used by the functions' arguments and local variables. The linker creates several special Overlay Groups (BIT_GROUP, DATA_GROUP, and so on) that contain the overlaid segments. As you can see from the call tree above, the DATA_GROUP for func_a, func_b, and func_c starts at 000Fh. This shows that the linker believes the arguments and variables for these functions may be safely overlaid. Refer to the memory map for the memory range used by the _DATA_GROUP_. START STOP LENGTH ALIGN RELOC MEMORY CLASS SEGMENT NAME ========================================================================= * * * * * * * * * * * D A T A M E M O R Y * * * * * * * * * * * * * 000000H 000007H 000008H --- AT.. DATA "REG BANK 0" 000008H 00001AH 000013H BYTE UNIT DATA _DATA_GROUP_ 00001BH 00001BH 000001H BYTE UNIT IDATA ?STACK Note
| |||||||
| ||||||||