data的使用在Keil C51中有一点特殊,链接器会进行覆盖分析。

BL51: HOW DOES OVERLAY ANALYSIS WORK?

Information in this article applies to:

* C51 Version 5.50a

* C51 Version 6.10a

QUESTION

How does overlay analysis work in the C51 tools?

ANSWER

The C51 tools are designed to make optimal use of the limited memory resources of the 8051 microcontroller.

To provide the most efficient use of memory, automatic variables and function arguments are overlaid in memory according to a well-defined procedure.

First, the linker builds a call tree of your program. For example:

OVERLAY MAP OF MODULE:   SAMPLE (SAMPLE)

SEGMENT                          DATA_GROUP

+--> CALLED SEGMENT          START    LENGTH

----------------------------------------------

?C_C51STARTUP                  -----    -----

+--> ?PR?MAIN?SAMPLE

?PR?MAIN?SAMPLE                0009H    0001H

+--> ?PR?GETCHAR?GETCHAR

+--> ?PR?_TOUPPER?TOUPPER

+--> ?PR?PUTCHAR?PUTCHAR

?PR?GETCHAR?GETCHAR            -----    -----

+--> ?PR?_GETKEY?_GETKEY

+--> ?PR?PUTCHAR?PUTCHAR

This table is built by analyzing the references within a function to program segments (?PR?) and constant code segments (?CO?).

In this example, you can see that ?C_C51STARTUP references (calls) the MAIN function. The MAIN function references (calls) GETCHAR, TOUPPER, and PUTCHAR. And GETCHAR references (calls) GETKEY and PUTCHAR.

By building a call tree, the linker can figure out which data segments for which functions are mutually exclusive and can overlay them.

For example, suppose that the MAIN C function calls function A, function B, and function C. Function A uses 10 bytes of automatic variables. Function B uses 20 bytes of automatic variables. And, function C uses 16 bytes of automatic variables. Assuming that functions A, B, and C do not call each other, the memory they use may be overlaid. So, rather than taking 46 bytes of data memory (10 for A + 20 for B + 16 for C) only 20 bytes of data memory are consumed.

The overlaid memory is called DATA_GROUP (for the DATA space variables that are overlaid), BIT_GROUP (for the BIT space variables that are overlaid), and XDATA_GROUP (for the XDATA space variables that are overlaid).

MORE INFORMATION

* Refer to OVERLAY in the LX51 User's Guide.

* Refer to Listing (MAP) File in the LX51 User's Guide.

SEE ALSO

* BL51: WHAT ARE _DATA_GROUP_ AND _BIT_GROUP_?

* BL51: WHAT IS THE _XDATA_GROUP?

* BL51: WARNING 15 (MULTIPLE CALL TO SEGMENT)

* C51: PROBLEMS WITH FUNCTION POINTERS OVERWRITING VARIABLES

* BL51: WARNING 11 (CANNOT FIND SEGMENT OR FUNCTION NAME)

以上信息的出处:BL51: HOW DOES OVERLAY ANALYSIS WORK?

