从RDA5981A/B/C编译后map文件和datasheet分析内存分配情况

article/2025/10/5 19:39:30

先查看RDA5981的datasheet,

如下图,RDA5981芯片内部有三个RAM区域, I_SRAM,D_SRAM,I_cache, 还可以外挂PSRAM,

内存映射图解释:

 

在编译目录BUILD\UNO_81C\GCC_ARM\找到*.map文件, 可以搜索到如下地址情况:

.data            0x00100080
.bss              0x001017a8
.stack             0x0011f3d0      0x800

对照datasheet,这些地址 .data .bss .stack 编译后,都分布在I_SRAM,

.heap             0x00180000 0x28000 

对照datasheet,的上面内存分布图, 这个地址都在D-SRAM, size 0x28000大小也是跟datasheet上160k是一致的,
也就是D-SRAM编译后全部都分配给了.heap堆

怎么计算剩余的内存呢?

计算可用度内存, 由于芯片有三个RAM:  I_SRAM,D_SRAM,I-cache,
.data .bss .stack 编译后,都被分布在I_SRAM区域,
D_SRAM编译后,全部分给了堆.heap
I-cache在boot启动后, 是存放.txt也就是flash读来的代码, 用于运行程序,

相关地址和size大小,定义在文件:

RDA5981C.sct中,

 

#define RDA_ROM_BASE          (0x00000000) 

#define RDA_IRAM_BASE         (0x00100000)  //对应上图的IRAM的起始地址

#define RDA_IRAM_SIZE         (0x00020000) //芯片内I_SRAM总共大小:128K

#define RDA_DRAM_BASE         (0x00180000) //对应上图的DRAM的起始地址

#define RDA_DRAM_SIZE         (0x00028000) //芯片内D_SRAM总共大小:98K

#define RDA_PSRAM_BASE        (0x10000000) //无外挂PRSAM芯片,此处无用

#define RDA_FLASH_BASE        (0x14000000) //FLASH起始地址

#define RDA_ICACHE_BASE       (0x18000000) //I-cache地址,

总共内存也就是I_SRAM: 128K -> 0x20000, D_SRAM:160K ->0x28000(5981C),而I-cache,未公开未知,也未开放给用户使用,

已经使用的I_SRAM, 在编译结束界面,会有显示:


Allocated Stack: 2048 bytes
Total Static RAM memory (data + bss): 94568 bytes
如上, 也就是stack+data+bss, 你所剩内存也就是 128k-2k-94k=32K,

至于你D_SRAM 也就是heap还剩多少可以使用,
我编写了一个测试代码,用malloc函数来测试分配内存是否成功, 如下: 
    unsigned int i;
    unsigned char *buf;
    
    printf("Start malloc test...\r\n");

    for(i=0;i<100000;i++)
    {
            
            printf("ready to malloc size=%d...\r\n",i*1000);
            buf = (unsigned char *)malloc(i*1000); //heap堆,就是需要malloc函数来申请内存
            printf("buf=%x...\r\n",buf);
            if(!buf)  //如果从heap分配内存失败,退出
                break;
            free(buf); 
    }
    printf("all malloc finish\r\n");

我这边打印的log为:
[20200319-11:44:40]ready to malloc size=128000...
[20200319-11:44:40]buf=180410...
[20200319-11:44:40]ready to malloc size=129000...
[20200319-11:44:40]buf=180410...
[20200319-11:44:40]ready to malloc size=130000...
[20200319-11:44:40]buf=180410...
[20200319-11:44:40]ready to malloc size=131000...
[20200319-11:44:40]buf=0...
[20200319-11:44:40]all malloc finish

也就是heap剩下可用空间为131k,
你的剩下可用空间就是 32K +131K, =163K,

这里提到的.bss, .data, .txt, .stack, .heap的概念,
我在网上搜索了一个资料,供大家理解学习:

bss段:

