KEIL中函数的调用在其帮助文档中有一个详细的解释,引用如下:
The Call Tree
The 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 theTheory 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 specialOverlay 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
- The linker generates overlay information that is accurate. However, in some instances the default analysis of the call tree is ineffective or incorrect. This occurs with functions that are called by both the main program and an interrupt and with functions called through function pointers.
- Functions that are called by the main program root and by an interrupt service routine or functions that are called by two or more interrupts may not be overlaid.
- Functions called through pointers require special handling within the linker in order for overlaying to work properly. This topic is discussed inFunction Pointers.