keil c51 编程
来源:互联网 发布:2017黑马java培训视频 编辑:程序博客网 时间:2024/04/29 03:40
一些c51编程技巧及原理
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实际的调用关系
0 0
- Keil C51编程工具
- keil c51 编程
- keil C51模块化编程经验总结
- KEIL C51高级编程之二
- Keil C51编程几个有用的模块
- Keil C51编程问题锦集
- Keil C51高级编程(转帖)
- C51:Keil c51指针变量
- 单片机Keil C51编程心得,用时间换来的教训!
- Keil的C51编程遇到莫名其妙的问题
- KeilC51使用详解 :第四章 Keil C51高级编程
- keil C51语言编程如何缩减编译代码长度
- keil C51语言编程如何缩减编译代码长度
- keil c51问答
- keil c51 可重如问题
- Keil C51库函数参考
- 学习心得之keil C51
- keil c51 拓展关键字
- 迎接新的时代——读《工业4.0时代,怎样为孩子筹备未来的教育?》有感
- 19.UISegmentedControl(分段按钮)
- Git的使用-生成密钥
- 360护心镜:XSS攻击与前端主动防御解决方案
- Apache Camel配置SSL的rest
- keil c51 编程
- Swift中枚举enum讲解
- 「喵神成长史」『布局篇』GridLayout(网格布局)
- valueForkeyPath方法使用
- linux 更新gcc 4.9.3
- POJ3254 Corn Fields (状态压缩DP)
- LeetCode78——Subsets
- kafka详解三:开发Kafka应用
- 你妈炸了