BSS段(bsssegment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文BlockStarted by Symbol的简称。BSS段属于静态内存分配。

data段:

数据段(datasegment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。

text段:

代码段(codesegment/textsegment)通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读,某些架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。

rodata段:

存放C中的字符串和#define定义的常量

heap堆:

堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)

stack栈:

是用户存放程序临时创建的局部变量,也就是说我们函数括弧“{}”中定义的变量(但不包括static声明的变量,static意味着在数据段中存放变量)。除此以外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。由于栈的先进先出特点,所以栈特别方便用来保存/恢复调用现场。从这个意义上讲,我们可以把堆栈看成一个寄存、交换临时数据的内存区。

   1: //main.cpp

   2:  int a = 0;     //a在全局已初始化数据区.data

   3:  char *p1;        //p1在.bss(未初始化全局变量)

   4: main()

   5: {

   6:     int b;            //b在栈区 .stack

   7:     char s[] = "abc"; //s为数组变量,存储在栈区,.heap

   8:                       //"abc"为字符串常量,存储在已初始化数据区

   9:     char *p1,p2;     //p1,p2在栈区

  10:     char *p3 = "123456"; //123456\0在已初始化数据区,p3在stack栈区

  11:     static int c =0;    //C为全局(静态)数据,存在于已初始化数据data区

  12:                         //另外,静态数据会自动初始化

  13:     p1 = (char *)malloc(10);//分配得来的10个字节的区域在堆heap区

  14:     p2 = (char *)malloc(20);//分配得来的20个字节的区域在堆heap区

  15:     //注意p1,p2是局部变量,所以存储在栈stack中,10Byte空间在堆heap中;

  16:     free(p1);

  17:     free(p2);

  18: }

 


http://chatgpt.dhexx.cn/article/nrkQEpOr.shtml

相关文章

RDA5981开发环境搭建

最近有商家在卖带有CC2530 Zigbee模块的板子&#xff08;电子垃圾&#xff09;&#xff0c;我对Zigbee还不是特别感冒&#xff08;没时间研究&#xff09;&#xff0c;倒是看中了同一个板子上的RDA5981模块。我这个人有个特点&#xff0c;没有研究明白的东西&#xff0c;不会轻…

Apache添加PHP模块重启apache服务报错

根据网上教程&#xff0c;在Apache中添加php模块&#xff1a; LoadModule php7_module C:\Program Files\php\php-7.3.4-Win32-VC15-x64\php7apache2_4.dll AddType application/x-httpd-php .php LoadModule php7_module modules/libphp7.so PHPIniDir C:\Program Files\php\…

linux上apache目录在哪,Linux下Apache目录明细

与Apache服务器相关的重要目录和文件如下&#xff1a; /etc/httpd/是Apache服务器的根目录 /etc/httpd/conf/httpd.conf是Apache服务器的主配置文件&#xff0c;其中包含指定文档root的配置 /var/www/html/是Apache服务器的文档根目录 /etc/init.d/httpd是Apache服务器启动脚本…

windows下apache简单配置php解释器

目录 1. apache部署 1.1. 下载安装包 1.2 安装 1.3 文件配置 1.4 进入cmd&#xff0c;执行httpd -k install -n apache 1.5 服务启动 1.6 服务验证 1.7 apache服务搭建至此结束。 2. php环境部署 2.1 php包下载 2.2 添加环境变量 3. apache下加载php解释器 3.1 编写…

宝塔面板定时重启apache、mysql、php5.6等Shell命令

定时重启apache service httpd restart 定时重启mysql service mysqld restart 定时重启php5.6 service php-fpm-56 restart 定时重启php5.7 service php-fpm-72 restart 还有一种定时重启php5.6的方法 /etc/init.d/php-fpm-56 restart 停止推送 php /www/wwwroot/y…

linux环境下,重启Apache服务httpd出现以下错误

重点查看红线圈出的错误信息 之后修改配置/etc/httpd/conf/httpd.conf未见&#xff0c;由错误信息已知是文件的355行组织了它重启&#xff0c;所以只需将其注释掉或者删掉即可。 保存文件 重新启动即可

重启apache下php,怎么重启apache

怎么重启apache&#xff1f; windows下重启Apache ● 首先右击“此电脑”&#xff0c;点击“管理”&#xff1b; ● 在打开的“计算机管理”程序中&#xff0c;双击“服务和应用程序”。 ● 在打开的“计算机管理”程序中&#xff0c;双击“服务”。 ● 在所有的服务列表中&…

安装、启动与停止Apache服务

安装、启动与停止Apache服务 安装Apache相关软件 [rootcentos7 ~]# rpm -q httpd [rootcentos7-1 ~]# mkdir /opt/centos //创建目录/opt/centos [rootcentos7-1 ~]# mount /dev/cdrom /opt/centos //挂载光盘到/opt/centos 下 mount: /dev/sr0 写保护…

Ansys里不同材料属性按照不同颜色显示出来

在plotctrls里面&#xff0c;有numbers的设置&#xff0c;按照材料或者实常数可以将不同部位编号。 编好号之后&#xff0c;就可以对所选的构件染色了 希望有所帮助。

AD生成BOM表_材料清单 (Bill of Material)

打开Altium Designer软件&#xff0c;然后在原理图界面&#xff08;XXX.SchDoc&#xff09;,选择 Reports&#xff08;报告&#xff09;>> Bill of Materials(材料清单)。 显示如下界面&#xff1a; 选择所需要的BOM表表头&#xff0c;BOM表头_comment_Description_desi…

SAP HUM 如何将HU里的物料号换成另外一个物料号?

SAP HUM 如何将HU里的物料号换成另外一个物料号&#xff1f; 比如HU 183221204047&#xff0c;里面的物料号是10000191, 业务因故包错了物料号&#xff0c;希望在继续使用HU号码的前提下将物料号由10000191替换成10000192. 这意味着&#xff0c;需要将该HU拆掉&#xff0c;然后…

NetSuite关于客户料号的管理

NetSuite关于客户料号的管理 NetSuite关于客户料号的管理解决方案步骤 NetSuite关于客户料号的管理 NetSuite中有成熟的解决方案处理客户料号与系统物料编码对应的问题。主要需要安装bundle&#xff0c; ID为47193。 安装Bundle后&#xff0c;可以分配客户的料号与系统中物料…

批次号/订单号生成

概述 在系统内部或与其他系统进行对接对编码有一定自定义规则&#xff0c;包括批次号、订单号&#xff0c;比如 PCH20170727152245000001 编码规范 开头字母 年月日时分秒 序号 &#xff0c;使用存储过程和不使用存储过程两种方式&#xff0c;数据都是存在 mysql 数据库中。…

SAP消耗性物料采购前台操作及后台配置

提示&#xff1a;本人工作之余的学习记录&#xff0c;仅供参考 文章目录 前言 企业里除了库存物料采购外&#xff0c;经常存在非库存物料的采购&#xff0c;由于零星小物件比较多&#xff0c;例如中性笔、文件夹、一次性纸杯、A4纸等办公用品&#xff0c;创建物料&#xff0c;…

一、T100之料件管理

T100之料件管理 一、料件集团数据和据点级数据的区别二、料件基础资料设置2.1 料件分群(先要建好分群&#xff0c;基础资料中要用到)2.2 企业层次参数设置aoos0102.3 据点级数据集团控制设置作业(aooi090)2.4 aooi2502.5 aooi2602.6 aimi010(产品分类码维护作业)2.7 aimi1502.8…

SAP PP 笔记(二)物料

Organizational levels for the material master record and Organization structures&#xff1a;物料主档的组织架构&#xff0c;建立这个料号有哪些层次&#xff0c;比如有集团、工厂、仓位这个层次&#xff0c;也可能有销售区域层次等Material type - industry sector&…

数据库原理与技术 作业及答案 复习用

目录 第一章 绪论 作业第二章 关系数据库 作业第3章 关系数据库标准语言SQL 作业1第3章 关系数据库标准语言SQL 作业2第3章 关系数据库标准语言SQL 作业3⭐第4章 数据库安全性 作业⭐SQL 综合练习⭐第6章 关系数据理论 作业 新⭐第7章 数据库设计 作业 新⭐HBase作业 新 第一章…

金蝶新建生产领料单,单据编号不能自动填写

今天接到分厂电话&#xff0c;生产领料单新建后&#xff0c;单据编号栏为空。过去检查后&#xff0c;确实如此&#xff0c;一番百度后解决&#xff0c;记录如下&#xff1a; 进入K3后&#xff0c;点击系统设置---系统设置---仓储管理---单据类型 &#xff0c;双击打开&#xf…

SAP中客户来料加工流程评测

客户来料加工,即对于加工方来说,生产成品所需要的部分或全部原材料的来源并非自己采购,而是由客户提供。从业务的模式上看,对于加工方有以下几个特点: 1、对于加工方而言,客户提供物料无需做价值管理,只需做数量管理;从现实业务角度可以想象,物料的接收,消耗会增加和…

ERP实施-生产模块-无物料号订单

系统功能&#xff1a;事务代码&#xff1a;CO07-不参考物料代码创建生产订单。 适用场景&#xff1a; 1.返工业务-结算规则对应正常生产订单&#xff1b; 2.工装生产-结算规则对应财务内部订单号或者项目WBS,生产完工后由财务确认是否转固&#xff1b; 3.售后返修-结算到返修销…