8051存储区布局

Intel 8051 memory介绍:
8051具有4K的片上ROM,128字节的片上RAM,同时它具有64K的寻址能力,也就是可以扩展程序存储空间和数据存储空间多达64K。

1. 程序存储空间
8051有4K的片上ROM,该区域是只读的,在sdcc中,可以使用关键字__code将变量存储在该区域中,例如:
__code unsigned char test_code;

2. 数据存储空间
8051具有128字节的片上RAM,而128字节又由以下几部分组成:
1)寄存器组
寄存器组总共32字节,分为四组,每一组对应R0~R7,具体使用哪一组由寄存器PSW的RS1和RS0决定。
2)位寻址区
该区域占16字节共128位,位地址范围为0x00~0x7F。定义在该区域的变量值能有0或1两个值,如果要将变量定义在该区域中,可以使用sdcc中的__bit关键字,例如:
__bit test_bit;
3)通用的RAM
该区域占128字节中剩下的80字节。

3. 特殊功能寄存器
特殊功能寄存器位于地址范围为0x80~0xFF,8051中总共有21个特殊功能寄存器,特殊功能寄存器分布如图所示:


4. 关于特殊功能寄存器中的位地址和寄存器地址的疑惑?
可以参见这里: http://stackoverflow.com/questions/3074191/why-does-some-sfr-in-8051-are-bit-addressable
关于疑惑可以看一下头文件8051.h,P0寄存器位于0x80地址处,而后面定义的P0_0地址为0x80,P0_1地址为0x81,但是地址0x81又是寄存器SP的地址,这样那岂不是重复了?位地址其实可以分成两部分,字节地址和位编号,还是以P0为例,假设有位地址为0x87,那么字节地址为0x80,位编号为7,也就说使用setb和clr指令操作的是寄存器P0的第7位。


8052存储区布局:
8052是8051系列的一个子集,同8051有少许不同。8052片上ROM为8K,256字节的片上RAM,这256字节中前128字节同8051完全一样,同8051不同的是,高128字节可以作为通用的RAM来使用,那这样岂不是又和特殊功能寄存器地址冲突了?完全不会,这128字节只能使用间接寻址来访问,而特殊功能寄存器使用的是直接寻址,所以两者并不冲突。
那这里又涉及到变量的存储问题了:
关键字__data用于将变量存储在前128字节处,并且是直接寻址方式访问,也是操作速度最快的区域,例如:
__data unsigned char test_data;
使用Small Memory模式下变量的默认存储方式。
而关键字__idata使用间接寻址方式访问RAM,例如:
__idata unsigned char test_idata;
和__data关键字定义的变量不同的是,__idata关键字定义的变量存储区域更大,为256字节空间。
关键字__xdata则将变量存储外部RAM中,例如:
__xdata unsigned char test_xdata;
这也是使用Large Memory变量的默认存储方式。

对于使用Small Memory还是Large Memory模式可以使用命令行选项--model-small或--model-large来指定,默认为Small Memory模式。
### STM32系统存储结构 STM32基于ARM Cortex-M架构设计,在理解其存储器结构之前,有必要先了解Cortex-M内核的基础特性。Cortex-M3的地址空间总共为4GB (2^32),被划分为八个主要块,每个块大小为512MB[^3]。 #### 存储器分描述 具体到STM32而言,虽然理论上的最大寻址范围可达4GB,但实际上可用的内存远小于这个数值。STM32将这些地址映射到了不同的功能模块上: - **Flash Memory**: 主要用于存放程序代码和常量数据。通常位于较低地址间(如`0x0800_0000`),这部分域在出厂时预加载了引导装载程序。 - **System Memory**: 包含启动代码和其他一些固件组件,一般不可修改,位置固定于特定地址范围内。 - **Internal SRAM**: 提供快速访问的数据缓存,适合用来保存变量、堆栈等运行期间频繁变动的信息。SRAM的位置多设定在较高地址处(比如`0x2000_0000`附近)。 - **Peripheral Registers**: 各种外设控制寄存器分布在不同地址段中,允许CPU直接读写硬件配置参数。 - **External Devices & Memories**: 如果连接了额外的扩展设备或外部存储器件,则它们会被分配相应的物理地址以便通信交互。 ```c // 示例:初始化一段内部SRAM中的数组 volatile uint32_t myArray[100] __attribute__((section(".ram"))) = {0}; ``` 上述代码片段展示了如何显式指定一个全局数组放置于`.ram`节下,即内部SRAM域内[^2]。 --- ### 使用方法概述 为了有效地管理和利用有限的存储资源,开发者应当遵循以下原则: - 尽可能减少不必要的静态/全局变量声明; - 对大尺寸对象考虑动态分配策略; - 利用链接脚本定制化布局方案; - 避免越界访问导致非法操作异常中断等问题发生; 通过合理规划并优化应用程序对各类存储子系统的调用方式,能够显著提升整体性能表现及稳定性水平。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值