指令集架构
51芯片是指集成51内核(51架构,免费的)的芯片
51内核 == 51指令集 == 51架构
独立编址
存储器架构
冯诺依曼结构(在内存里,程序指令储存和数据储存不分开的存储器结构)
内存分类及硬件对内存的管理
内部RAM的低128位(00-7F)
对应C语言,关键字为data或者idata(二选一)
比如我定义一个变量,data unsigned char Var = 0;那么,这个 Var变量就是放在内部的低128位Ram中
内部RAM的高128位(80-FF)
对应C语言,关键字为idata
比如我定义一个变量,idata unsigned char Var = 0;那么,这个 Var变量就是放在内部的高128位Ram中
特殊功能寄存器(SFR)(80-FF)
对应C语言,关键字为Sfr
比如我定义一个变量,Sfr unsigned char Var = 0x90;那么,这个 Var变量就是放在内部的特殊功能寄存器中,这是你对Var操作,相当于操作一个特殊的寄存器,但是小心,不能随便定义Sfr变量,很危险
外部RAM 64K(0000-00FF)
对应C语言,关键字为pdata或者xdata(二选一)
第一页(前256字节)可以用pdata或xdata修饰(用pdata修饰比较好)
外部RAM 64K(0000-FFFF)
对应C语言,关键字为xdata
第一页之外的只能用xdata修饰
片内和片外的地址是重复的(重复地址为00-FF)
例如0x80 地址存在于
内部RAM的高128位
用指令,如果是直接寻址,那么访问的就是SFR
特殊功能寄存器
如果是R0或者R1间接寻址,就是内部高128位RAM
外部RAM
如果是DPTR或者是R0,R1间接寻址,且配合的是MovX指令
软件对内存的管理
内部RAM的低128位(00-7F)
1. 寄存器,地址从0000H到001FH,共32字节 .
2. 可按位访问区域,地址从0020H到002FH,共16字节
3. 只能按字节访问区域,地址从0030H到007FH,共80字节
软件管理的内存是两部分:第二部分和第三部分,共96字节。由于其他两部分是固定部分,我们不对其进行管理。
管理方式:
1. 栈
用于调用C函数
2. 堆
用于管理数据
用关键字对变量地址的控制是属于硬件还是软件对内存的管理?
是硬件对内存的管理
硬件总要给用户提供一个方法用于寻址一个具体的内存地址.而这个寻址地址的方法被编译器封装为关键字.
所以说从本质上来说还是硬件给的管理接口.
------------------------------------对 STARTUPA.51 进行分析
?STACK SEGMENT IDATA
RSEG ?STACK
DS 1
MOV SP,#?STACK-1
栈底指针?STACK 由C51自动生成,栈顶应该是IDATA顶端——0xFF
系统堆栈深度 为 0xFF-(?STACK)。
[51栈的安全(精确)设置](http://www.eepw.com.cn/article/201611/322595.htm)
STARTUPA.51 中没有对堆的管理,所以说,作为用户可以定制 堆的初始化 及 malloc 及 free
堆的初始化
一般在 片内ram(00-FF) 或者 片外ram(00-FFFF)
malloc
常规malloc,可在internet搜索怎么实现堆
free
常规free
其他 FLASH
程序存储器(包括片内Flash或Rom,也包括片外Flash或Rom)
C语言用Code定义