STC52单片机的地址空间
51单片机的地址空间与STM32有着十分巨大的区别,在这里记录一下关于这方面的问题。本文的环境是Keil C51环境,使用STC89C52单片机。
栈空间
SP指针与指向范围
同其他单片机一样,51也有一个SP栈指针,但是**SP是向上增长的(与STM32不同),并且SP只能指向内部RAM区(256B)**,即data(128B)和idata(128B),是非常小的,在这之后是外部扩展的RAM区(xdata),STC89C52单片机中这部分区域是”逻辑上扩展,物理上一体”,其实就是把储存芯片放到了封装内部吧。
硬件栈存在的问题
我们都知道51资源少的可怜。
问题来了:当SP指向外部区后,会发送错误,重启。而内部空间在small模式下默认为变量优先存放区,但keil C51默认栈最小留1字节,当变量太多,留给栈的空间就十分的少。最后可能连进中断都会寄(进入中断需要16byte保存现场-地址和寄存器)。
模拟栈
为了减少系统栈(SP的硬件栈)的使用,Keil C51默认所有函数都是不可重入的,局部变量使用固定的内存区,和static
一样(正常都是存在栈里面的)。
当需要函数可重入时,使用 reentrant
关键字标志,此时函数的局部变量储存在一个模拟栈,该栈由编译器维护,与SP无关,因此可以存在xdata区,可以很大,后果是访问速度可能慢了(具体看这个模拟栈所在区域)。