【IoT】CC254x 中 data、idata、xdata 和 pdata 区别以及堆 Heap 内存布局

简介: CC254x单片机

1、data、idata、xdata 和 pdata 区别

从数据存储类型来说,8051 系列有片内、片外程序存储器,片内、片外数据存储器,片内程序存储器还分直接寻址区和间接寻址类型,分别对应code、data、xdata、idata以及根据51系列特点而设定的pdata类型。

使用不同的存储器,将使程序执行效率不同,在编写C51程序时,最好指定变量的存储类型,这样将有利于提高程序执行效率(此问题将在后面专门讲述)。

与ANSI-C稍有不同,它只分SAMLL、COMPACT、LARGE模式,各种不同的模式对应不同的实际硬件系统,也将有不同的编译结果。

在51系列中data,idata,xdata,pdata的区别:

1)data

固定指前面0x00-0x7f的128个RAM,可以用 acc 直接读写的,速度最快,生成的代码也最小。

2)idata

固定指前面0x00-0xff的256个RAM,其中前128和data的128完全相同,只是因为访问的方式不同。

idata 是用类似C中的指针方式 访问的。

汇编中的语句为:mox ACC,@Rx

3)xdata

外部扩展RAM,一般指外部0x0000-0xffff空间,用DPTR访问。  

4)pdata

外部扩展RAM的低256个字节,地址出现在A0-A7的上时读写,用movx ACC,@Rx读写。

程序可以简单的分为code(程序)区,和data (数据)区,code区在运行的时候是不可以更改的,data区放全局变量和临时变量,是要不断的改变的。

cpu从code区读取指令,对data区的数据进行运算处理,因此code区存储在什么介质上并不重要,code区也可以放在rom里面,也可以放在ram里面,也可以放在flash里面(但是运行速度要慢很多,主要读flash比读ram要费时间)。

因此一般的做法是要将程序放到flash里面,然后load到ram里面运行的,DATA区就没有什么选择了,肯定要放在RAM里面,放到rom里面改动不了。

2、Heap 布局

1)堆内存的大小可以通过INT_HEAP_LEN来配置;

2)可以在工程选项里定义OSALMEM_METRICS=TRUE,通过该宏使能的代码查看堆内存实时的使用情况,从而以此为指导配置出适合自己系统的堆大小;

3)如果需要详细的掌握stack里堆内存的管理细节,可以参考官方文档 Heap_Memory_Management.pdf。

示例:

INT_HEAP_LEN=3072
对于3K的大小是否适合我们的系统呢?

下面分析堆内存布局和当前系统堆内存利用率这两个方面,来进一步解答这个问题:

堆内存布局

首先,我们需要明确的是堆内存位于物理介质SRAM当中。

CC254x 是哈佛结构,代码空间与数据空间是独立寻址的。

SRAM 位于数据空间中,其映射方式下图:
20190305151447906.png

SRAM被映射到xdata space的前8K(当前所用的CC2541 SRAM大小为8K),地址范围是0x0000 - 0x1FFF。

我们的heap配置的是3K大小,那它到底位于SRAM的哪里呢?

在OSAL_Memory.c中,找到下面的代码:

static osalMemHdr_t theHeap[MAXMEMHEAP / OSALMEM_HDRSZ];
static osalMemHdr_t *ff1; // First free block in the small-block bucket
这个数组就是整个的堆内存空间,只要找到theHeap的地址就能知道对内存的地址范围。

要获取theHeap的地址最简单的方法就是查看编译后生成的.map文件。下面是我当时摘取map文件中关于theHeap的片段:

XDATA_Z
Relative segment, address: XDATA 00000A79 - 00001678 (0xc00 bytes), align: 0
Segment part 7. Intra module refs: osal_mem_alloc

                                              osal_mem_init
      LOCAL                   ADDRESS         
      =====                   =======         
      theHeap                 00000A79

十六进制的0xc00等于3072,刚好是我们配置的堆内存大小,其地址范围是0x0A79 - 0x1678。

到目前就知道了如下两点:

heap位于ram当中;

heap的地址范围是0x0A79 - 0x1678,这个范围在每次修改程序后都有可能改变;

卫朋

