keil c51 编程
2015-11-17 21:34
274 查看
一些c51编程技巧及原理
compact 所有未明确说明存储区域的变量和重入堆栈默认保存在pdata区,总容量为256B。
large 所有未明确说明存储区域的变量和重入堆栈默认保存在xdata区,总容量为64KB。
片内存储区寻址空间
data 片内RAM的00-7FH
idata 片内RAM的00-FFH
bdata 片内RAM的20-2FH
片外存储区寻址空间
pdata 片外RAM中的某一页(256B)
xdata 整个片外RAM 0000H-FFFFH
压缩栈:函数参数,局部变量;由编译器分配的固定存储位置
模拟栈:“可重入栈”,专门为可重入函数开辟的模拟堆栈,目的是安排可重入函数中的字节型参数和字节型局部变量
同理,不可递归。
解决:
- 函数指针指向函数不使用内存,仅用寄存器
- 使用reentrant关键字修饰函数,并在startup.a51中初始化可重入栈
- 通知linker实际的调用关系
c51 的编译模式
small 所有未明确说明存储区域的变量和重入堆栈默认保存在data区,总容量为128B。compact 所有未明确说明存储区域的变量和重入堆栈默认保存在pdata区,总容量为256B。
large 所有未明确说明存储区域的变量和重入堆栈默认保存在xdata区,总容量为64KB。
片内存储区寻址空间
data 片内RAM的00-7FH
idata 片内RAM的00-FFH
bdata 片内RAM的20-2FH
片外存储区寻址空间
pdata 片外RAM中的某一页(256B)
xdata 整个片外RAM 0000H-FFFFH
栈
硬堆栈:由SP指针和PUSH/POP指令支持的系统堆栈,位于data区,由低向高地址生长。在编译器对全部data变量完成分配之后,紧接着安排的是硬堆栈压缩栈:函数参数,局部变量;由编译器分配的固定存储位置
模拟栈:“可重入栈”,专门为可重入函数开辟的模拟堆栈,目的是安排可重入函数中的字节型参数和字节型局部变量
可重入
在标准C中,函数默认是可重入的,这是因为它的堆栈空间很大。51单片机的理论堆栈空间最大不超过128B/256B。在C51中,函数参数和函数中的局部变量除了一部分用寄存器来传递或分配在寄存中外,其他都是保存在编译器所分配的固定地址(压缩栈??),所以C51默认是不可重入的。可重入函数需显示声明。同理,不可递归。
keil中函数指针
编译器无法判断函数的调用。因为ram分配采用overlay方法,若指针在中断或递归调用中会发生问题。解决:
- 函数指针指向函数不使用内存,仅用寄存器
- 使用reentrant关键字修饰函数,并在startup.a51中初始化可重入栈
- 通知linker实际的调用关系
相关文章推荐
- 将《Android应用开发揭秘》例子源码添加进Eclipse
- python 模块化管理,导入自己的模块(包)
- Java Web开发环境配置
- 用Maven插件生成Mybatis代码
- SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)
- Qt从零开始制作串口调试助手-(第九章、串口读数据实现)-Creator_Ly
- Java创建字符串是用“”还是用构造器?
- 单例实现代码(懒汉式)
- delphi 窗体自适应屏幕分辨率
- 第一章c语言概述
- web监控:zabbix自动发现+python之pycur模块对网站访问质量监控
- 二叉树的实现Java版本
- Android eclipse 常见的小问题
- Java实现最简单局域网QQ
- 【持久化框架】SpringMVC+Spring4+Mybatis3集成,开发简单Web项目+源码下载
- java 在MySQL中存储文件,读取文件(包括图片,word文档,excel表格,ppt,zip文件等)
- python多线程编程
- 5.1.2 timedelta对象
- String(C++)
- C/C++笔试面试题目