keil 函数最多可以传几个参数_Keil C51中如何让一个函数返回多个值?我把数组指针传入函数中,但发现编译后DATA区会随...相关推荐

  1. keil 函数最多可以传几个参数_007 函数进阶,来做一次比较正式的作业

    这节课开始之前,先来解决一个小问题.最近这两节课,有人对缩进的规则不太理解,这里解释一下. 如上图所示,相同的缩进代表同一个代码块,即同一个顺序执行代码段落.如果代码缩进减少,则说明当前代码块结束,如 ...

  2. 数组指针、函数指针与函数指针数组

    指针知识梳理 一.字符指针 二.数组指针 三.函数指针与函数指针数组 1.指针函数 2.函数指针 区别 3.函数指针数组 4.指向函数指针数组的指针 四.回调函数 一.字符指针 指向字符型数据的指针变 ...

  3. java函数返回多个值_深入理解被调函数与主调函数之间的传值、传址、值返回、址返回...

    函数的英文是function,有功能的意思,函数的作用在于合理分配功能,增强程序的可读性.合理分解功能,降低程序的复杂性.隐藏函数内部的数据和实现,尽可能将问题局限于函数本身. 函数可以理解为一种功能 ...

  4. C++基础8【难】 回顾:数组指针,函数指针,函数指针做函数参数 C语言多态

    1,数组指针语法梳理 回顾,如何定义数组数据类型: 回顾,如何定义指针类型数组: 回顾,如何直接定义 一个指向数组类型的指针: 2,函数指针语法梳理 1)如何定义一个函数类型 2)如何定义一个函数指针 ...

  5. 指针数组,数组指针,函数指针,main函数实质,二重指针,函数指针作为参数,泛型函数

     1.指针数组 数组里面的每个元素都是指针. 指针数组的案例如下: 易犯错误: 2.数组指针 归根结底还是指针,只是取*的时候能够取出一整个数组出来. 数组指针:(一个指针指向了数组,一般和二维数 ...

  6. c语言函数的参数是结构变量,何去运用结构体变量和结构的变量的指针作为函数的参数...

    在C语言中我们如何去运用结构体变量和结构的变量的指针作为函数的参数呢,其实我们对于结构体的变量是有一定的了解的,他们就是将一个结构体变量的值传递给另外一个函数,那么这种有三种方法,希望大家都能够了解一 ...

  7. C语言基础之判断字符类型、字符串的数值转换、串长比较、数组指针、函数参数

    不是什么文档,也不是教程,只是监督自己打卡学习C语言,记录的只是自己一些小笔记.如有错处,十分感谢您指出!!! 一.判断字符类型 #include<ctype.h>,isdigit()- ...

  8. C 语言结构体数组指针以及函数

    结构体数组指针 指针变量可以指向一个结构体数组,这时指针变量的值是整个数组的首地址. 设 ps 为指向结构体数组的指针变量,则 ps 也指向该结构体数组的第 0个元素,ps+1 指向第一个元素,ps+ ...

  9. 指针数组,数组指针,函数指针,函数指针数组 ,指向函数指针数组的指针

    首先有个问题:指针和数组有什么关系呢? 答案:什么关系都没有. 指针就是指针,在32位平台下,永远占4个字节,其值为某一个内存的地址. 数组就是数组,其大小与元素的类型和个数有关.定义数组时必须指定其 ...

  10. 详解指针数组、数组指针、函数指针

    目录 指针数组 数组指针 函数指针 总结 指针数组 首先要明确指针数组是数组而不是指针,是一个存放指针的数组. 数组里面存放的都是地址 声明一个指针数组的方式是 int* arr1[5]; //整形指 ...

最新文章

  1. php多态的实际运用,7.9.1 PHP多态的应用实例
  2. Python从头/尾删除子符串的正确操作
  3. [bzoj3131]淘金[sdoi2013][数位DP]
  4. SharePoint 2013 InfoPath 无法保存下列表单
  5. 单片机的Bootloader,可以实现用户轻松升级程序
  6. 解析Linux内核模块的链接顺序
  7. Windbg 查看SSDT表
  8. 彻底理解ThreadLocal(转)
  9. 台式电脑开机一直卡在正在启动windows怎么办
  10. 可依简易无需数据库影视源码
  11. Win7下使用建行捷德U盾支付
  12. 关于常用第三方统计平台比较
  13. nova云主机evacuate简单分析
  14. 关于中宣部实名认证过程中的一些问题和解答
  15. P124黎曼可积性刻画 的两个备注
  16. 网上商城SSH三者间的牵线
  17. 【JS学习】数组过滤方法的使用filter
  18. Win7系统组策略怎么打开 打开组策略的几种方法
  19. conda 环境导入导出 yaml
  20. 超鸿蒙混希夷的翻译,对《愚溪诗序》一处译文的思考

热门文章

  1. [Unity] 3D数学基础 - 2D旋转矩阵
  2. SRM 403(1-250pt, 1-500pt)
  3. [转]Using Named Pipes (FIFOs) with Bash
  4. WP7 页面事件触发顺序测试
  5. 《MySQL必知必会》学习笔记——第六章(过滤数据)
  6. 【java与智能设备】单选框 复选框 监听事件
  7. 计算机c盘要满了电脑会卡吗,C盘满了 电脑卡顿了,怎么清理空间
  8. jquery 元素第二个_jQuery知识总结
  9. ffplay拿不到rtp流_苇名城都亡了,还跟我讲科学?- 苇名无心流秘籍解析
  10. apollo @value没生效_有Apollo,还用Archaius吗?