人人都是产品经理受邀专栏作家,CSDN 嵌入式领域新星创作者、资深技术博主。2020 年 8 月开始写产品相关内容,截至目前,人人都是产品经理单渠道阅读 56 万+,鸟哥笔记单渠道阅读200 万+,CSDN 单渠道阅读 210 万+,51CTO单渠道阅读 180 万+。

卫朋入围2021/2022年人人都是产品经理平台年度作者,光环国际学习社区首批原创者、知识合作伙伴,商业新知 2021 年度产品十佳创作者,腾讯调研云2022年达人榜第三名。

文章被人人都是产品经理、CSDN、华为云、运营派、产品壹佰、鸟哥笔记、光环国际、商业新知、腾讯调研云等头部垂直类媒体转载。文章见仁见智,各位看官可策略性选择对于自己有用的部分。

相关文章
|
缓存 Prometheus 监控
Elasticsearch集群JVM调优设置合适的堆内存大小
Elasticsearch集群JVM调优设置合适的堆内存大小
2502 1
|
存储 编译器 程序员
【C语言】内存布局大揭秘 ! -《堆、栈和你从未听说过的内存角落》
在C语言中,内存布局是程序运行时非常重要的概念。内存布局直接影响程序的性能、稳定性和安全性。理解C程序的内存布局,有助于编写更高效和可靠的代码。本文将详细介绍C程序的内存布局,包括代码段、数据段、堆、栈等部分,并提供相关的示例和应用。
693 5
【C语言】内存布局大揭秘 ! -《堆、栈和你从未听说过的内存角落》
|
算法 Java
堆内存分配策略解密
本文深入探讨了Java虚拟机中堆内存的分配策略,包括新生代(Eden区和Survivor区)与老年代的分配机制。新生代对象优先分配在Eden区,当空间不足时执行Minor GC并将存活对象移至Survivor区;老年代则用于存放长期存活或大对象,避免频繁内存拷贝。通过动态对象年龄判定优化晋升策略,并介绍Full GC触发条件。理解这些策略有助于提高程序性能和稳定性。
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
1119 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
机器学习/深度学习 人工智能 缓存
【AI系统】推理内存布局
本文介绍了CPU和GPU的基础内存知识,NCHWX内存排布格式,以及MNN推理引擎如何通过数据内存重新排布进行内核优化,特别是针对WinoGrad卷积计算的优化方法,通过NC4HW4数据格式重排,有效利用了SIMD指令集特性,减少了cache miss,提高了计算效率。
608 3
|
存储 算法 Java
Java 内存管理与优化:掌控堆与栈,雕琢高效代码
Java内存管理与优化是提升程序性能的关键。掌握堆与栈的运作机制,学习如何有效管理内存资源,雕琢出更加高效的代码,是每个Java开发者必备的技能。
374 5
|
传感器 监控 物联网
M2M 和 IoT 有什么区别
M2M(Machine to Machine)和IoT(Internet of Things)都涉及设备间的通信,但M2M通常指通过有线或无线网络直接连接的设备间通信,而IoT则是一个更广泛的概念,强调设备、传感器等通过互联网连接并交换数据,实现智能化管理和控制。
|
缓存 Java 测试技术
谷粒商城笔记+踩坑(11)——性能压测和调优,JMeter压力测试+jvisualvm监控性能+资源动静分离+修改堆内存
使用JMeter对项目各个接口进行压力测试,并对前端进行动静分离优化,优化三级分类查询接口的性能
839 10
谷粒商城笔记+踩坑(11)——性能压测和调优,JMeter压力测试+jvisualvm监控性能+资源动静分离+修改堆内存
|
传感器 监控 供应链
IoT 和 IIoT 有什么区别
IoT(物联网)是指通过互联网连接各种日常设备,实现数据交换和远程控制的技术。而IIoT(工业物联网)则是专为工业领域设计的IoT,强调在制造业、能源等行业的应用,注重提高生产效率、优化流程和增强安全性。两者主要区别在于应用场景和目标不同。
|
算法 Java
JVM进阶调优系列(3)堆内存的对象什么时候被回收?
堆对象的生命周期是咋样的?什么时候被回收,回收前又如何流转?具体又是被如何回收?今天重点讲对象GC,看完这篇就全都明白了。

热门文章

最新文章