KEIL C51 Call Tree

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.

KEIL C51 Call Tree

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.
上一篇:本机不安装Oracle客户端,使用PL/SQL Developer连接远程数据库


下一篇:安卓 Context 和 Application的关系