<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[【FAQ】全志XR系列 如何统计XRMCU的内存使用情况]]></title><description><![CDATA[<p dir="auto"><strong>问题背景</strong><br />
有客户反馈代码运行奔溃，但始终找不到原因，经排查后发现是剩余RAM不足导致的。客户把所有应用内存直接保存到SRAM中，导致内存不足，跑应用时踩内存导致系统奔溃。</p>
<p dir="auto"><strong>问题描述</strong><br />
因为代码全放在RAM中导致内存不足，跑应用时容易踩内存系统奔溃，但如何统计内存使用情况并优化？</p>
<p dir="auto"><strong>问题分析</strong></p>
<ul>
<li>
<p dir="auto">内存是如何保存到指定位置的？<br />
GCC链接操作是以section作为最小的处理单元，只要一个section中的某个符号被引用，该section就会被加入到可执行程序中去。因此，GCC在编译时可以使用 -ffunction-sections和 -fdata-sections 将每个函数或符号创建为一个sections，其中每个sections名与function或data名保持一致。而在链接阶段， -Wl,–gc-sections 指示链接器去掉不用的section（其中-wl, 表示后面的参数 -gc-sections 传递给链接器），这样就能减少最终的可执行程序的大小了。</p>
</li>
<li>
<p dir="auto">哪些代码可以放在XIP，哪些代码必须放在SRAM？<br />
可以简单记忆为XIP需要初始化，XIP初始化前会调用的代码不用放在XIP，如malloc，rtos的代码。中断的时间要求尽量短，也不要调用XIP的代码。</p>
</li>
</ul>
<p dir="auto"><strong>解决方法</strong><br />
SDK中提供了内存分析工具，以XR806为例，内存分析工具为tools\map_parse_gcc_v3.py，以audio_demo为例，使用方法为：</p>
<pre><code>python map_parse_gcc_v3.py audio_demo.map
</code></pre>
<p dir="auto">稍等片刻在bash中会显示内存统计情况：</p>
<pre><code>=================================
Usage:
  map_parse_version: 1.0.4
  map_parse_gcc.py xxx.map
=================================
Memory Sections:
RAM              0x0000000000201000 0x000000000004b000 xrw
FLASH            0x0000000000400000 0x0000000000800000 xr
PSRAM            0x0000000001400000 0x0000000000000000 xrw
*default*        0x0000000000000000 0xffffffffffffffff
                            MEMORY MAP
|===========================================================================|
| MODULE                                   | RAM      | FLASH    | PSRAM    |
|===========================================================================|
| atomic                                   | 0        | 28       | 0        |
| board                                    | 20       | 14       | 0        |
| board_common                             | 602      | 0        | 0        |
| board_config                             | 1216     | 304      | 0        |
| captureControl_rtos                      | 0        | 467      | 0        |
| card_pcm                                 | 0        | 712      | 0        |
................
................
| sys_monitor                              | 0        | 814      | 0        |
| *fill*                                   | 149      | 1179     | 0        |
|===========================================================================|
| TOTAL (bytes)                            | 95045    | 1032493  | 0        |
| MEM LIMIT                                | 307200   | 8388608  | 0        |
| MEM LEFT                                 | 212155   | 7356115  | 0        |
|===========================================================================|
</code></pre>
<p dir="auto">其中lib打头的一般是.a静态库，其余为.o可执行文件，如果确定该section可以放在xip，修改project\linker_script\gcc\appos.ld，在xip.section添加对应的目标，常用的写法如下：</p>
<pre><code>    .xip :
    {
        . = ALIGN(16);
        __xip_start__ = .;
        *AAA.a: (.text .text.* .rodata .rodata.*)  //某个静态库的text和rodata都存到xip中
        *AAA.a:bbb.o (.text .text.* .rodata .rodata.*) //某个静态库中的某个.o存到xip中
        *AAA.a: (EXCLUDE_FILE (bbb.o) .text) //某个静态库中除了bbb.o的text段，其余放到xip中
        *bbb.*.o (.text .text.* .rodata .rodata.*) //bbb打头的所有.o存进xip中，常用于同一个make，但没有编译出静态库的场合
</code></pre>
]]></description><link>https://bbs.aw-ol.com/topic/1059/faq-全志xr系列-如何统计xrmcu的内存使用情况</link><generator>RSS for Node</generator><lastBuildDate>Tue, 06 Oct 2026 09:23:34 GMT</lastBuildDate><atom:link href="https://bbs.aw-ol.com/topic/1059.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 22 Feb 2022 07:10:47 GMT</pubDate><ttl>60</ttl></channel></rss>